2012-03-20 92 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。爲此,我創建了一個額外的隊列負責寫入客戶端,以便讓服務器繼續其正常工作。