java - 从 ByteBuffer 解析多个 JSON

标签 java android sockets

我有纯粹而简单的 Java Nio 套接字服务器。使用 JSON 实现的数据传输。使用 1 个客户端时一切正常,但是当我尝试开始工作负载测试时 - 出现了一些问题。这是我解析传入的 ByteBuffer 的方法(MessageFromBuffer 只是 byte[] 的包装器):

private JSONObject parseIncomingMessageToJson(MessageFromBuffer messageFromBuffer) {
        int size = messageFromBuffer.getSize();
        byte[] data = messageFromBuffer.getData();

        byte[] dataCopy = new byte[size];
        System.arraycopy(data, 0, dataCopy, 0, size);

        JSONParser jsonParser = new JSONParser();
        JSONObject jsonMessage = null;

        try {
            jsonMessage = (JSONObject) jsonParser.parse(new String(dataCopy));
        } catch (ParseException pe) {
            System.out.println("Error formatting incoming message to json:  " + new String(messageFromBuffer.getData()));
        }

        return jsonMessage;
    }

当缓冲区只包含一个 json 实体时 - 一切正常。但是在 100 个客户端攻击期间,缓冲区可以填充多个 json 实体,如图所示(所有测试客户端发送相同的数据):

Error formatting incoming message to json:  {"TYPE":"REGISTRATION","LOGIN":"Padre","PASSWORD":"3214"}
{"TYPE":"REGISTRATION","LOGIN":"Padre","PASSWORD":"3214"}
{"TYPE":"REGISTRATION","LOGIN":"Padre","PASSWORD":"3214"}
{"TYPE":"REGISTRATION","LOGIN":"Padre","PASSWORD":"3214"}
{"TYPE":"REGISTRATION","LOGIN":"Padre","PASSWORD":"3214"}
{"TYPE":"REGISTRATION","LOGIN":"Padre","PASSWORD":"3214"}
{"TYPE":"REGISTRATION","LOGIN":"Padre","PASSWORD":"3214"}
{"TYPE":"REGISTRATION","LOGIN":"Padre","PASSWORD":"3214"}
{"TYPE":"REGISTRATION","LOGIN":"Padre","PASSWORD":"3214"}

方法抛出异常并没有返回。每次从 SOcketChanel 读取后,我都会清除缓冲区 - 所以所有这些消息都丢失了。在这种情况下是否有一些技术可以正确解析 JSON?

最佳答案

根据您发布的内容,它看起来类似于 this因为输出是用下一行字符分隔的。您可以利用它将字符串拆分为一系列序列化的 json 响应。

然后您可以将它们单独解析为 json 对象。

关于java - 从 ByteBuffer 解析多个 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36859711/

相关文章:

php - 从三个表中检查电子邮件是否存在

java - Android 蓝牙连接 - 服务发现失败

javascript - 如何将 socket.io 消息发送到 mongodb

android - 智能手机加速度计手势算法

java - JComboBox 仅显示数据库中的一项

java - 如何设置某件事在一定时间后发生?

java - 为什么 HashMap 快速失败只是因为它提供了一种迭代其键的方法?

android - 如何将 Android Studio .AAR 文件发布到本地 Artifactory 存储库

C# MySql 错误 : An established connection was aborted by the software in your host machine

java - 如何在 Ubuntu 上使用 Mina 增加可用套接字?