0

我有一个人们可以登录的Java应用程序(并使用数据库做各种事情,但这并不重要)。我可以使用 .getInetAddress() 来获取登录服务器的人员的 IP 地址,但是我不确定线程​​之间的通信方式。我正在尝试向这个预先存在的程序添加聊天服务。

我的程序使用标准的多线程服务器,clinet 是单线程 AWT Action Listener 程序。做这个的最好方式是什么?我的代码包含一个包含 main 的类,该类创建一个新的“客户端处理程序”类并创建一个新线程来处理它。目前没有线程间通信,线程在它自己的套接字端口上产生并在服务器上独立运行。我之前的想法包括:

使用 ObjectInputStream 将客户端置于阻塞状态并等待客户端接收消息(而不是忙于等待按下按钮),条件是当客户端执行某个操作(编辑字段)时,它将释放阻塞 I/O 并执行该方法,然后返回程序的阻塞 I/O“等待”阶段。

我不确定的事情:

  1. 如果我调用阻塞 I/O,AWT ActionListener 会解除阻塞 I/O 并跳转到事件处理程序吗?

  2. 如果客户端在代码中(而不是在阻塞的 InputStream 上)并且发送了一条消息,那么服务器是否会知道在发送消息之前等待程序回到 inputStream 上,还是发送消息并创建一个队列,或更糟糕的现金,问题。

  3. 服务器是多线程的,如果 John 在 192.168.1.100 而 Larry 在 192.168.1.152 并且 John 想向 Larry 发送消息,我如何从线程处理 *.100 到线程处理 *.152 获取消息所以它可以在正确的套接字上输出到正确的客户端。

我的另一个想法(也许更容易)是让客户端多线程,连接到不同端口上的服务器,并使用一组完全不同的套接字连接来处理事件。在这种情况下,我可以只使用阻塞 I/O 等待,当我收到消息时,输出它,然后返回阻塞 I/O。生产代码和聊天代码之间的错过通信不会有任何问题,从这个角度来看会更好,但这意味着我需要为每个连接的客户端在不同的端口上有 2 个打开的连接。该程序最终将有成千上万的用户同时连接到它,我不想用一个应用程序占用所有服务器端口。

他们是否有其他方法可以做到这一点而不会淹没端口或冒着通信错误的风险?

4

1 回答 1

1

您的客户端应该使用 3 个线程。所有 gui 交互都应从 EDT 完成。然后,您应该有一个用于套接字 InputStream 的线程和一个用于套接字 OutputStream 的线程(这两个块都可能阻塞)。当您想发送消息时,您的 gui 线程应该使用某种线程安全队列将消息传递给 OutputStream 线程。InputStream 线程接收到的任何消息都应该使用类似于SwingUtilities.invokeLater将消息推送到 gui 的东西。

我不确定你在说什么关于套接字和端口。 每个连接到服务器的客户端都需要一个单独的套接字连接(这将涉及一个单独的端口)

于 2012-07-03T13:55:56.787 回答