0

所以我想在 Java 客户端和 C++ 服务器之间建立 TCP 连接。将客户端视为输入设备,C++ 服务器应该接收 JSON 对象,解析它们并在游戏中使用它们。似乎连接已成功建立,但是 1)当我尝试解析 json 对象(我正在使用nlohmann 的 json )时出现错误(“parse error-unexpected ''” )和 2)当我不甚至调用 doStuff aka 只是打印出缓冲区,只打印奇怪的字符(例如)。

我假设我在发送/接收数据时搞砸了(这是我第一次使用 C++),但我已经失去了两天,真的想不通!

在 Java 客户端中,我有:

private void connect() {
    try {
        hostname = conn.getHostname();
        portnumber = conn.getPortNr();
        socket = new Socket(hostname, portnumber);
        out = new OutputStreamWriter(socket.getOutputStream());
        in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    } catch (Exception e) {
        e.printStackTrace();
        Log.e(debugString, e.getMessage());
    }
}

public void sendMessage(String json) {
    try {
        //connect();
        out.write(json.length());
        Log.d(debugString, String.valueOf(json.length()));
        out.flush();
        out.write(json);
        out.flush();
        Log.d(debugString, json);

        in.read();
        this.close();
    } catch (Exception e) {
        e.printStackTrace();
        Log.e(debugString, e.getMessage());
    }
}

在 C++ 服务器中:

void Server::startConnection() {

  if (listen(s, 1) != 0) {
      perror("Error on listen");
      exit(EXIT_FAILURE);
  }

  listen(s, 1);

  clilen = sizeof(cli_addr);

  newsockfd = accept(s, (struct sockaddr *) &cli_addr, &clilen);
  if (newsockfd < 0) {
      close(newsockfd);
      perror("Server: ERROR on accept");
      exit(EXIT_FAILURE);
  }
  puts("Connection accepted");

    int numbytes;
    char buffer[MAXDATASIZE];
    while (1)
    {
        numbytes = recv(s,buffer,MAXDATASIZE-1,0);
        buffer[numbytes]='\0';
        //Here's where the weird stuff happens
        //cout << buffer;
        //doStuff(numbytes,buffer);

        if (numbytes==0)
        {
            cout << "Connection closed"<< endl;

            break;
        }
    }
}

bool Server::sendData(char *msg) {

    int len = strlen(msg);
    int bytes_sent = send(s,msg,len,0);
    if (bytes_sent == 0) {
        return false;
    } else {
        return true;
    }
}

void Server::doStuff(int numbytes, char * buf) {
    json jdata;
    try {
      jdata.clear();
      jdata = nlohmann::json::parse(buf);
      if (jdata["type"] == "life") {
        life = jdata["value"];
        puts("json parsed");
      }

    } catch (const std::exception& e) {
      cerr << "Unable to parse json: " << e.what() << std::endl;
    }
}
4

2 回答 2

0

您正在发送 JSON 长度的较低 8 个字节,但您从未在接收器处对其进行任何处理。无论如何,这几乎肯定是一个错误。您不需要发送长度。JSON 是自描述的。

于 2017-08-15T20:15:15.363 回答
0

由于您的字符“缓冲区”在 C++ 服务器上的 recv() 之后显示奇怪的字符,因此在我看来问题应该是由于 Java 客户端和 C++ 服务器之间的字符编码不匹配。为了验证您可以检查 C++ 服务器上 recv() 返回的“numbytes”,它应该大于 Java 客户端上 JSON 字符串中的字符数。

于 2017-08-15T18:59:53.200 回答