gpt4 book ai didi

java - 如何用java创建一个聊天客户端

转载 作者:行者123 更新时间:2023-12-01 15:18:27 25 4
gpt4 key购买 nike

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

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

用ObjectInputStream让客户端进入阻塞状态,等待客户端接收消息(而不是忙着等待按下按钮),条件是当客户端去执行一个 Action (编辑一个字段) ),它会释放阻塞 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 个开放连接。该程序最终将同时有数千个用户连接到它,我不想用一个应用程序占用所有服务器端口。

他们是否有其他方法可以在不淹没端口或冒通信错误风险的情况下执行此操作?

最佳答案

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

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

关于java - 如何用java创建一个聊天客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11311648/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com