Как правильно анализировать JSON-объекты в TCP-соединении Java + C ++?

Поэтому я хочу иметь TCP-соединение между клиентом Java и сервером C ++. Думайте о клиенте как о устройстве ввода, и сервер C ++ должен получать объекты JSON, анализировать их и использовать их в игре.
Кажется, что соединение установлено успешно, но 1) при попытке разобрать объекты json возникает ошибка («parse error-неожиданно») «(я использую Json Нлохмана) и 2) когда я даже не вызываю doStuff a.k.a, просто распечатываю буфер, печатаются только странные символы (например,).

Я предполагаю, что что-то напутало при отправке / получении данных (это первый раз, когда я использую 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;
}
}

0

Решение

Поскольку ваш «буфер» char показывает странные символы после recv () на сервере C ++, мне кажется, что проблема должна быть связана с несоответствием кодировки символов между клиентом Java и сервером C ++. Чтобы убедиться, что вы можете проверить «numbytes», возвращаемые recv () на сервере C ++, оно должно быть больше, чем количество символов в строке JSON на клиенте Java.

0

Другие решения

Вы отправляете младшие 8 байтов длины JSON, но вы ничего не делаете в приемнике. Это почти наверняка ошибка в любом случае. Вам не нужно отправлять длину. JSON самоописывает.

0

По вопросам рекламы [email protected]