如何通过 java 套接字发送 Json 对象?

Posted

技术标签:

【中文标题】如何通过 java 套接字发送 Json 对象?【英文标题】:How to send Json object through java sockets? 【发布时间】:2014-03-24 02:53:14 【问题描述】:

如何通过 Java 中的 ObjectOutputStream 类通过套接字发送 Json 对象,这就是我目前所得到的

    s = new Socket("192.168.0.100", 7777);
    ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream());
    JSONObject object = new JSONObject();
    object.put("type", "CONNECT");
    out.writeObject(object);

但这对 java.io.streamcorruptedexception 异常有什么建议吗?

【问题讨论】:

您不认为这与您得到的哪个异常有关吗? @FelixKling 抱歉忘记更新了问题 如果使用原生 Java 序列化,为什么还要使用 JSON。为什么不直接发送 Java 对象?你说的是哪个 JSONOnject 类? 【参考方案1】:

您应该创建一个OutputStreamWriter,而不是使用ObjectOutputStream,然后使用它将JSON 文本 写入流。您需要选择一种编码 - 我建议使用 UTF-8。比如:

JSONObject json = new JSONObject();
json.put("type", "CONNECT");
Socket s = new Socket("192.168.0.100", 7777);
try (OutputStreamWriter out = new OutputStreamWriter(
        s.getOutputStream(), StandardCharsets.UTF_8)) 
    out.write(json.toString());

【讨论】:

感谢StandardCharsets的指针;我不会遇到常量(恕我直言,它位于一个愚蠢的位置)。 UTF8 是 JSON 的 only 字节编码。任何其他编码,它不是合法的 JSON。 @HotLicks:很有趣 - 这是在哪里定义的,仅供我将来参考? @HotLicks:这并不意味着这些 un​​icode 代码点必须编码为 UTF8。 UTF8 是将 unicode 代码点转换为字节的众多方法之一。例如,您也可以使用 UTF16 或 UTF32。编码不是传输协议的属性(大多数时候是 HTTP)吗? @Daniel:为什么要以 Java 特定的二进制序列化格式包装一个很好的可移植格式 (JSON)?

以上是关于如何通过 java 套接字发送 Json 对象?的主要内容,如果未能解决你的问题,请参考以下文章

在actionscript服务器和java客户端之间通过socket发送对象

如何在java中使用套接字发送/接收对象[重复]

通过套接字流发送对象

C++ 如何通过套接字发送对象?

如何通过 Java 中的套接字编程将发布数据(包含 2 个参数)发送到 https 服务器

如何在 django 频道中从消费者类外部发送普通 JSON 消息