使用NetworkStream 来进行接收,但是接收的是多条客户端传送的,没有消息边界,如何去分辨单独的一条数据?

解决方案 »

  1.   


    当你收到消息(按照一块一块buffer来接收),要判断是否达到一条一条消息的结束,然后当达到消息结束的时候,要将已经收到的消息进行解析,解析出一条或者多条消息来。具体来说,类似于using(var dest=new MemoryStream())
    {
        var buffer=new byte[40960];
        int len;
        do{
          len=stream.Read(buffer,0,buffer.length);
          dest.Write(buffer,0,len);
        }while(len>0 && !判断buffer中有效的len个字节是以消息的结束符号结束的(buffer,len))
        var datas=dest.ToArray();
        解析datas得到一条或者多条消息然后执行命令(datas);
    }需要预先执行好协议,说明怎样实现这里的逻辑,才能编码。不写好文档怎么写代码?
      

  2.   

    根据同步还是异步,上述代码有所不同。比如异步,那么也就根本不出现do...while循环,而是类似这样的代码
    private MemoryStream dest=new MemoryStream();void MyCallback(IAsyncResult h)
    {
        var state=(object[])h.AsyncState;
        var stream=(NetworkStream)state[0];
        var buffer=(byte[])state[1];
        var len=stream.EndRead(h);
        dest.Write(buffer,0,len);
        if(判断buffer中有效的len个字节是以消息的结束符号结束的(buffer,len))
        {
            解析datas得到一条或者多条消息然后执行命令(datas);
            dest=new MemoryStream();
        }
        stream.BeginRead(buffer,0,buffer.length,MyCallback,state);
    }
      

  3.   

    另外要说一下,tcp不可能“三个客户端发送数据”沾包问题,是同一个客户端TcpClient连续三次发送消息才沾包。你的问题问的很成问题。我通常只回答你的问题刚好够用的答案,你的问题要提得清醒才能看懂我的答案。
      

  4.   

    多个客户端同时发送也不会数据冲突
    TCP是按套接字来创建管道的
    每个客户端的套接字不一样
    流的管道也不会一样
    也就是每个客户端之间的流通道是隔离的
    楼主你看看你的StreamReader,是不是从socket划TCPClient对象获得的啊
    这不就说明每个客户端的StreamReader不同么