首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用C# TcpClient接收基于JSON的协议

使用C# TcpClient接收基于JSON的协议
EN

Stack Overflow用户
提问于 2014-07-21 08:18:24
回答 2查看 4.9K关注 0票数 0

我正在连接一个使用JSON协议进行通信的服务器。它将每一位信息作为JSON对象发送。这里有三个例子。

代码语言:javascript
运行
复制
{"from":"SERVER","code":"SERVER_OK"}
{"from":"SERVER","code":"CHAT_JOIN","data":{"room":"Lobby"}}
{"from":"SERVER","code":"PING","data":{"time":1405901428001}}

我的C#代码如下所示。

代码语言:javascript
运行
复制
  void Start () {
    clientSocket = new TcpClient();
    clientSocket.Connect("127.0.0.1", 5000);
    serverStream = clientSocket.GetStream();
    serverStream.BeginRead(buffer, 0, buffer.Length, ReadComplete, buffer);
  }

  void ReadComplete (IAsyncResult iar) {
    buffer = (byte[])iar.AsyncState;
    int bytesAvailable = serverStream.EndRead(iar);
    string data = System.Text.Encoding.UTF8.GetString(buffer);
    Array.Clear(buffer, 0, 4096);

    serverStream.BeginRead(buffer, 0, buffer.Length, ReadComplete, buffer);

    Debug.Log(data);
  }

我的调试日志如下所示:

代码语言:javascript
运行
复制
{"from":"SERVER","code":"SERVER_OK"}{"from":"SERVER","code":"CHAT_JOIN","data":{"room":"Lobby"}}
{"from":"SERVER","code":"PING","data":{"time":1405901428001}}
{"from":"SERVER","code":"PING","data":{"time":1405901433001}}
{"from":"SERVER","code":"PING","data":{"time":1405901438004}}

看起来我可以在每个ReadComplete中一次接收多个JSON对象。我还假设我也可以接收部分JSON对象。我需要做什么才能一次处理一个JSON对象?我猜我必须将每个接收到的数据块连接成一个字符串,然后将其前面的每个对象一次切掉一个。我就是不知道该怎么做。

EN

Stack Overflow用户

发布于 2014-07-23 15:25:53

最后,我转移到一个Thread中,一次处理一个字节的流,查找JSON对象边界。对于每个on,我尝试解析它,并添加一个供父线程处理的Queue

到目前为止,这似乎没有对我的应用程序的其余部分造成任何线程问题,并且在满足我的需求的整体性能方面一直工作得很好。

代码语言:javascript
运行
复制
  // The network thread listening to the server
  private void NetworkThread () {
    Debug.Log("Connecting to server...");
    clientSocket = new TcpClient();
    clientSocket.Connect("127.0.0.1", 5000);
    stream = clientSocket.GetStream();

    int braces = 0;
    bool inQ = false;
    char lastB = ' ';
    while (!stopThread) {
      char b = (char)stream.ReadByte();
      if (b < 0)
        return;

      buffer.Append((char)b);
      if (b == '"' && lastB != '\\') {
        inQ = !inQ;
      }
      else if (b == '{' && !inQ) {
        braces += 1;
      }
      else if (b == '}' && !inQ) {
        braces -= 1;
      }
      lastB = (char)b;
      if (braces == 0) {
        try {
          JSONNode packet = JSONNode.Parse(buffer.ToString());
          buffer = new StringBuilder();
          lock (lockQueue) {
            packetQueue.Enqueue(packet);
          }
        } catch (Exception e) {
        }
      }
    }
  }
票数 2
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24856181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档