Java Instant Messenger问题

时间:2012-02-07 11:31:27

标签: java sockets instant-messaging

我希望用Java构建一个即时通讯工具。

  1. 客户端将连接到服务器以登录。
  2. 他们将与一个或多个其他客户开始对话。
  3. 然后,他们会将消息发布到服务器,将消息转发给所有客户端。
  4. 当用户发布消息或登录时,客户端需要不断更新。

    所以我看到它的方式,客户端需要在一个单独的线程中运行服务器本身,以便主服务器可以向它发送东西。否则,客户端将每隔xyz秒轮询主服务器以获取最新更新。这需要一个单独的线程,因为这将纯粹用于获取更新,而“主”线程将用于客户端启动操作,如发布消息/邀请其他人进行对话等...

    所以有人建议如何写这个即时通讯工具?将连接作为服务器充当客户端和服务器的“双向”连接听起来是个好主意吗?或者投票是一个更好的选择?任何人都知道IRC协议如何做到这一点?

4 个答案:

答案 0 :(得分:1)

如果您正在使用原始InputOutput流,那么这是一个很好的方法。您在客户端创建一个线程,其作用方式与服务器线程类似 - 等待任何传入更新,并在何时更新客户端。我不会称之为服务器。因此,理想情况下,您有2个TCP / UDP连接,一个用于客户端发出的请求,另一个用于通知客户端服务器更改。

企业环境中的这个解决方案可能是通过某种类型的消息传递框架来完成的,例如Spring Integration,但是深入挖掘,它基本上与你提到的方式类似。

答案 1 :(得分:1)

除非可以独立处理(例如,通常在单独的连接中接收/发送文件),否则拥有2个连接没有任何优势。连接本身已经是一个双向通信通道,因此它可以用于发送和接收消息,事件等。您不需要轮询服务器,因为客户端能够维持持久连接并且只是等待数据出现(可选择发送周期性类似PING的消息以确保连接存在。)

IRC使用单个连接到服务器来交换文本命令。例如,一个主要命令:

PRIVMSG <msgtarget> <message>

此命令可以由客户端或服务器发起。客户端发送PRIVMSG以通知它想要将消息传递到一个或多个目的地(在IRC中这个用户或通道)。服务器的任务是将此消息正确地广播给适当的客户端。

答案 2 :(得分:0)

您需要完全自定义协议还是足以使用XMPP?有几个实现XMPP的开源库。 http://xmpp.org/xmpp-software/libraries/

e.g。 http://www.igniterealtime.org/projects/smack/

答案 3 :(得分:0)

对我来说,为了开发即时消息服务,我将使用websocket协议而不是普通的Java套接字,因为普通套接字不能很好地与HTTP协议一起使用,而且一些网络提供商和防火墙禁止自定义端口。如果您使用普通套接字开发它,Web客户端将无法访问您的服务。

您是否打算自己开发即时通讯服务?如何使用其他协议,如Jabber