经过网络收发对象靠不靠谱

   阅读
通过网络收发对象靠不靠谱?
是这样,最近在写一个小程序,一个聊天室,实现的非常简单,服务器是JAVA的,等待socket连接,连接后开一个新线程负责处理相应客户端,并与客户端一直保持连接。规定客户端和服务器之间传递的都是一种对象,对象里面携带一个类别代码和一个子对象,对象需要序列化。在收发数据过程中,有时会出现类转换异常,并且每次描述都不一样。有人说直接收发对象不好,因为TCP协议有可能会分为好几个数据包发,在服务器这边接收可能不全导致的,应该加上一个长度,然后自己写接收的方法。我想问是这样的情况吗?JAVA的SOCKET底层不会处理吗?
------解决思路----------------------
楼主我没用过直接传输对象,用的自定义协议根据长度切分,说下我的想法吧,可以想办法把出现转换异常的地方打印出来或者抓包分析,看下具体收到的是什么数据,用长度切分就是怕有时候TCP传输的时候会造成所谓的粘包和分包,就是两次发的一次收到,一次发的分两次收到,不知道对象传输会不会出现类似情况.
------解决思路----------------------
为啥要用序列化这么低级和效率低的东西呢,可以把对象转化为xml或者json,另外一方重新解析即可。

------解决思路----------------------
自定义协议里面你必写要有一个消息头和消息长度,或者是消息开始和消息结束的标志.

[5字节的开头标记] + [4节字的消息长度] + [消息正文]

[消息开头标记] + [消息正文] + [消息结束标记]

不管你传对象,传XML还是传JSON,在Socket中都是字节.所以都会碰到这个问题.如果区分这个字节属于上个消息还是这个消息.

上面的自定协议就是来规定这件事,你在服务端写解析程序的时候就可以住所这些信息拿到完整的不少字节的消息了.

网络在传送字节时并不是你发一个100字节的东西,对面接收到的就一定是100字节..有可能是先收到40,第二次再收到60.
阅读