要实现功能是获得两个相机的数据帧然后发送到接收端,实现实时观看
发送端代码                   
newSocket.Send(BitConverter.GetBytes(buffer.Length));//发送文件长度
newSocket.Send(totalbuffer); //发送第一个相机的图像帧
newSocket.Send(BitConverter.GetBytes(siltotalbuffer.Length)); //发送文件长度
newSocket.Send(siltotalbuffer);//发送第二个相机的图像帧
接收端
byte[] bufferSize = new byte[8];
byte[] silbufferSize = new byte[8];
int byteCount = socket.Receive(bufferSize);//接受第一个文件大小
long length = BitConverter.ToInt64(bufferSize, 0);
byte[] totalbuffer = new byte[length];
socket.Receive(totalbuffer); //接受第一个文件到byte数组
int silbyteCount = socket.Receive(silbufferSize);//接受第二个文件大小
long sillength = BitConverter.ToInt64(silbufferSize, 0);
byte[] siltotalbuffer = new byte[sillength];
socket.Receive(siltotalbuffer);//接受第二个文件到byte数组
都是在while(true)循环里面,可是接收到的数据很多时候不对,比如文件大小经常大的离谱,请问哪位知道是哪的问题?

解决方案 »

  1.   

    你这种用法不对。网络通信是一种分组交换技术,使用socket发送数据时,底层会自动把数据划分成许多个小的分组,这些分组在网络中传输时会自动寻找最佳路传递到接收端,因此每个分组不会按照顺序到达接收端,但每个分组都包含附加信息能够在接收端组合成一个与发送端相同的数据块。不同的数据块也会出现先发后到的情况,所以你在接收端还按照发送端的顺序处理这些数据就会发生你现在这样的问题。解决方法:1、一个一个文件地发送,当确认第一个文件已经传送到接收端之后再发送第二个,接收端按照字节数据判断是文件还是长度数据。
    2、把长度数据直接添加在文件的前面整体发送,可能接收到文件的次序不同,但不会发生错误。
      

  2.   

    那如果先把服务器文件大小发过去,然后服务器如何知道客户端已经接收到这个文件大小呢?是在客户端send一个特定的符号过去,还是什么方法?
      

  3.   

    这种说法是完全错误。无论你是采用tcp通信还是udp通信。第一个发出去的总是第一个到达。楼主写的方法没有问题。可能里面有些bug。
    比如检查buffer.Length是不是long型的。byteCount是不是和你定义的数组大小一样。
    length 是不是和你的那个数组大小一至。
      

  4.   

    同意。你确定 buffer.length 是Int64 吗?