我的意思是,服务器端直监听一个端口,如果有数据包就初始化缓存区进行解析处理,如果客户端很多,而且可能同时发送,那么服务器同一个端口接收到的数据是不是先到的会被后到的数据覆盖,或者JAVA会有一个内部使用的队列,一个一个的处理保证不会丢失接受到的数据包。因为服务器在同一个时间内只能处理一个数据包,在处理的时候可能又收到了很多数据包。如果能解释一下原理,万分感谢。

解决方案 »

  1.   

    每收到一个数据包都会记录发送方的ip。数据不会覆盖,但是要自己处理。
    UDP是不稳定的,很可能丢失。
      

  2.   


    UDP提供的是无连接的、不可靠的数据传送方式,是一种尽力而为的数据交付服务。http://baike.baidu.com/view/30509.htm
      

  3.   

    可靠传输用TCP,UDP是不可靠的,传视频什么的可以用UDP
      

  4.   

    额楼主可能还没有理解UDP的传输机制。
    其实,UDP本身,它的传输就是不可靠的。也就是说,发送方发出的包,很可能在发送的路途中被中间的某个节点所丢弃,而这时,接收方是没有办法判断是否有丢包状况出现的(当然,你的应用层协议如果有防丢包的机制,那当别论)。而且,发送方的发送次序,和接收方的接收次序,很有可能会不同(通俗点说,就是,你发五个包,分别按先后顺序标记为1、2、3、4、5,但是,接收方,收到的包,很有可能不是1、2、3、4、5的次序,当然也可能有丢包的现象)。
    上面啰嗦这么多,其实就是3楼说的:UDP提供的是无连接的、不可靠的数据传送方式,是一种尽力而为的数据交付服务。 
    所以,当只有一个客户端在发送数据的时候,他的数据也是有可能被丢弃的,这个并不是服务器接收到不处理而丢弃,而是被中间某个节点所丢弃,根本就没有传输到服务端的机器上。
    当然,如果路途中没有被丢弃的情况下。楼主提出的,新到达的包会覆盖以前包的问题。这个和操作系统没有关系的,这个是你程序的设计问题。一般我们会为每个传输过来的包创建一个接收缓冲区,但是你要是所有包共用一个缓冲区,那就很有可能产生新包覆盖旧包或者新旧两包混包的现象。如果每个包都创建一个独立的缓冲区,用于接收信息包,而且没有限制的话,在楼主所说的密集响应的情况下,服务端的内容就不够用了,这也就是说的那个什么内存泄漏,所以,我们会把这些缓冲区进行管理,形成一个队列,当服务端响应过于密集,或者说,客户端发来的请求过多,服务端一时忙不过来时,我们的程序会将后面的再接收过来的信息包进行丢弃或对相应的客户端做一个服务端忙的简单应答。
      

  5.   

    非常感谢preferme的解释,让我整理一下概念。
    另外我找了一下JAVA对中方面的支持。发现可以设置网络实现上的一个缓存。setReceiveBufferSize, 当包到达的速度快于使用 receive(DatagramPacket) 接收包的速度时,增大 SO_RCVBUF 可以允许网络实现缓存多个包。
    使用这个应该可以解决减少 到达服务器端但是由于来不及处理 而丢弃的包。