2013-05-26 64 views
0

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

+1

我建议你尝试TCP并找出答案。你可能试图解决那些对你来说不成问题的问题。 :) –

+0

我只是不知道如何处理不同的网络条件。感谢您的建议,我会尽力。 :) – dastan

+0

几乎所有错误都会导致IOException。如果您尝试从连接读取(),您将能够检测到连接已关闭。 –

回答

0
  1. 您可以使用WebSockets。 XMLHttpRequest的,现在可能是过时的东西实时(因为它不是实时的),虽然你可能回落到使用它谁使用浏览器的人不支持WebSockets的

    • 使用UDP,如果您发送的信息仅在发送时间内有效,例如在作为玩家位置的游戏中(您不希望在5秒前收到他们的位置)。此外,你不能使用UDP与WebSockets

    • 对于其他任何东西,使用TCP(除非你打洞来实现P2P),因为数据丢失可能对你不利,TCP处理它。

  2. 你将不得不检查反正手动重新发送UDP数据丢失,除非通信失败是可以接受的,你

  3. ,你会得到一个IOException。如果连接没有正确关闭,那么在您可以根据您的需要更改无响应超时之后,将抛出异常。假设您使用TCP,否则当您根据您收到的响应/数据(或未收到)考虑客户端连接或断开连接时,应该自己想清楚。

+0

这对你的解释非常有用。但是,TCP仍然会继续尝试重新发送数据包,因为客户端没有响应?另一个问题是,如果在传输图像时使用UDP,在传输过程中某些数据包丢失时,是否可以在客户端显示图像(不是很准确)? – dastan

+0

如果您对此级别的TCP感兴趣,那么您应该阅读[RFC 793 - 传输控制协议](http://www.ietf.org/rfc/rfc793.txt) –

+0

好的,谢谢! :) – dastan

-1

我建议http://cometd.org/你应该看到示例&消息传递逻辑。

+0

这是一个基于C/S的项目,所以我担心Comet不适合。另外,我认为Ajax模式会增加服务器的压力。 – dastan