【问题标题】:Server-push or client-request? TCP or UDP?服务器推送还是客户端请求? TCP还是UDP?
【发布时间】:2013-05-26 08:46:33
【问题描述】:

我想实现一个实时消息功能,例如在 facebook 中聊天,但有几个问题让我感到困惑:
1.为了减少服务器的开销,让它真正“实时”,我应该使用像socket这样的全双工通信方式而不是Ajax,对吗?
2.如果我使用socket,我应该选择哪种协议,TCP还是UDP?
3. 假设我使用 TCP,服务器会一直尝试重新发送丢失的包,这样会花费很多开销吗?
4. 如果网络在服务器和客户端之间通信失败怎么办?套接字会自行关闭还是我应该处理几种网络条件?
有人可以帮忙吗?

【问题讨论】:

  • 我建议您尝试 TCP 并找出答案。您可能正在尝试解决对您来说不是问题的问题。 :)
  • 我只是不知道如何处理不同的网络条件。谢谢你的建议,我会努力的。 :)
  • 几乎所有错误都会导致 IOException。如果您尝试从连接中读取(),您将能够检测到连接已关闭。

标签: java tcp udp socket.io


【解决方案1】:
  1. 您可以使用 WebSocket。 XMLHttpRequest 现在对于任何实时的东西可能已经过时了(因为它不是实时的),尽管您可以回退到使用不支持 WebSockets 的浏览器的人使用它

    • 如果您发送的信息仅在发送时有效,例如在游戏中玩家的位置(您不关心接收他们在 5 中的位置),请使用 UDP几秒钟前)。此外,您不能将 UDP 与 WebSockets 一起使用

    • 除此之外,请使用 TCP(除非您通过打孔来实现 p2p),因为数据丢失可能对您不利,而 TCP 会处理。

  2. 无论如何,您都必须使用 UDP 手动检查并重新发送丢失的数据,除非您可以接受通信失败

  3. 您将收到 IOException。如果连接关闭不正确,则会在无响应超时后引发异常,您可以根据需要进行更改。这是假设您使用 TCP,否则您应该根据您收到(或未收到)的响应/数据考虑客户端连接或断开连接时自己弄清楚。

【讨论】:

  • 你的解释很有用。但是,TCP 本身是否会因为客户端没有响应而继续尝试重新发送数据包?另一个问题,如果使用UDP传输图像,当传输过程中丢失一些数据包时,图像是否可以在客户端显示(虽然不是很准确)?
  • 如果你对这个级别的 TCP 感兴趣,那么你应该阅读RFC 793 - Transmission Control Protocol
猜你喜欢
  • 1970-01-01
  • 2010-11-29
  • 1970-01-01
  • 1970-01-01
  • 2018-04-04
  • 2015-06-23
  • 1970-01-01
  • 1970-01-01
  • 2012-09-22
相关资源
最近更新 更多