从java发送消息到c ++,在c ++客户端收到奇怪的东西

时间:2015-02-14 00:07:06

标签: java c++ sockets sendmessage

我已经学习了Java近8个月,并决定学习一些c ++。

我有一个Java服务器,等待客户端连接(C ++客户端)。

当客户端连接时,我在 java 服务器中正在做什么:

  1. 在键盘上输入消息。
  2. 将文本(String)转换为字节。
  3. 将bytearray发送到C ++客户端。
  4. 连接时 C ++ 客户端正在做什么:

    1. 声明一个名为“buff”的char数组。
    2. 从Java服务器接收消息。
    3. 如果接收时没有错误,请打印消息。
    4. Java中的相关代码:

      String message;
              byte[] byteArray = new byte[1024];
      
              while (true) {
                  System.out.println("Enter message: ");
                  message = sc.nextLine();    // Enter message
                  byteArray = message.getBytes("UTF-8");  // Get bytes of message
                  out.write(byteArray);   // Send the Message
              }
      

      C ++中的相关代码:

      std::cout << "Connected!";
      
      while (true)
      {
          char buff[1024];
      
          if (what = recv(u_sock, buff, sizeof(buff), 0) < 0)
          {
              cout << "Error receiving message " << WSAGetLastError() << endl;
          }
          else
          {
              cout << "Message: " << buff << endl;
          }
      }
      

      实际问题: 当我从Java发送字符串“asd”时,我收到C ++中的“asd”,一个笑脸和文本winsock2.0。有时我只是收到上一条消息而不是当前发送的消息。可能是什么问题? 当我尝试从C ++客户端向Java服务器发送消息时,它有效。

2 个答案:

答案 0 :(得分:2)

接收的数据不是以NULL结尾的。要解决这个问题,你应该使用NULL终止它们:

if ((what = recv(u_sock, buff, sizeof(buff)-1, 0)) < 0)
{
    ⋮
}
else
{
    buff[what] = 0;
    cout << buff << endl;
}

答案 1 :(得分:2)

  

我在C ++中收到“asd”,笑脸,文本winsock2.0。

不。那东西已经在缓冲区了。这里的问题是你忽略了recv()返回的长度。您必须使用它来界定您打印的buff的大小,谢天谢地我忘记了如何在C ++流中进行操作。

您还必须将其检查为零,这意味着对等方关闭了连接。在错误和零情况下,除非错误是EAGAIN / EWOULDBLOCK,否则还应关闭套接字并跳出循环。