【问题标题】:how to create a chat client in java如何在java中创建聊天客户端
【发布时间】:2012-07-03 13:10:28
【问题描述】:

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

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

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

我不确定的事情:

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

  2. 1234563消息并创建一个队列,或者更糟糕的是,问题。
  3. 服务器是多线程的,如果 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


    【解决方案1】:

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

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

    【讨论】:

    • @jtahlbom 不熟悉 SwingUtilities.invokeLater,但当我有机会时会查一下。使输入/输出流成为一个单独的类,因为对我来说,以及一个线程安全的队列。不过,在我接受答案之前,我想看看其他人对此有何看法。我所说的套接字是,如果我要分离生产代码和聊天服务,并使用两个不同的套接字连接来处理它们(每个连接一个),我会加倍套接字要求。每个客户 2 个,而不是每个客户 1 个。
    • @MattWestlake - 抱歉,我不明白您将“生产代码”与“聊天服务”分开是什么意思。您是否通过同一个套接字发送多种类型的数据?如果是这样,您是否已经有 2 个其他线程管理读取/写入此“其他”数据?
    猜你喜欢
    • 2012-12-03
    • 2012-06-18
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 2016-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多