Golang Go语言 net write 问题

发布于 1周前 作者 yuanlaile 来自 Go语言

golang 新手,最近准备用 go 实现一个网络通信的框架,看了一下 demo 发现, 服务端启动好端口后, 一般都会启动一个协程负责写,比如如果想给客户端主动发一个消息,通常会先发给这个客户端链接的 channel 里,然后通过负责写的协程把消息读出来在调用 conn 的 write ,很多都是这种生产消费的模式。难道直接找到这个链接调用 write 不行吗, 还是有什么性能问题?


Golang Go语言 net write 问题
5 回复

为了高并发

更多关于Golang Go语言 net write 问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


标准库的 net.Conn 底层是异步 io ,但提供给应用层的读、写都是阻塞接口。
1. 对于读:如果不使用一个协程循环读,它目前也没有提供事件回调机制通知用户数据到来,所以用户不知道什么时候可读,所以就循环等待读、读到了就处理。
2. 对于写:如果涉及广播、或者不允许写阻塞免得业务被卡住,那么也得自己封装异步写的机制

自己写也可以,但既然对读写还有疑问,估计 OP 要摸索很久才能做完善。
想省力的话可以直接用我的:
https://github.com/lesismal/arpc
https://github.com/lesismal/nbio

当然可以直接写。串行从网络连接读取数据,并行处理业务逻辑,业务协程里面可以直接写,不会阻塞读。

你说的那应该是抽象拆分带来的问题,本来就应该直接写的。

针对您提到的Golang中net包写入(write)问题,这里有几个可能的考虑点和解决方案,希望能帮助到您。

在Go语言中,使用net包进行网络编程时,写入数据通常涉及net.Conn接口的Write方法。如果遇到写入问题,可能的原因包括但不限于:

  1. 连接未建立或已关闭:确保在调用Write方法前,连接已经成功建立且未被关闭。可以使用net.Dial等方法创建连接,并检查连接的错误返回。

  2. 写入缓冲区已满net.Conn内部可能有写入缓冲区,当缓冲区满时,Write操作会阻塞。可以通过非阻塞I/O或设置超时来处理这种情况。

  3. 数据格式问题:确保写入的数据格式符合协议要求,例如TCP/IP通信中可能需要遵循特定的帧格式。

  4. 错误处理Write方法会返回一个错误值,务必检查并处理这个错误。常见的错误包括网络中断、连接被对方重置等。

  5. 资源限制:系统资源限制(如文件描述符数量、内存限制)也可能影响网络写入。

解决建议:

  • 仔细检查并处理Write方法返回的错误。
  • 使用Go的select语句或goroutine来管理非阻塞I/O。
  • 设置合理的读写超时,避免长时间阻塞。
  • 监控和调试网络活动,使用工具如tcpdumpWireshark等分析网络数据包。

希望这些建议能帮助您解决Golang中net包写入的问题。如果问题依然存在,建议提供更详细的错误信息和代码片段以便进一步分析。

回到顶部