2010-03-10 3 views
1

У меня есть программа C++/windows, которая получает данные из другой программы C++ через сообщение WM_COPYDATA. Затем предполагается использовать Sockets/winsock для отправки этого сообщения на сервер, написанный на Java. Клиент прекрасно подключается к серверу, но, похоже, он не может своевременно отправлять сообщения. Однако, как только клиент закрыт, все сообщения, которые он должен был отправлять, отправляются в один большой кусок. Ниже приведен пример вывода терминала сервера Java:Winsock только отправка данных при закрытии программы

Server Starting up. 
Client Accepted. 
hi from clienttesttesttesttesttesttesttesttesttesttesttesttesttesttest 

первые две строки выводятся сервером Java, когда эти события происходят. Последняя строка - это сообщения от клиента. Клиент отправляет «привет от клиента» сразу после инициализации winsock, а затем «тестирует» в разных точках позже в программе, поскольку он получает данные из другой программы C++ через сообщения WM_COPYDATA.

Вот код сервера 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); 
} 

А вот раздел WndProc, где обрабатываются сообщения WM_COPYDATA:

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

Кто-нибудь знает, почему это делается? Это как если бы клиентская программа добавляла все эти сообщения в очередь вещей, которые она должна отправлять, но слишком занята, чтобы отправить их немедленно, и поэтому отправляет их только по мере закрытия программы, когда ей больше не нужно обрабатывать Сообщения Windows. Или, я полагаю, ошибка действительно может быть в коде Java - я довольно новичок в этом.

ответ

1

Вы читаете строки на сервере, но вы не отправляете строки.

Это означает, что ваш сервер сидит там, получая данные, но ожидая возвращения строки текста обратно в вашу программу с readLine(), что не происходит, поскольку не выводится новая строка, \n. Когда клиент выходит, readLine() возвращает данные, которые он читал до сих пор.

+0

Ой, я действительно должен был это понять. Благодарю. – Oliver

+0

Это, несомненно, причина того, что все сообщения объединяются (сторона-получатель), но алгоритм Nagle заставит записи задерживаться (сторона-отправитель) на короткое время, чтобы отправлять больше данных за меньшее количество пакетов. –

+0

Алгоритм Нагле * может * заставлять записи задерживаться при определенных обстоятельствах. Это не задерживает все записи. – EJP