Java 无法通过的网络大消息。已更改的事件引发了两次
我有一个服务器在处理Netty。客户端发送一些握手消息,服务器回复。这些都是小消息,没有任何问题 但是,当服务器尝试发送一些大消息(每个131139字节)时,它们似乎已被发送,Java 无法通过的网络大消息。已更改的事件引发了两次,java,netty,Java,Netty,我有一个服务器在处理Netty。客户端发送一些握手消息,服务器回复。这些都是小消息,没有任何问题 但是,当服务器尝试发送一些大消息(每个131139字节)时,它们似乎已被发送,ChannelFuture的issucess()返回true和getCause()返回null。但是,客户端从未获得完整消息,只有第一条消息的第一个4097字节。在4或5条消息之后,netty停止尝试发送新消息 在发送消息之前,我正在阅读频道的iswriteable()(它总是返回true)。仅当ChannelFuture
ChannelFuture
的issucess()
返回true
和getCause()
返回null
。但是,客户端从未获得完整消息,只有第一条消息的第一个4097
字节。在4或5条消息之后,netty停止尝试发送新消息
在发送消息之前,我正在阅读频道的iswriteable()
(它总是返回true
)。仅当ChannelFutureListener
的operationComplete
被触发时,才会尝试下一条消息。消息写入频道后,日志显示“兴趣更改”事件被抛出两次,isWritable
更改为false
,然后立即更改为true
。但是消息从未到达客户机
INFO [New I/O worker #7] (HashSender.java:33) - Attempting send a message: 0
INFO [New I/O worker #7] (HashSender.java:68) - Is channel writable: true
INFO [New I/O worker #7] (FrameLengthPrepender.java:46) - outgoing packet lenght: 131139
INFO [New I/O worker #7] (ClientHandler.java:32) - [id: 0xdbb48b90, /192.168.0.3:60105 => /192.168.0.4:25025] INTEREST_CHANGED
INFO [New I/O worker #7] (ClientHandler.java:33) - Is channel writable: true
INFO [New I/O worker #7] (HashSender.java:16) - Message Successfully sent. Channel isDone: true, success: true, cancelled: false, error: null
INFO [New I/O worker #7] (HashSender.java:33) - Attempting send a message: 1
INFO [New I/O worker #7] (HashSender.java:68) - Is channel writable: true
INFO [New I/O worker #7] (FrameLengthPrepender.java:46) - outgoing packet lenght: 131139
INFO [New I/O worker #7] (ClientHandler.java:32) - [id: 0xdbb48b90, /192.168.0.3:60105 => /192.168.0.4:25025] INTEREST_CHANGED
INFO [New I/O worker #7] (ClientHandler.java:33) - Is channel writable: false
INFO [New I/O worker #7] (ClientHandler.java:32) - [id: 0xdbb48b90, /192.168.0.3:60105 => /192.168.0.4:25025] INTEREST_CHANGED
INFO [New I/O worker #7] (ClientHandler.java:33) - Is channel writable: true
INFO [New I/O worker #7] (HashSender.java:16) - Message Successfully sent. Channel isDone: true, success: true, cancelled: false, error: null
INFO [New I/O worker #7] (HashSender.java:33) - Attempting send a message: 2
INFO [New I/O worker #7] (HashSender.java:68) - Is channel writable: true
INFO [New I/O worker #7] (FrameLengthPrepender.java:46) - outgoing packet lenght: 131139
INFO [New I/O worker #7] (ClientHandler.java:32) - [id: 0xdbb48b90, /192.168.0.3:60105 => /192.168.0.4:25025] INTEREST_CHANGED
INFO [New I/O worker #7] (ClientHandler.java:33) - Is channel writable: false
INFO [New I/O worker #7] (ClientHandler.java:32) - [id: 0xdbb48b90, /192.168.0.3:60105 => /192.168.0.4:25025] INTEREST_CHANGED
INFO [New I/O worker #7] (ClientHandler.java:33) - Is channel writable: true
INFO [New I/O worker #7] (HashSender.java:16) - Message Successfully sent. Channel isDone: true, success: true, cancelled: false, error: null
INFO [New I/O worker #7] (HashSender.java:33) - Attempting send a message: 3
INFO [New I/O worker #7] (HashSender.java:68) - Is channel writable: true
INFO [New I/O worker #7] (FrameLengthPrepender.java:46) - outgoing packet lenght: 131139
INFO [New I/O worker #7] (ClientHandler.java:32) - [id: 0xdbb48b90, /192.168.0.3:60105 => /192.168.0.4:25025] INTEREST_CHANGED
INFO [New I/O worker #7] (ClientHandler.java:33) - Is channel writable: false
INFO [New I/O worker #7] (ClientHandler.java:32) - [id: 0xdbb48b90, /192.168.0.3:60105 => /192.168.0.4:25025] INTEREST_CHANGED
INFO [New I/O worker #7] (ClientHandler.java:33) - Is channel writable: true
INFO [New I/O worker #7] (HashSender.java:16) - Message Successfully sent. Channel isDone: true, success: true, cancelled: false, error: null
INFO [New I/O worker #7] (HashSender.java:33) - Attempting send a message: 4
INFO [New I/O worker #7] (HashSender.java:68) - Is channel writable: true
INFO [New I/O worker #7] (FrameLengthPrepender.java:46) - outgoing packet lenght: 131139
INFO [New I/O worker #7] (ClientHandler.java:32) - [id: 0xdbb48b90, /192.168.0.3:60105 => /192.168.0.4:25025] INTEREST_CHANGED
INFO [New I/O worker #7] (ClientHandler.java:33) - Is channel writable: false
INFO [New I/O worker #7] (ClientHandler.java:32) - [id: 0xdbb48b90, /192.168.0.3:60105 => /192.168.0.4:25025] INTEREST_CHANGED
INFO [New I/O worker #7] (ClientHandler.java:33) - Is channel writable: true
INFO [New I/O worker #7] (HashSender.java:16) - Message Successfully sent. Channel isDone: true, success: true, cancelled: false, error: null
INFO [New I/O worker #7] (HashSender.java:33) - Attempting send a message: 5
INFO [New I/O worker #7] (HashSender.java:68) - Is channel writable: true
INFO [New I/O worker #7] (FrameLengthPrepender.java:46) - outgoing packet lenght: 131139
INFO [New I/O worker #7] (ClientHandler.java:32) - [id: 0xdbb48b90, /192.168.0.3:60105 => /192.168.0.4:25025] INTEREST_CHANGED
INFO [New I/O worker #7] (ClientHandler.java:33) - Is channel writable: false
有人能告诉我为什么这些信息没有通过吗
更新:它实际上是第一条消息的4097字节。我没有计算标记数据包长度的前4个字节。
更新:如果传出数据包长度小于或等于4097字节,则所有操作都会顺利进行。只有当数据包大于4097字节时,Netty才会中断。是4097,不是4096。它响了吗?好的,我的错。问题出在客户端。读取套接字的线程上有一个无限循环,因此传入的数据没有被处理。频道兴趣更改事件无需担心。Netty3.x为每个通道维护一个具有高水位线的内部写入缓冲区。这表示等待刷新到操作系统缓冲区的数据量。如果未完成数据超过此值,则通道设置为不可写。默认值为64K,因此您的大消息会立即触发频道兴趣更改事件。然后,一旦数据被刷新到系统缓冲区,Netty将通道设置为可写。我想这信息已经发出了。你能提供客户的详细信息吗?客户机是用C++编写的。这是一个非常成熟的代码,我正在重新编写服务器(它最初是阻塞的,而不是异步的)。我敢肯定,每当发送大型消息时,客户端只会收到第一条消息的前4093字节。更新:实际上是第一条消息的4097字节。我没有计算标记数据包长度的前4个字节。我又做了一些实验,发现如果输出数据包长度小于或等于4097字节,一切都会顺利进行。只有当数据包大于4097字节时,Netty才会中断。是4097,不是4096。它响了吗?