[quote=引用 3 楼 zyb112211 的回复:] 我客户端异常断开之后(比如网络断开),write方法还是会写(线程,隔5秒往客户端写),但是好像是往缓存区写,当客户端连接上来之后(网络恢复),会把之前写的东西一次性发给客户端。 而且当客户端异常断开一段时间之后,通道就会抛出ClosedChannelException 这个错误,关闭的通道。 什么情况下会写不进去呢? 注册OP_WRITE之后是什么操作?是不是还是往客户端写?这不是一样么?
好吧,这是我的理解。 你调用写,可以调用,但是不见得可以写进去,假设你用非阻塞写,你可能只能写一部分甚至没有写进任何数据。能写多少数据受内核缓冲区的影响,必须等缓冲区原有数据已经被发出去了后,你要写的数据才能被填进缓冲区,也就是才能被写入。 所以,如果你只写了一部分数据进去,那什么时候还能再调用写呢?你可以不停的retry,直到写完,这样会浪费CPU周期,更好的解决方法就是注册OP_WRITE让内核告诉你,可以写数据了。
我客户端异常断开之后(比如网络断开),write方法还是会写(线程,隔5秒往客户端写),但是好像是往缓存区写,当客户端连接上来之后(网络恢复),会把之前写的东西一次性发给客户端。 而且当客户端异常断开一段时间之后,通道就会抛出ClosedChannelException 这个错误,关闭的通道。 什么情况下会写不进去呢? 注册OP_WRITE之后是什么操作?是不是还是往客户端写?这不是一样么?
67,513
社区成员
225,878
社区内容
加载中
试试用AI创作助手写篇文章吧