【发布时间】:2012-07-03 13:10:28
【问题描述】:
我有一个 Java 应用程序,人们可以登录(并使用数据库做各种事情,但这并不重要)。我可以使用 .getInetAddress() 来获取登录服务器的人员的 IP 地址,但是我不确定线程之间的通信方式。我正在尝试向这个预先存在的程序添加聊天服务。
我的程序使用标准的多线程服务器,clinet 是单线程的 AWT Action Listener 程序。做这个的最好方式是什么?我的代码包含一个包含 main 的类,该类创建一个新的“客户端处理程序”类并创建一个新线程来处理它。目前没有线程间通信,线程在它自己的套接字端口上产生并在服务器上独立运行。我之前的想法包括:
使用 ObjectInputStream 将客户端置于阻塞状态并等待客户端接收消息(而不是忙于等待按下按钮),条件是当客户端执行操作时(编辑字段),它会释放阻塞 I/O 并执行该方法,然后返回程序的阻塞 I/O “等待”阶段。
我不确定的事情:
如果我调用阻塞 I/O,AWT ActionListener 是否会解除阻塞 I/O 并跳转到事件处理程序?
1234563消息并创建一个队列,或者更糟糕的是,问题。
服务器是多线程的,如果 John 在 192.168.1.100 并且 Larry 在 192.168.1.152 并且 John 想要向 Larry 发送消息,我如何从线程处理 *.100 获取消息到线程处理 *.152 以便它可以在正确的套接字上输出到正确的客户端。
我的另一个想法(也许更简单)是让客户端多线程,连接到不同端口上的服务器,并使用一组完全不同的套接字连接来处理事件。在这种情况下,我可以只使用阻塞 I/O 等待,当我收到消息时,将其输出,然后返回阻塞 I/O。生产代码和聊天代码之间的错过通信不会有任何问题,从这个角度来看会更好,但这意味着我需要为每个连接的客户端在不同的端口上有 2 个打开的连接。该程序最终将有成千上万的用户同时连接到它,我不想用一个应用程序占用所有服务器端口。
他们还有其他方法可以做到这一点,而不会淹没端口或冒通信错误的风险吗?
【问题讨论】:
标签: java multithreading sockets network-programming communication