1

我基于 apache mina 2.0.4 构建了一个 tcp 服务器,并且在写回客户端时遇到了一些问题。

我们有一些 tcp 客户端一次只能处理一条消息,并且缓冲区大小最大为 256 字节。当我向客户端发送 2+ 条消息(< 256 字节)时,它们以客户端无法处理的一两个大块的形式到达,而不是 2+ 条分隔的消息。我尝试设置sessionConfig.setTcpNoDelay(true/false);没有成功,以及sessionConfig.setSendBufferSize( 256 );.

在消息响应编码器中,我还尝试刷新输出:

int capacity = 256;
IoBuffer buffer = IoBuffer.allocate(capacity, false);
buffer.setAutoExpand(false);
buffer.setAutoShrink(true);
buffer.putShort(type);
buffer.putShort(length);
buffer.put(gmtpMsg.getMessage().getBytes());
buffer.flip();
out.write(buffer);
out.flush();

在负责发送消息的线程中,我试图等待消息被写入

for (Entry<Long, OutgoingMessage> outgoingMsg : outgoingMsgs.entrySet()) {
      WriteFuture future = session.write(outgoingMsg.getValue());
      future.awaitUninterruptibly();
}

所有这一切都惨遭失败,唯一可行的解​​决方案是会话写入之间荒谬的 500 毫秒睡眠,这是难以接受的。有人看到我做错了吗?

4

1 回答 1

1

在阅读了更多关于 tcp 协议,特别是https://stackoverflow.com/a/6614586/1280034之后,很明显问题出在客户端,没有正确处理数据包。

由于我们无法重建客户端,我唯一的解决方案是将每条传出消息延迟大约 500 毫秒。为此,我创建了一个额外的队列来负责向客户端写入数据,以便让服务器继续其正常工作。

于 2012-03-21T05:46:40.350 回答