java - 在 Java 中通过套接字传递 JSON 对象数组

标签 java json sockets

我有一个简单的客户端/服务器应用程序,需要通过套接字将一些 JSON 对象(在运行时生成)发送到服务器。

在我的客户端上(用于测试目的): drawList 是 Draw 对象的列表(有 4 个元素)。

Socket client = new Socket(serverName, serverPort);
Gson gson = new Gson();
DataOutputStream out = new DataOutputStream(client.getOutputStream());
for (int i=0; i<drawList.size(); i++){
    out.writeUTF(gson.toJson(drawList.get(i)));
    out.flush();
}
out.close();
client.close();

在服务器端我有:

Socket server = serverSocket.accept();
BufferedReader in = new BufferedReader(new InputStreamReader(server.getInputStream()));
String inputLine;

while((inputLine = in.readLine()) != null){             
    List<Draw> drawList = DrawUtils.getDrawList(inputLine);             
    for (Draw draw : drawList){
        processDraw(draw);
    }
}

遵循 getDrawList 方法

public static List<Draw> getDrawList(String input){
    List<Draw> drawList = new ArrayList<Draw>();
    Gson gson = new Gson();
    JsonParser jParser =  new JsonParser();
    JsonArray jArray = jParser.parse(input).getAsJsonArray();

    for (JsonElement obj : jArray){
        drawList.add(gson.fromJson(obj, Draw.class));
    }
    return drawList;
}

这里有两点:

  1. 即使我在客户端上为每个“绘制对象”刷新输出 channel ,在服务器端我也只能得到一个包含所有对象的大字符串。也许此时我缺少一些套接字概念......

  2. 由于我将所有对象都放在一个字符串中,因此我尝试将其解析为 Json 数组,但出现异常“com.google.gson.JsonSyntaxException: com.google .gson.stream.MalformedJsonException:使用 JsonReader.setLenient(true) 接受格式错误的 JSON”。使用调试器检查了输入字符串,除了一个奇怪的“A”分隔我的对象之外,它似乎没问题。

有什么线索吗? 谢谢!

最佳答案

不要使用writeUTF(),或者根本不要使用DataOutputStream。 writeUTF() 将字符串的长度写入文本值(您注意到的“A”)前面,因此它不适合发送一般文本数据(即 writeUTF() 只能与 readUTF() 一起使用,反之亦然)。

改用new BufferedWriter(new OutputStreamWriter(mySocketOutputStream, "UTF-8")));

关于java - 在 Java 中通过套接字传递 JSON 对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19979420/

相关文章:

java - 如何使用 Java ProcessBuilder 从 CMD 提示符执行 SQL 文件

java - 如何将 Assets 文件夹中的本地 JSON 文件解析为 ListView?

sockets - Linux 上的最大套接字数

C套接字重新连接

java - 在 Java 中使用 Infinity 避免双重类型的最佳方法?

java - 安卓/乱舞 : Unable to instantiate activity component?

javascript - "Azure Mobile Services"和 "Azure App Service"之间的不同 sql 结果

java - 我收到 java.lang.ClassCastException 但我发送的是对象,而不是字符串

java - QuickFIX/J 中断开连接的客户端的消息队列行为

java - Android JSON 解析问题