Java 服务器推送还是客户端请求?TCP还是UDP?

Java 服务器推送还是客户端请求?TCP还是UDP?,java,tcp,udp,socket.io,Java,Tcp,Udp,Socket.io,我想实现实时消息功能,比如在facebook上聊天,但有几个问题让我困惑: 1.为了减少服务器的开销并使其真正“实时”,我应该使用一种全双工通信方式,如套接字而不是Ajax,对吗? 2.如果我使用套接字,我应该选择哪种协议,TCP还是UDP? 3.假设我使用的是TCP,服务器是否会继续尝试重新发送丢失的包,以增加开销? 4.如果服务器和客户机之间的通信网络出现故障怎么办?插座将自行关闭还是我应处理几种网络条件? 有人能帮忙吗 您可以使用WebSocket。XMLHttpRequest现在对于任何

我想实现实时消息功能,比如在facebook上聊天,但有几个问题让我困惑:
1.为了减少服务器的开销并使其真正“实时”,我应该使用一种全双工通信方式,如套接字而不是Ajax,对吗?
2.如果我使用套接字,我应该选择哪种协议,TCP还是UDP?
3.假设我使用的是TCP,服务器是否会继续尝试重新发送丢失的包,以增加开销?
4.如果服务器和客户机之间的通信网络出现故障怎么办?插座将自行关闭还是我应处理几种网络条件?
有人能帮忙吗

  • 您可以使用WebSocket。XMLHttpRequest现在对于任何实时的东西都可能已经过时了(因为它不是实时的),不过对于那些使用不支持WebSocket的浏览器的人来说,您可能会转而使用它

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

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

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

  • 你会得到一个异常。如果连接被不正确地关闭,异常将在无响应超时后抛出,您可以根据需要进行更改。假设您使用TCP,否则您应该根据您收到或不接收的响应/数据考虑客户端连接或断开时自己计算。


  • 我建议你试试TCP并找出答案。你可以尝试解决对你来说不是问题的问题。:)我只是不知道如何处理不同的网络条件。谢谢你的建议,我会试试看。:)几乎所有错误都会导致IOException。如果您尝试从连接读取(),您将能够检测到连接已关闭。这对您的解释非常有用。但是,TCP本身会因为客户端没有响应而继续尝试重新发送数据包吗?另一个问题是,如果在传输图像时使用UDP,当一些数据包在传输过程中丢失时,能否在客户端显示图像(虽然不是很准确)?如果您对这一级别的TCP感兴趣,那么您应该阅读