2010-03-10 68 views
1

我有一個通過WM_COPYDATA消息從另一個C++程序接收數據的C++/windows程序。然後它應該使用Sockets/winsock將這個消息發送到用Java編寫的服務器上。客戶端連接到服務器正常,但似乎無法及時發送消息。但是,一旦客戶端關閉,它應該發送的所有消息都會以一個大塊發送。這裏是Java服務器的終端輸出的示例:Winsock只在程序關閉時發送數據

Server Starting up. 
Client Accepted. 
hi from clienttesttesttesttesttesttesttesttesttesttesttesttesttesttest 

的前兩行是由Java服務器輸出時,這些事件發生。最後一行是來自客戶端的消息。客戶端在winsock初始化後立即發送「hi from client」,然後在程序後面的各個點「測試」,因爲它通過WM_COPYDATA消息從另一個C++程序接收數據。

這裏是Java服務器代碼:

BufferedReader in = new BufferedReader(new InputStreamReader(
              clientSocket.getInputStream())); 
String incomingLine; 
while((incomingLine = in.readLine()) != null) 
    System.out.println(incomingLine); 

這裏就是消息被髮送的C++函數:

void sendDataWinsock(char* text){  
    int result = send(ConnectSocket,text,(int)strlen(text),0); 
} 

這裏是其中WM_COPYDATA消息進行處理的WndProc的一部分:

case WM_COPYDATA: 
    sendDataWinsock("test"); 
    break; 

有沒有人知道它爲什麼這樣做?就好像客戶端程序將所有這些消息添加到它應該發送的東西的隊列中,但是太忙而無法立即發送它們,所以只有在程序關閉時才發送它們,而不再需要處理它們Windows消息。或者,我想,這個錯誤實際上可能在Java代碼中 - 我對此很新穎。

回答

1

您正在閱讀服務器上的線路,但您並未發送線路。

這意味着您的服務器坐在那裏,接收數據,但等待從readLine()返回一行文本回到您的程序,這不會發生,因爲沒有發送新行\n。當客戶端退出時,readLine()會返回到目前爲止讀取的數據。

+0

哎呦,我真的應該抓住了。謝謝。 – Oliver 2010-03-10 14:41:20

+0

毫無疑問,這是所有消息合併的原因(接收方),但Nagle算法會在較短時間內延遲寫入(發送方),以便以更少的數據包發送更多數據。 – 2010-03-10 15:01:30

+0

Nagle算法*可能會導致在某些情況下寫入延遲。它不會延遲所有寫入。 – EJP 2010-03-10 23:22:56

相關問題