为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
肥皂起泡泡 2021-08-16 20:20:10
我对如何在 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 和许多其他协议中一样。帧在消息中对消息结束位置的信息进行编码。这可以是消息长度或指示消息结束的区别字节序列。服务器被修改为读取到消息的末尾,然后响应客户端。


查看完整回答
反对 回复 2021-08-16
  • 2 回答
  • 0 关注
  • 228 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信