日期:2014-05-17  浏览次数:21108 次

Socket通讯问题
小弟在做一个基于Socket进行通讯的一个东东,现在遇到一个奇怪的问题
因为这个模块现在有和需要传输文件的功能
所以这块是基于TCP来做的
但是为了方便控制,我传输的每个字节流都是进行了二次封装的,简单的说就是把固定大小的byte数组的数据放到对象里,然后序列化对象再传输。按照理论模式它应该是没什么问题的,但是现在出现了一个奇怪的东东
就是在接受文件的时候,突然间就会出现一个超大的字节流,而且还不是定时的出,遭成了反序列化失败


大家谁能给点建议,小弟在这里谢谢了
------最佳解决方案--------------------
估计是你收到了不符合你要求数据的数据,比如你数据大小为100字节,而你收到120字节,这样你反序列化必然出错,所以你就要指定一个协议,来规范判断接受的数据是否符合你的要求
------其他解决方案--------------------
最主要还是你的协议没定好,你直接传包问题就大了。因为你启动接收时,TCP已经有好几个包可能已经在里面了,你取出来的数据是按你定义的长度,所以问题解决不了。
讲眯我的最简单方法:(有眯卖弄)
【长度】【数据】【检验】   注:长久包括数据+校验=长度
第一次:读长度(这是可以规定的)
第二次:读数据和校验
然后反把校验去掉,剩下数据,然后反系列化就OK了
------其他解决方案--------------------
这个是包大于你的缓冲区的原因造成的。
一般来说tcp除了设置一个较大的缓冲区以为,还要对大于缓冲区的数据缓存拼接处理。
还要处理粘包的问题。就是一次接受了多个数据的包。

所以你得定义包的格式。包头。包长。包尾等。
------其他解决方案--------------------
引用:
就是说可能在某次接收的时候会接收到很多个包?

必须有这个可能,最起码的包头,包长必须有定义
------其他解决方案--------------------
好的,谢谢你了,我先试试。好的话过来结贴
------其他解决方案--------------------
就是说可能在某次接收的时候会接收到很多个包?
------其他解决方案--------------------
那缓冲区,就是我定义的那个byte数组定义多大啊,Socket默认的是8K,不会让我也定义一个8K的byte数据来接收吧。。。。
------其他解决方案--------------------
    发送方调用send(hSocket,buf, 1024)成功,接收方的receive函数不一定是一次收到1024个字节,可能需要调用两次以上才能收到所有1024个字节,比如第一次调用收到500字节,第二次调用收到剩下的512字节。这样,发送序列化后的字节流到了接收方被截断了,反序列化肯定是不会成功的。只有把截断的字节流拼接在一起,它才是完整的。
    我觉得发送文件,读取文件到缓冲区然后直接发送会比楼主的方法更简洁一些。发送时先发送文件名和文件长度,接着发送文件;接收方根据文件名创建文件,然后根据文件长度接收文件内容。

      
  
     
------其他解决方案--------------------
谢谢大家了,根据各位的建议自己修改下,已经拿出暂时的可行性方案了