2012-03-20 79 views
1

我构建了一个基于apache mina 2.0.4的tcp服务器,并在写回客户端时遇到了一些问题。Apache Mina - 多次写入客户端

我们有一些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毫秒睡眠,这是难以接受的。 有人看到我做错了什么?

回答

1

在读完tcp协议,特别是https://stackoverflow.com/a/6614586/1280034后,很明显问题出在客户端,而不是正确处理数据包。

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