【问题标题】:Reading json string from socket从套接字读取 json 字符串
【发布时间】:2012-10-22 23:27:58
【问题描述】:

我有 java 服务器,我正在编写服务器从客户端读取命令,

C#编写的客户端通过socket以json字符串的形式发送命令。 命令看起来像这样

{
 "command": "blah",
 "key1": "value1",
 "key2": "value3",
 "key3": "value4",
}

json 字符串每次可能有不同数量的 key-val 对,因此没有静态计数来衡量 json 命令中的行数。

这是 C# 客户端如何将 json 字符串发送到 java 服务器

        String json = JsonConvert.SerializeObject(map, Formatting.Indented);            
        streamWriter.WriteLine(json);
        streamWriter.Flush();

我想在用android编写的java代码中读取json。它看起来如下所示,它可以正确读取 json 行,但在读取 json 命令的最后一行后会阻塞我不确定知道该命令已结束的体面方法是什么..

        serverSocket = new ServerSocket(4444);   
        clientSocket = serverSocket.accept();
        InputStream inStream = clientSocket.getInputStream();           
        InputStreamReader inStreamReader = new InputStreamReader(inStream);          
        BufferedReader buffReader = new BufferedReader(inStreamReader );    

        String input = "";                        

        while((input = buffReader.readLine())!= null)
        {
            command += input;                     
        }

             //Does not get to this point, blocks above on the readLine after reading full json..

        JSONObject jsObj = new JSONObject(input);
        Object ovj = jsObj.get("command");  

我知道我可以在发送 json 之前发送行数并在 while 循环中读取多次?但这看起来像一个肮脏的解决方案,请告知正确的方法。

谢谢, 艾哈迈德

【问题讨论】:

  • readLine 给了我一行(部分)json,例如 { for first readLine ..
  • 是的,你是对的,就是这样.. Formatting.Indented 是问题所在。谢谢。如果您发布一个,我会接受它作为答案

标签: c# java sockets


【解决方案1】:

如果你删除Formatting.Indented,每个buffReader.readLine() 都会返回一个不同的(完整的)json。将反序列化代码移到 while 循环中。

【讨论】:

  • 谢谢,为我工作 :) 作为一个附带问题,如果我有多行命令,完整阅读它的最佳方式是什么?
  • @Ahmed 更好,不要使用多行命令。将所有命令放在一个 json 对象中(可能是一个命令数组)
  • 如果您必须处理多行 JSON,您可以计算每个 { 和 -- 每个 } 的大括号 ++,如果您的计数为 0 并且您实际上有数据,那么您有一个完整的消息.
  • @OmarKooheji 在一般情况下,仅计算 大括号 是不够的。它可以是一个 json 数组,例如 [{...}{...}\n]
猜你喜欢
  • 2015-03-07
  • 1970-01-01
  • 2022-01-20
  • 2020-11-01
  • 2015-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-05
相关资源
最近更新 更多