Java TCP套接字未正确接收

Premt

嗨,让我直接解决这个问题。客户端通过身份验证后,服务器会向该客户端发送一个大的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();
            }
        }
    }

谢谢,祝你有美好的一天。

大卫·施瓦兹(David Schwartz)

嗨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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Java TCP 连接套接字未写入输出流

来自分类Dev

Java多线程TCP套接字-从客户端接收消息,直到它们断开连接

来自分类Dev

Android Java:通过套接字接收图像

来自分类Dev

Java套接字不发送/接收消息

来自分类Dev

Java Tcp套接字发送额外的数据?

来自分类Dev

通过套接字的Java TCP通信

来自分类Dev

从线程中的Java TCP套接字读取

来自分类Dev

TCP 套接字通信 Java - Python

来自分类Dev

套接字编程-recv()未正确接收数据

来自分类Dev

Java通过套接字发送和接收文件

来自分类Dev

如何使用Java中的套接字发送/接收对象

来自分类Dev

使用Java通过套接字接收python json

来自分类Dev

如何在Java套接字编程中接收对象?

来自分类Dev

通过套接字Android / Java接收文件时出错

来自分类Dev

套接字Java不能接收太多数据

来自分类Dev

Java套接字将发送但未接收到响应

来自分类Dev

接收流后关闭套接字连接-Java

来自分类Dev

Java .jar文件无法接收套接字消息

来自分类Dev

通过套接字Android / Java接收文件时出错

来自分类Dev

使用Java通过套接字接收python json

来自分类Dev

Android Java套接字写入和接收byte []数据

来自分类Dev

Java 套接字接收的字节数超出预期

来自分类Dev

无法从Java套接字服务器接收数据到C套接字客户端

来自分类Dev

套接字接收数据时,Java套接字中是否有事件?

来自分类Dev

java.net.SocketException:未实现的未连接套接字

来自分类Dev

Java Tcp套接字:如何在客户端上检测到服务器不需要再接收其他数据?

来自分类Dev

在Java中维护TCP套接字的成本有多高

来自分类Dev

是什么导致Java TCP套接字关闭?

来自分类Dev

Java TCP套接字传输大于4GB的文件

Related 相关文章

热门标签

归档