解决方案 »

  1.   

    1、对于你说的错乱和不完整的问题,这指的是采用UDP协议会出现这种问题,你可以采用TCP/IP协议,则不存在这个问题2、如果你的网络环境要求必须采用UDP协议的话,则可以在每个包的前端加入包在整个数据流中的位置信息,对方收到后,回复位置信息,如果超过1秒(根据你的网络环境自行设置)未收到回复,则重新发送。接收方根据接收到的信息进行合成。在网络中传输对象,为啥不用java的rmi,用rmi超级简单,根本什么都不用考虑,当然rmi是基于TCP/IP协议的。
      

  2.   

    首选,要选对底层的传输协议,我们程序中用到的自定义的协议,都属于应用层的协议。
    传输层的协议,现在可以选择 TCP协议,或者UDP协议。
    UDP协议,会存在楼主所说的那些担忧,比如,丢包、先后包次序颠倒等现象。
    TCP协议,相对好些,它正常情况下是不会丢包的、先后顺序也不会颠倒,但是,读取数据的时候,要注意粘包和半包的处理。推荐使用TCP协议作为承载协议来传输数据,因为它是有链接的,可靠的传输协议。应用层协议,可以自己定义协议的数据结构。
    比如:发送数据包的时候,包结构分为 包头、包体和包尾三个部分。三个部分依次进行发送,发送完毕,作为一个包的整个内容。
    包头存放 包体长度、包序列号(用于区分是否是相同的包,每个包,前后逐个加一构成一个序列)、包类型(这个可以没有)。
    包体存放传输的数据(如果包头中没有包类型数据,那么数据区最好有标明数据类型的信息,这样接收端好处理)。
    包尾存放固定长度的校验码(这个可以没有,因为TCP传输数据是可靠的),用于校验数据是否在传输过程中被更改了或传错了。如果校验码不是固定长度的,那么,包头中要添加包尾长度的数据字段。基本上,一般的通讯协议都这么定义数据结构。其余部分,就是传输过程中的一些处理细节了。
    比如:发送数据后是否要求对方做出应答(一般都要有应答包,这样可以相互协作),应答包的超时是多长时间,如果超时是否进行重传,重传时序列号不变(序列号在重传时起作用,接收端可以判断是否是重传包),重传几次算传输失败等等。
      

  3.   

    谢谢敬爱的rumlee大哥!!
            您的回答,授予了我,智慧!!
            谢谢rumlee大哥!!
            谢谢CSDN开发者平台!!
            有rumlee,无折腾!!
      

  4.   

    再谈 序列化的问题。
    Java的JDK提供的序列化机制 ,楼主要先进行了解,相关的输入输出流的使用,也要进行编程方面的验证,是不是每个对象都要创建新的流对象进行序列化,接收方才能反序列化? 反正这个里面会出点小问题,具体的我记不清了。一般,如果要和C/C++程序做对接,一般都是自定义数据结构的,C程序里面建个结构体就完事OK了,Java代码要进行相应的编码/解码操作,并且每种数据都要有相应的编解码器。因为,Java的序列化机制只适用于Java程序本身。当然,一般的生产环境中,我们都会采用XML或者JSon格式进行数据的传输,因为这样的数据格式比较直观,可能调试起来比较方便,并且各编程语言也都可以处理这样的数据。(当然,C程序,最好还是我上面说的那种方式,那样做,对C比较省事,其他语言就比较费事了。)
      

  5.   

    谢谢敬爱的冰丝雨大哥!!
            您的回答,授予了我,智慧!!
            谢谢冰丝雨大哥!!
            谢谢CSDN开发者平台!!
            有冰丝雨,无不牛逼!!