我做了一个简单的点对点的文件传输程序,用的是datagrampacket,发现如果发送端和接收端收和发的速率相差太大,就会丢失一些数据包,比如接收端多打印几次字符串,就会丢失好多个包。有什么简单的方法实现接受和发送时的datagrampacket级别上的同步呢?以我的水平实在是想不出好方法了?我的程序仅仅作了开始和结束的同步。像qq一类的软件是怎么实现的呢?

解决方案 »

  1.   

    文件需要socket那样的Http传输
    文字聊天信息使用UDP可以
    或者你在UDP里面做标记校验(相当于Http但是无序,麻烦)
      

  2.   

    你这个课题比较麻烦。我的想法是你每个UDP里面,自己定义一个序号,然后每隔N个包,发送一个校验包,里面包含了自最近一次发送校验包之后,发送过的包的序列号。这个校验包一定要等到接受端响应,才会继续处理。如果一段时间后还是没有响应,就持续发送。接受端接受到校验包之后,检查最近接受到的包的序列号,假如有缺失,便在上面提到的响应的那个UDP包中,重新要求发送端上传上述包(即使这个包还在路上)。发送端得到重新发送的请求后,就应该把那丢失的几个包,放到新一次N个序列中的最优先位置(序列号保持原有的)比如 
    > 发送端到接受端 
    < 接受端到发送端
    [x] 第N个包
    {...} 校验包
    =================> [1]
    > [2]
    > [3]
    > {1,2,3} SENT
    < {1,2,3} RCVD> [4]
    > [5]
    > [6]
    > {4,5,6} SENT
    < {4,6} RCVD {5} LOST> [5]
    > [7]
    > [8]
    > {5,7,8} SENT
    这个校验包也丢了,N秒后
    > {5,7,8} SENT
    < {5,7} RCVD {8} LOST> [8]
    > [9]
    > [10]
    ......