本人最近用C#写了一个客户端,需要和JAVA写的服务器进行通信。通信的做法是和服务器约定好协议,将协议的字符串,转化为比特流,用TCP的socket进行传输,如下:
IPEndPoint iep = new IPEndPoint(xxx,xxx);
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            socket.Connect(iep); 
            string control = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
            byte[] by = System.Text.Encoding.ASCII.GetBytes(control.ToCharArray());
            socket.Send(by, by.Length, SocketFlags.None);
问题出现了:如果我发的control内容比较长,服务器那边接收到的,就是很多段的流,每个最长537!但我这边发送的时候,并没分割成这么多段传送啊!什么原因造成的?如何解决?在线等高手解答!

解决方案 »

  1.   

    高手快来啊!做C/S架构的初级程序员,都可能会遇到这个问题的。是c# 和 java的处理方式不同造成的吗?有解决的办法吗?
      

  2.   

    TCP 协议本身如此, 需要手动重组数据包
      

  3.   

    你可以分包传输,TCP传输原理是这样的,在接收端TCP协议有一个自己的缓冲区,然后自动从缓冲区中取数据,具体大小不记得了,如果你传的足够长的话肯定会超过接收端的TCP协议自带的缓冲区,所以协议本身每次就取自带缓冲区长度的数据,TCP通信常用做法在发送端需要分包发送,定义一个定长的临时BYTE[],每次发一定量的数据,最好不要太大,不要超过64K,分包发送即可
      

  4.   

    ZSW53362465:是这个原因吗?TCP协议自带的缓冲区好像还是比较大的,但服务器接收到的是最长只有537字节,这个也太小了吧!
    乌托邦主·蛤蟆: 我们传输的流并不长啊,也就2,3k的一段流。而且java服务器那端,用java写个测试程序,给服务器发一段2k的流,是可以正常接收的,和我的C#程序就不能正常接收。
    很感谢2位,要是看到的话,再帮我解答下问题。明天结贴散分。