Socket C客户端和Java服务器只能发送一个String

时间:2013-05-05 13:46:48

标签: java c sockets

我的Java服务器发送一个Integer和一个String(到一个C客户端):

   DataOutputStream dos = new DataOutputStream(socket.getOutputStream());

   dos.writeInt(ClientNumber); //send the Integer

   String randomString= getRandomValue(10,20);
   dos.writeUTF(randomString);  //send the String
   String clientString=din.readLine();

正在阅读它们的客户端的C代码是:

if( recv( to_server_socket, &reply, sizeof( reply ), MSG_WAITALL ) != sizeof( reply ) )
    {
        printf( "socket read failed");
        exit( -1 );
    }
char buf[50];
int byte_count;
byte_count = recv(to_server_socket, buf, sizeof buf, 0);
printf("recv()'d %d bytes of data in buf\n", byte_count)

直到这里,它运作良好。

现在,我想向客户端发送另一个字符串。所以,我试着添加一行:

dos.writeUTF("blabla");

它仍在工作,当我试图让客户阅读时,我补充道:

byte_count2 = recv(to_server_socket, buf2, sizeof buf2, 0);
   printf("recv()'d %d bytes of data in buf\n", byte_count2);

它不起作用。客户端接收数字和第一个字符串,但它不发送任何内容,也不接收“blabla”字符串。我不确定问题出在客户端还是服务器上。

任何人都可以向我解释我做错了吗?

2 个答案:

答案 0 :(得分:1)

每次写入后尝试关闭dos(DataOutpuStream)。如果冲洗有帮助,您可以先尝试检查。

答案 1 :(得分:1)

您正在混合您的协议。我建议你使用二进制或文本线格式。目前尚不清楚你要使用哪一个。

我建议使用文本线格式,因为在这种情况下更容易使用。即不要将DataInputStream或DataOutputStream用于二进制格式。

相反,您可以使用BufferedReader读取文本行,使用PrintWriter写入文本行。您可以通过使用telnet连接到服务器来测试您的服务器,即如果它不能与telnet一起使用,它将无法与C一起使用。

一旦这样做,让你的C客户端也能正常工作。顺便说一句你不应该假设一次写入转换为一次读取。您正在编写数据流,而不是消息。