如何在java中创建聊天客户端

时间:2012-07-03 13:10:29

标签: java multithreading sockets network-programming communication

我有一个人们可以登录的java应用程序(并使用数据库执行各种操作,但这并不重要)。我可以使用.getInetAddress()来获取登录到服务器的人员的IP地址,但是我不确定如何在线程之间进行通信。我正在尝试为此预先存在的程序添加聊天服务。

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

使用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因此可以输出到右侧套接字上的正确客户端。

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

    他们的其他方式是否在不淹没端口或冒通信错误的情况下这样做?

1 个答案:

答案 0 :(得分:1)

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

我不确定你对套接字和端口的看法。 连接到服务器的每个客户端都需要一个单独的套接字连接(这将涉及一个单独的端口)