【发布时间】:2016-08-19 23:22:14
【问题描述】:
我有一个纯粹而简单的 Java Nio Socket Server。使用 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 的技术?
【问题讨论】: