一、题目描述
题目实现:实现聊天室客户端。运行程序,用户登录服务器后,可以从用户列表中选择单个用户进行聊天,也可以选择多个用户进行聊天。
二、解题思路
创建一个服务类:ChatClientFrame,继承JFrame类。用于进行用户登录、发送聊天信息和显示聊天信息,在该类中完成窗体界面的设计。
定义createClientSocket)方法,用于创建套接字对象、输出流对象以及启动线程对象对服务器转发的信息进行处理。
定义内部线程类ClientThread,用于对服务器端转发的信息进行处理,并显示在相应的控件中。
定义发送聊天信息的send()方法。
技术重点:
通过线程对接收到的信息进行处理,其中分为3种情况,第一种接收到的是登录用户,第二种接收到的是退出提示,第三种接收到的是消息。
使用maven-assembly-plugin插件,把引用的第三方jar包打到项目的jar包中。
启动上一题的服务端,运行服务端
启动多个客户端:
java -jar basics100-1.0-SNAPSHOT.jar
三、代码详解
引入hutool的pom,和使用maven-assembly-plugin插件
1 | 4.0.0com.xiaoxuzhubasics1001.0-SNAPSHOTcn.hutoolhutool-core5.6.5maven-assembly-plugincom.xiaoxuzhu.ChatClientFrame.jar-with-dependenciesfalsemake-assemblypackagesingle |
ChatClientFrame
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | package com.xiaoxuzhu; import cn.hutool.core.io.resource.ResourceUtil; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.ObjectOutputStream; import java.net.Socket; import java.net.URL; import java.net.UnknownHostException; import java.text.DateFormat; import java.util.Date; import java.util.Vector; import javax.swing.*; /** * Description: * * @author xiaoxuzhu * @version 1.0 * * <pre> * 修改记录: * 修改后版本 修改人 修改日期 修改内容 * 2022/6/6.1 xiaoxuzhu 2022/6/6 Create * </pre> <p> * @date 2022/6/6<br> */ </p> <p> public class ChatClientFrame extends JFrame {<br> private JTextField tf_newUser;<br> private JList user_list;<br> private JTextArea ta_info;<br> private JTextField tf_send;<br> private ObjectOutputStream out; // 声明输出流对象<br> private Socket socket;<br> private boolean loginFlag = false ; // 为true时表示已经登录,为false时表示未登录</p> <p> public static void main(String args[]) {<br> System.out.println(SwingUtilities.isEventDispatchThread());<br> EventQueue.invokeLater( new Runnable() {<br> public void run() {<br> System.out.println(SwingUtilities.isEventDispatchThread());<br> try {<br> ChatClientFrame frame = new ChatClientFrame();<br> frame.setVisible( true );<br> frame.createClientSocket(); // 调用方法创建套接字对象<br> } catch (Exception e) {<br> e.printStackTrace();<br> }<br> }<br> });<br> }</p> <p> public void createClientSocket() {<br> try {<br> socket = new Socket( "127.0.0.1" , 9527 ); // 创建套接字对象<br> out = new ObjectOutputStream(socket.getOutputStream()); // 创建输出流对象<br> SwingWorker worker= new SwingWorker() {<br> @Override <br> protected Void doInBackground() throws Exception {<br> try {<br> System.out.println(SwingUtilities.isEventDispatchThread());<br> BufferedReader in = new BufferedReader( new InputStreamReader(<br> socket.getInputStream())); // 创建输入流对象<br> DefaultComboBoxModel model = (DefaultComboBoxModel) user_list<br> .getModel(); // 获得列表框的模型<br> while ( true ) {<br> String info = in.readLine().trim(); // 读取信息<br> if (!info.startsWith( "MSG:" )) { // 接收到的不是消息<br> if (info.startsWith( "退出:" )) { // 接收到的是退出消息<br> model.removeElement(info.substring( 3 )); // 从用户列表中移除用户<br> } else { // 接收到的是登录用户<br> boolean itemFlag = false ; // 标记是否为列表框添加列表项,为true不添加,为false添加<br> for ( int i = 0 ; i v = new Vector(); // 创建向量对象,用于存储发送的消息<br> Object[] receiveUserNames = user_list.getSelectedValues(); // 获得选择的用户数组<br> if (receiveUserNames.length </p> |
上一题服务端启动:
第一个客户端:小小 启动
第二个客户端:虚虚 启动
第三个客户端:竹竹 启动
小小给竹竹发消息
竹竹回复小小:
小小收到回复:
以上就是Java聊天室之实现聊天室客户端功能的详细内容,更多关于Java聊天室的资料请关注IT俱乐部其它相关文章!