byte[] byteMessage = new byte[100];
Socket newSocket = socket.Accept();
newSocket.Receive(byteMessage);服务器端接受传过来的byte数组,但是不知道这个byte数组有多长,请问怎么准确的取到传过的byte数组?

解决方案 »

  1.   

    本帖最后由 bdmh 于 2011-05-31 14:58:15 编辑
      

  2.   

    我给你举几个例子吧:1. 比如XMPP那种,它接收到的字符串流,事实被SAX之类的解析器解析为一个一个数据描述节点。2. 比如msdn那种,它是以换行回车(\r\n)作为一个消息的结束标志。3. 比如http post命令那种,它是以连续两个换行来作为消息头的结束,然后消息体部分再以连续两个换行作为结束。
    总之你要动手自己去设计。
      

  3.   

    谢谢各位,我用了一个循环,不停的接受,把接受的不同长度的byte[]转换并拼成string,直到返回的byte[]长度为零为止
      

  4.   

    这肯定是不对的。我记得你问过这个问题。假设客户端一下子(仅使用一个Send语句)发送2000字节,服务器端的buffer的大小是10KBytes,假设网络质量不是很好的情况下,服务器端完全可能只能接收到1800字节,然后接收缓冲区里就变成0字节了,然后过了一瞬间才继续接收到剩下的200字节。假设客户端并发或者连续发送2000字节、20000字节共两个消息,服务器端的buffer的大小是10KBytes,由于TCP是延迟缓发送的,底层会把数据包组合在一起来发送,所以服务器又可能首先收到10000个字节,然后又收到 11000个字节,第三次又收到1000个字节。所以不指定高层次的设计,只拿网上那种所谓的点对点“通讯”的范例作为编程,是不对的。
      

  5.   

    是不是前面加固定的几个BYTE来表明长度
      

  6.   

     sp1234说的很高深,是不是要用个标识来表示发送过的数据结尾,或者像ericsg说的“前面加固定的几个BYTE来表明长度”,我试验一下加标识的话,会不会和发送过来的数据的某一段重复啊?这样提早结束接受,容易出现错误判断
      

  7.   

    public override int Read(byte[] buffer, int offset, int size)
        System.Net.Sockets.NetworkStream 的成员摘要:
    从 System.Net.Sockets.NetworkStream 读取数据。参数:
    buffer: 类型 System.Byte 的数组,它是内存中用于存储从 System.Net.Sockets.NetworkStream 读取的数据的位置。
    offset: buffer 中开始将数据存储到的位置。
    size: 要从 System.Net.Sockets.NetworkStream 中读取的字节数。返回值:
    从 System.Net.Sockets.NetworkStream 中读取的字节数。