我正在寻找使用Java构建即时通讯软件。Java即时通讯问题
- 客户端将连接到服务器进行登录。
- 他们将开始对话与一个或多个其他客户端。
- 然后,他们将邮件发送到服务器,将邮件转发给所有客户端。
客户需要不断更新,当用户将消息发布或登录。
所以我看到它的方式,客户端需要在一个单独的线程运行服务器本身,使主服务器寄东西给它。否则,客户端将不得不每隔xyz秒轮询主服务器以获取最新更新。这将需要一个单独的线程,因为这纯粹是为了获取更新,而“主”线程将用于当客户端发起诸如发布消息/邀请他人进行对话等动作时...
因此任何人有关如何编写这个即时通讯软件的建议?如果将连接设置为“双向”连接,客户端和服务器都充当服务器,这听起来不失为一个好主意吗?或者是轮询一个更好的选择?任何人都知道IRC协议如何做到这一点?
你说我不需要轮询服务器,但我怎么才能'等待数据显示'?客户端需要向服务器发送请求以供服务器响应。这就是为什么我想使用两个连接,以便客户端不必轮询服务器接收更新的请求。 – 2012-02-07 12:39:28
@John McDonald如果客户端保持连接打开,则不必对更新进行任何特殊请求。回到底层,请求和响应通过套接字上的正常读写操作发送和接收。读操作会阻塞线程直到数据到达(在传统的阻塞IO中)。是的,你可能称之为“长时间投票”,尽管它主要与只能直接使用套接字的HTTP通信有关。 – pingw33n 2012-02-07 13:26:52
OK说,我建议你只使用客户端的一个连接 - 正如你所说的,读取操作会阻塞等待数据到达的线程。问题是,如果正在侦听更新的读取操作是阻塞,客户端如何向服务器发送请求?你是说让两个线程使用一个连接?因此,有一个线程会阻塞从服务器读取更新,并让另一个线程将用于向服务器发送请求,例如“登录”/“添加朋友”/“发送消息”?两个线程可以使用一个连接吗? – 2012-02-07 19:59:01