我对如何在 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))
2 回答
哆啦的时光机
TA贡献1779条经验 获得超6个赞
服务器被阻止从客户端读取数据,即使服务器已经读取了来自客户端的完整请求。客户端被阻止从服务器读取数据。要解决此问题,服务器必须在读取完整请求后停止读取。
解决此问题的一种方法是让客户端在客户端完成写入请求后关闭套接字的写入端。这将导致服务器在消息结束时停止读取。这是此修复程序的一行更改:
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))
我在操场上创建了一个工作示例。
解决此问题的另一种方法是向请求添加消息帧,就像在 HTTP 和许多其他协议中一样。帧在消息中对消息结束位置的信息进行编码。这可以是消息长度或指示消息结束的区别字节序列。服务器被修改为读取到消息的末尾,然后响应客户端。
- 2 回答
- 0 关注
- 228 浏览
添加回答
举报
0/150
提交
取消