2012-02-07 81 views
3

我正在寻找使用Java构建即时通讯软件。Java即时通讯问题

  1. 客户端将连接到服务器进行登录。
  2. 他们将开始对话与一个或多个其他客户端。
  3. 然后,他们将邮件发送到服务器,将邮件转发给所有客户端。

客户需要不断更新,当用户将消息发布或登录。

所以我看到它的方式,客户端需要在一个单独的线程运行服务器本身,使主服务器寄东西给它。否则,客户端将不得不每隔xyz秒轮询主服务器以获取最新更新。这将需要一个单独的线程,因为这纯粹是为了获取更新,而“主”线程将用于当客户端发起诸如发布消息/邀请他人进行对话等动作时...

因此任何人有关如何编写这个即时通讯软件的建议?如果将连接设置为“双向”连接,客户端和服务器都充当服务器,这听起来不失为一个好主意吗?或者是轮询一个更好的选择?任何人都知道IRC协议如何做到这一点?

回答

1

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

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

PRIVMSG <msgtarget> <message> 

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

+0

你说我不需要轮询服务器,但我怎么才能'等待数据显示'?客户端需要向服务器发送请求以供服务器响应。这就是为什么我想使用两个连接,以便客户端不必轮询服务器接收更新的请求。 – 2012-02-07 12:39:28

+1

@John McDonald如果客户端保持连接打开,则不必对更新进行任何特殊请求。回到底层,请求和响应通过套接字上的正常读写操作发送和接收。读操作会阻塞线程直到数据到达(在传统的阻塞IO中)。是的,你可能称之为“长时间投票”,尽管它主要与只能直接使用套接字的HTTP通信有关。 – pingw33n 2012-02-07 13:26:52

+0

OK说,我建议你只使用客户端的一个连接 - 正如你所说的,读取操作会阻塞等待数据到达的线程。问题是,如果正在侦听更新的读取操作是阻塞,客户端如何向服务器发送请求?你是说让两个线程使用一个连接?因此,有一个线程会阻塞从服务器读取更新,并让另一个线程将用于向服务器发送请求,例如“登录”/“添加朋友”/“发送消息”?两个线程可以使用一个连接吗? – 2012-02-07 19:59:01

1

如果您使用原始InputOutput流,那么是的,这是一个很好的做法。您在客户端上创建一个线程,其行为与服务器线程类似 - 等待任何传入的更新,并在更新时更新客户端。但我不会称之为服务器。所以你最好有2个TCP/UDP连接,一个用于客户端发出的请求,另一个用来通知客户端服务器发生了变化。

在企业环境中的这种解决方案可能会通过某种类型的消息框架(如Spring集成)来完成,但要深入挖掘,它基本上与您提到的类似。

0

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

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