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

我对如何在 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))


肥皂起泡泡
浏览 229回答 2
2回答

哆啦的时光机

服务器被阻止从客户端读取数据,即使服务器已经读取了来自客户端的完整请求。客户端被阻止从服务器读取数据。要解决此问题,服务器必须在读取完整请求后停止读取。解决此问题的一种方法是让客户端在客户端完成写入请求后关闭套接字的写入端。这将导致服务器在消息结束时停止读取。这是此修复程序的一行更改:conexao, _ := net.DialTCP("tcp", nil, enderecoTCPServidor)fmt.Println("Conexão Estabelecida")conexao.Write([]byte("Gato de Botas!"))conexao.CloseWrite()&nbsp; &nbsp;// <------- Add this linefmt.Println("Frase enviada")maiuscula, _ := ioutil.ReadAll(conexao)fmt.Println("Maiuscula ",string(maiuscula))我在操场上创建了一个工作示例。解决此问题的另一种方法是向请求添加消息帧,就像在 HTTP 和许多其他协议中一样。帧在消息中对消息结束位置的信息进行编码。这可以是消息长度或指示消息结束的区别字节序列。服务器被修改为读取到消息的末尾,然后响应客户端。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go