所以我想在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;
}
}
答案 0 :(得分:0)
由于你的char“缓冲区”在C ++服务器上的recv()之后显示了奇怪的字符,在我看来问题应该是由于Java客户端和C ++服务器之间的字符编码不匹配。要验证您是否可以检查C ++服务器上recv()返回的“numbytes”,它应该大于Java客户端上JSON字符串中的字符数。
答案 1 :(得分:0)
您正在发送JSON长度的低8字节,但您在接收器上从不对此做任何事情。无论如何,这几乎肯定是一个错误。你不应该发送长度。 JSON是自我描述的。