TCP和UDP结合在一起

时间:2015-02-13 23:13:57

标签: sockets networking tcp udp

我打算一起为我的游戏服务器使用TCP / IP和UDP协议 。我已经在java中设置了服务器,用c ++设置了客户端,并使用TCP / IP协议将它们与一个很好的gui连接起来。我需要它们是UDP交互,因为UDP协议允许丢失数据包,这对于具有位置和其他更新被传输的在线游戏是必不可少的,如果发生错误则不利于重新发送。我尝试将客户端和服务器转换为UDP协议时出现问题。在java中我注意到创建UDP连接会更难,因为它不像绑定到端口那样容易并且等待连接IMHO所以:

  • 是否可以通过UDP协议或任何其他协议来获取我的服务器“广播”数据,例如实体位置,并允许客户端接收数据而无需务实地建立与该服务器的永久连接。

  • 如果以上是否,是否可以一起使用UDP和TCP / IP协议,而无需建立两个单独的连接。

2 个答案:

答案 0 :(得分:1)

  

是否可以通过UDP协议或任何其他协议使我的服务器“广播”数据(例如实体位置),并允许客户端接收数据,而无需务实地建立与该服务器的永久连接。

这就是你所能做的,因为UDP没有永久连接的概念。它支持的只是数据报。

  

如果以上是否,是否可以一起使用UDP和TCP / IP协议,而无需建立两个单独的连接。

UDP是无连接的,不存在“单独连接”。可能最好的思考方式是连接是TCP的事情,但是当连接存在时,也可以使用UDP发送数据。

由于UDP并不总能在Internet上运行,我强烈建议将传输层与其他程序逻辑分开。您的传输层可以建立TCP连接,并使用TCP连接同意尝试UDP。如果UDP工作,则您的层可以路由通过UDP连接最好通过UDP发送的数据。如果UDP失败,您可以在TCP连接中包含该数据。您需要设计自己的封装/消息传递协议以通过TCP连接使用,包括协商和测试“侧”UDP连接的能力。

你应该记住,TCP做的不仅仅是重传,如果你需要很多其他的东西,你可能最好使用TCP而不是UDP。这尤其正确,因为TCP层由网络专家开发并内置到操作系统中,即使您不必担心重新传输,也不太可能做得更好。其中一些是:

会话设置,拆卸和跟踪
最后的ACK处理和拜占庭式的故障
慢启动 校验和验证 指数退避
重新排序
重复检测
路径MTU检测
路径带宽检测
承认捎带的致谢 死连接检测
“短”包避免
还有更多。

答案 1 :(得分:0)

UDP是无连接的,只需将数据报发送到接收方并希望它到达目的地(无需确认或TCP等)

看一下这个例子:

Java UDP server and client

也许可以阅读文档:

Writing a datagram client and server