我正在连接一个使用JSON协议进行通信的服务器。它将每一位信息作为JSON对象发送。这里有三个例子。
{"from":"SERVER","code":"SERVER_OK"}
{"from":"SERVER","code":"CHAT_JOIN","data":{"room":"Lobby"}}
{"from":"SERVER","code":"PING","data":{"time":1405901428001}}我的C#代码如下所示。
  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);
  }我的调试日志如下所示:
{"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对象?我猜我必须将每个接收到的数据块连接成一个字符串,然后将其前面的每个对象一次切掉一个。我就是不知道该怎么做。
发布于 2014-07-23 15:25:53
最后,我转移到一个Thread中,一次处理一个字节的流,查找JSON对象边界。对于每个on,我尝试解析它,并添加一个供父线程处理的Queue。
到目前为止,这似乎没有对我的应用程序的其余部分造成任何线程问题,并且在满足我的需求的整体性能方面一直工作得很好。
  // 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) {
        }
      }
    }
  }发布于 2014-07-21 08:23:32
在手动接收数据时,使用Streamreader及其.ReadLine()方法。看起来服务器是逐行发送的,所以读取响应响应应该不是问题。
https://stackoverflow.com/questions/24856181
复制相似问题