Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法通过的网络大消息。已更改的事件引发了两次_Java_Netty - Fatal编程技术网

Java 无法通过的网络大消息。已更改的事件引发了两次

Java 无法通过的网络大消息。已更改的事件引发了两次,java,netty,Java,Netty,我有一个服务器在处理Netty。客户端发送一些握手消息,服务器回复。这些都是小消息,没有任何问题 但是,当服务器尝试发送一些大消息(每个131139字节)时,它们似乎已被发送,ChannelFuture的issucess()返回true和getCause()返回null。但是,客户端从未获得完整消息,只有第一条消息的第一个4097字节。在4或5条消息之后,netty停止尝试发送新消息 在发送消息之前,我正在阅读频道的iswriteable()(它总是返回true)。仅当ChannelFuture

我有一个服务器在处理Netty。客户端发送一些握手消息,服务器回复。这些都是小消息,没有任何问题

但是,当服务器尝试发送一些大消息(每个131139字节)时,它们似乎已被发送,
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。它响了吗?