嗨,让我直接解决这个问题。客户端通过身份验证后,服务器会向该客户端发送一个大的JSON数据包
但是数据包以一种奇怪的方式返回,例如被拆分或出现以下示例:
JSON应该是:
Received: {"UserID":1,"PlayerID":2,"EXP":0,"Lvl":1,"Coins":0,"ItemSlots":30}
当它通过:
Received: {"UserID":1,"PlayerID":2,"EXP":0,"Lvl":1,"Coins":0,
Received: "ItemSlots":30}
为什么要拆分数据包或其他东西,我该如何解决?
Java接收代码:
private class ClientThread extends Thread {
public void run() {
try {
while (selector.select() > 0) {
for (SelectionKey sk : selector.selectedKeys()) {
selector.selectedKeys().remove(sk);
if (sk.isReadable()) {
SocketChannel sc = (SocketChannel)sk.channel();
ByteBuffer buff = ByteBuffer.allocate(1024);
String content = "";
while (sc.read(buff) > 0) {
sc.read(buff);
buff.flip();
content += charset.decode(buff);
buff.clear();
}
System.out.println("Recieved: " + content);
sk.interestOps(SelectionKey.OP_READ);
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
谢谢,祝你有美好的一天。
嗨lemme直接解决了这个问题,所以我获得了一个大的JSON数据包,一旦客户端通过身份验证,服务器就会发送到该客户端
您的意思是您有一条很大的JSON消息。数据包是网络协议用来交换信息的事物。
但是数据包以一种奇怪的方式返回,例如拆分或类似的例子:
除非您查看电线,否则您不会查看数据包。您正在查看从TCP连接结束获得的字节数。
JSON应该是:
已接收:{“ UserID”:1,“ PlayerID”:2,“ EXP”:0,“ Lvl”:1,“ Coins”:0,“ ItemSlots”:30}
当它通过:
已接收:{“ UserID”:1,“ PlayerID”:2,“ EXP”:0,“ Lvl”:1,“硬币”:0,已接收:“ ItemSlots”:30}
优秀的。您获得了相同的字节数。现在创建一个JSON解析器,该解析器可以确定消息的结尾并对其进行解析。
为什么要拆分数据包之类的东西?
它将消息拆分为数据包,因为这就是TCP将消息发送到另一端的方式。TCP不是消息协议,它不知道或不在乎应用程序认为什么是消息-这是应用程序的工作。
以及我该如何解决呢?
编写JSON解析器以找出消息的结束位置。您尚未实现任何代码来通过TCP接收JSON,因此直到您这样做才起作用。
TL; DR:如果需要应用程序级别的消息协议,则需要实现一个。TCP不是一个。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句