Netty 版本:4.0.10.Final
我已经使用 Netty 编写了一个客户端和服务器。这是客户端和服务器所做的。
服务器:
- 等待来自客户端的连接
- 接收来自客户端的消息
- 如果消息是错误的,则写入错误消息(6 个字节),刷新它,关闭套接字并且不要读取套接字中的任何未读消息。否则继续阅读消息。对好消息什么都不做。
客户:
- 连接到服务器。
- 写完 N 条好消息后,写一条坏消息,然后继续写 M 条好消息。这个过程发生在一个单独的线程中。该线程在通道处于活动状态后启动。
- 如果服务器有任何响应,请记录并关闭套接字。(请注意,服务器仅在出现错误时才响应)
我已经跟踪了客户端和服务器。我发现服务器在写入错误消息后正在关闭连接。在坏消息之后写好消息时,客户端开始看到损坏的管道错误。这是因为服务器检测到错误消息并以错误消息和关闭套接字进行响应。只有在使用侦听器完成写入操作后才会关闭连接。客户端不总是从服务器读取错误消息。客户端中较早的步骤 (2) 在 I/O 线程中执行。这导致在 K 次实验中收到的错误消息的百分比非常低(<10%)。将步骤 (2) 移至分离线程后,% 变为 (70%)。无论如何,它是不准确的。如果由于管道损坏而导致写入失败,netty 是否会触发通道读取?
更新 1:我正在澄清和回答这里提出的任何问题,所以每个人都可以在一个地方找到提出的问题/澄清。“你正在写一条会导致重置的坏消息,然后是你已经知道不会通过的好消息,并试图阅读可能已被丢弃的回复。这对我来说没有任何意义无论如何”——来自 EJP
-- 在现实世界中,服务器可能会因为客户端无法提前知道的任何原因而将某些事情视为坏事。为简单起见,我说客户端故意发送导致服务器重置的错误消息。即使总消息中有坏消息,我也想发送所有好的消息。
我正在做的类似于Apple Push Notification Service实现的协议。