DatagramSocket和DatagramChannel之间的区别

时间:2010-01-16 23:29:30

标签: java networking udp

对于大学本学期,我们必须以4人为一组编写网络游戏(java)。我自愿为我的团队研究网络代码。

阅读java网络,似乎有两种UDP联网方法:

http://java.sun.com/j2se/1.4.2/docs/api/java/net/DatagramSocket.html 这是一个标准的UDP套接字,可以将数据包发送到任何端口的任何IP地址。

http://java.sun.com/j2se/1.4.2/docs/api/java/nio/channels/DatagramChannel.html 这是一种基于udp套接字构建的通道系统。我不完全确定它提供的是什么,除了只连接到一个客户端的能力,这在这种情况下不是很有用。

这些是唯一的选择吗?哪个最适合用于4-8名玩家的实时多人游戏?

3 个答案:

答案 0 :(得分:5)

你不是先问第一个问题。第一个问题是:哪种消息传递规则最适合这个游戏?

对于少数用户来说,UDP完全比它的价值更麻烦。你必须担心丢失的数据包,你必须想出一些方法将数据打包成小包,yada,yada,yada。

在4-8播放器规模上,您可以与Web服务互连并发送肥皂消息。这将为您处理所有数据序列化。哎呀,你甚至可以使用JMS。

至于你的字面问题,频道是nio的一部分。它们支持多路复用等待,而套接字则不支持。如果您需要询问'这些端口上是否有包给我?'你想要频道。没有它们,您需要一个每端口线程。当然,假设您有多个接收数据的端口。

答案 1 :(得分:1)

您的设计是包含中央服务器还是客户端客户端?这可能会影响哪种技术适用于通信。

您是否可以使用第三方库?如果是这样,我总是发现JGroups非常适合进行可靠的多播。它易于学习和高度可配置。 (对于实时游戏来说,它是否适合性能,我不确定,但我过去曾用它来推送大量数据而且从未出现性能问题。)

答案 2 :(得分:1)

  

游戏是实时的,我不认为网络服务真的适合他们吗?

可能,但无论基于互联网的技术使用什么,实时游戏都存在问题:

  • 如果您想支持地球另一端的玩家,则必须处理1/2秒或更长时间的网络延迟。

  • 如果您想支持下一个县的玩家,您将需要处理因网络拥塞等导致数据包丢失而导致的偶然“冻结”。

  • 如果您想支持大量播放器,那么您必须处理本地资源使用和网络带宽的扩展。

因此,虽然您选择的网络传输很重要,但它只是问题的一部分。设计应用程序级别(游戏)协议以最小化网络延迟和冻结/数据包丢失对“玩家体验”的影响可能更为重要。或者只是限制游戏在局域网上使用。