如何在Java + C ++ TCP连接中正确解析JSON对象?

时间:2017-08-15 17:51:10

标签: java c++ json tcp nlohmann-json

所以我想在Java客户端和C ++服务器之间建立TCP连接。将客户端视为输入设备,C ++服务器应接收JSON对象,解析它们并在游戏中使用它们。 似乎连接已成功建立,但是1)当我尝试解析json对象时出现错误("解析错误 - 意外''")#i&#39 ; m使用nlohmann's json)和2)当我甚至不打电话给doStuff时,只打印出缓冲区,只打印奇怪的字符(例如)。

我认为我在发送/接收数据时搞砸了(这是我第一次使用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;
    }
}

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

您正在发送JSON长度的低8字节,但您在接收器上从不对此做任何事情。无论如何,这几乎肯定是一个错误。你不应该发送长度。 JSON是自我描述的。