Winsock只在程序关闭时发送数据

时间:2010-03-10 14:15:06

标签: java c++ winsock

我有一个c ++ / windows程序,它通过WM_COPYDATA消息从另一个c ++程序接收数据。然后应该使用Sockets / winsock将此消息发送到用Java编写的服务器。客户端连接到服务器很好,但它似乎无法及时发送消息。但是,一旦客户端关闭,它应该发送的所有消息都会被一次性发送。以下是Java服务器的终端输出示例:

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);
}

这是WndProc的一部分,其中处理了WM_COPYDATA消息:

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

有谁知道为什么会这样做?就好像客户端程序将所有这些消息添加到它应该发送的事物的队列中,但是太忙而无法立即发送它们,因此只在程序关闭时才发送它们,当它不再需要处理时Windows消息。或者,我想,错误实际上可能在Java代码中 - 我对此很新。

1 个答案:

答案 0 :(得分:1)

您正在阅读服务器上的行,但您没有发送行。

这意味着您的服务器位于那里,接收数据但等待从readLine()返回一行文本回到您的程序,这不会发生,因为没有新行\n被发送。当客户端退出时,readLine()会返回它到目前为止读取的数据。