TCP conn 上多次写入
积累知识,胜过积蓄金银!毕竟在Golang开发的过程中,会遇到各种各样的问题,往往都是一些细节知识点还没有掌握好而导致的,因此基础知识点的积累是很重要的。下面本文《TCP conn 上多次写入》,就带大家讲解一下知识点,若是你对本文感兴趣,或者是想搞懂其中某个知识点,就请你继续往下看吧~
问题内容我有一个 tcp 服务器:
l, err := net.listen("tcp", "localhost:"+strconv.itoa(tcpport))
服务器按原样侦听传入的客户端请求:
for {
c, err := l.accept()
if err != nil {
log.fatal(err)
}
b := make([]byte, 1024)
c.read(b)
fmt.println(string(b)) // "hello"
}
我有一个客户:
conn, err := net.dial("tcp", 地址)
现在我用 conn.write([]byte("hello"))
写一次
服务器捕获 hello。但如果我有这些:
_, err := conn.write([]byte("hello"))
if err != nil {
log.fatal(err)
}
_, err = conn.write([]byte("world"))
if err != nil {
log.fatal(err)
}
然后我会得到 hello
,但不会得到 world
。
如何在同一个连接上多次写入?
完整功能如下
func main() {
l, err := net.Listen("tcp", "localhost:1234")
if err != nil {
log.Fatal(err)
}
defer l.Close()
go func() {
for {
c, err := l.Accept()
if err != nil {
log.Fatal(err)
}
b := make([]byte, 1024)
c.Read(b)
fmt.Println(string(b))
}
}()
conn, err := net.Dial("tcp", "localhost:1234")
if err != nil {
log.Fatal(err)
}
_, err = conn.Write([]byte("hello"))
if err != nil {
log.Fatal(err)
}
_, err = conn.Write([]byte("world"))
if err != nil {
log.Fatal(err)
}
}
正确答案
您的问题出在服务器代码中,即接收数据的代码中。它只从 tcp 流中读取一次。如果您希望它读取 "world"
,请将单个 read
操作替换为循环:
go func() {
for {
c, err := l.accept()
if err != nil {
log.fatal(err)
}
for {
b := make([]byte, 1024)
c.read(b)
fmt.println(string(b))
}
}
}()
您的问题不在于 conn.write
,而在于从连接读取。现在,您只需从 l.accept()
接受的每个新打开的连接中读取一次。解决办法就是反复阅读。
您的代码也仅限于处理一个连接。并且不要忘记检查 c.read(b)
的错误以了解何时停止侦听此连接。
go func() {
for {
c, err := l.Accept()
if err != nil {
log.Fatal(err)
}
go func(conn net.Conn) {
for {
b := make([]byte, 1024)
_, err := conn.Read(b)
if err != nil {
if err != io.EOF {
fmt.Println("read error:", err)
}
break
}
fmt.Println(string(b))
}
fmt.Println("Stopping handle connection")
}(c)
}
}()
文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《TCP conn 上多次写入》文章吧,也可关注编程网公众号了解相关技术文章。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341