gpt4 book ai didi

go - Go中客户端和服务器之间的通信

转载 作者:IT王子 更新时间:2023-10-29 02:05:51 24 4
gpt4 key购买 nike

我对如何让客户端向服务器发送字符串感到有点困惑,这两个都是在 Go 中。服务器运行时ioutil.ReadAll(conexao) 一切停止。

服务器

    conexao, _ := listener.Accept()

fmt.Printf("Conexão aceita %s\n", conexao.RemoteAddr())

frase, _ := ioutil.ReadAll(conexao)
fmt.Println("Frase recebida")

convertida := strings.ToUpper(string(frase))

conexao.Write([]byte(convertida))

conexao.Close()

客户端

conexao, _ := net.DialTCP("tcp", nil, enderecoTCPServidor)

fmt.Println("Conexão Estabelecida")

conexao.Write([]byte("Gato de Botas!"))
fmt.Println("Frase enviada")

maiuscula, _ := ioutil.ReadAll(conexao)

fmt.Println("Maiuscula ",string(maiuscula))

最佳答案

服务器被阻止从客户端读取数据,即使服务器已经读取了来自客户端的完整请求。客户端被阻止从服务器读取数据。要解决此问题,服务器必须在读取完整请求后停止读取。

解决此问题的一种方法是让客户端在完成写入请求后关闭套接字的写入端。这将导致服务器在消息末尾停止读取。这是此修复的一行更改:

conexao, _ := net.DialTCP("tcp", nil, enderecoTCPServidor)
fmt.Println("Conexão Estabelecida")
conexao.Write([]byte("Gato de Botas!"))
conexao.CloseWrite() // <------- Add this line
fmt.Println("Frase enviada")
maiuscula, _ := ioutil.ReadAll(conexao)
fmt.Println("Maiuscula ",string(maiuscula))

我创建了一个工作 example on the playground .

解决此问题的另一种方法是像在 HTTP 和许多其他协议(protocol)中一样向请求添加消息框架。成帧在有关消息结束位置的消息信息中进行编码。这可以是消息长度或指示消息结束的可区分字节序列。服务器被修改为读取消息的末尾,然后响应客户端。

关于go - Go中客户端和服务器之间的通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26077478/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com