基于java网络聊天室--客户端

ChatClient.java

包含名为ChatClient的public类,其主要功能为定义客户端的界面,添加时间监听与事件处理。该类定义了Connect()与DisConnect()方法实现与客户端的连接与断开连接。当登陆到指定的服务器时,调用ClientReceive类实现消息收发,同时该类还定义了SendMessaga()方法来其他用户发送带有表情的消息或悄悄话。

  1 /*
  2  * To change this license header, choose License Headers in Project Properties.
  3  * To change this template file, choose Tools | Templates
  4  * and open the template in the editor.
  5  */
  6 package com.silianbo.client;
  7
  8 /**
  9  *
 10  * @author silianbo
 11  * 客户端主界面
 12  */
 13 import com.silianbo.CaptureScreen;
 14 import static com.silianbo.CaptureScreen.captureScreen;
 15 import com.silianbo.client.ConnectConf;
 16 import com.silianbo.client.Help;
 17 import com.silianbo.client.UserConf;
 18
 19 import com.sun.security.ntlm.Client;
 20 import java.awt.BorderLayout;
 21 import java.awt.Component;
 22 import java.awt.Container;
 23 import java.awt.Dimension;
 24 import java.awt.GridBagConstraints;
 25 import java.awt.GridBagLayout;
 26 import java.awt.Insets;
 27 import java.awt.Toolkit;
 28 import java.awt.event.ActionEvent;
 29 import java.awt.event.ActionListener;
 30 import java.awt.event.WindowAdapter;
 31 import java.awt.event.WindowEvent;
 32 import java.io.ObjectInputStream;
 33 import java.io.ObjectOutputStream;
 34 import java.net.Socket;
 35 import java.util.logging.Level;
 36 import java.util.logging.Logger;
 37 import javax.swing.JButton;
 38 import javax.swing.JCheckBox;
 39 import javax.swing.JComboBox;
 40 import javax.swing.JFrame;
 41 import javax.swing.JLabel;
 42 import javax.swing.JMenu;
 43 import javax.swing.JMenuBar;
 44 import javax.swing.JMenuItem;
 45 import javax.swing.JOptionPane;
 46 import javax.swing.JPanel;
 47 import javax.swing.JScrollPane;
 48 import javax.swing.JTextArea;
 49 import javax.swing.JTextField;
 50 import javax.swing.JToolBar;
 51 import javax.swing.UIManager;
 52 import javax.swing.UnsupportedLookAndFeelException;
 53
 54 /*
 55  * 聊天客户端的主框架类
 56  */
 57 public final class ChatClient extends JFrame implements ActionListener {
 58
 59     /**
 60      * 版本控制,默认版本控制1L
 61      */
 62     private static final long serialVersionUID = 1L;
 63
 64     String ip = "127.0.0.1";  //连接到服务端的ip地址
 65     int port = 8888;         //连接到服务端的端口号
 66     String userName = "silianbo";    //用户名
 67     int type = 0;      //,用户连接标记,其中0表示未连接,1表示已连接
 68
 69     JComboBox combobox;   //选择发送消息的接受者
 70     JTextArea messageShow;  //客户端的信息显示
 71     JScrollPane messageScrollPane; //信息显示的滚动条
 72
 73     JLabel express, sendToLabel, messageLabel;
 74
 75     JTextField clientMessage;//客户端消息的发送
 76     JCheckBox checkbox;//悄悄话
 77     JComboBox actionlist;//表情选择
 78     JButton clientMessageButton;//发送消息
 79     JTextField showStatus;//显示用户连接状态
 80
 81     Socket socket;
 82     ObjectOutputStream output;//网络套接字输出流
 83     ObjectInputStream input;//网络套接字输入流
 84
 85     ClientReceive recvThread;
 86
 87     //建立菜单栏
 88     JMenuBar jMenuBar = new JMenuBar();
 89     //建立菜单组
 90     JMenu operateMenu = new JMenu("操作");
 91     //建立菜单项
 92     JMenuItem loginItem = new JMenuItem("用户登录");
 93     JMenuItem logoffItem = new JMenuItem("用户注销");
 94     JMenuItem exitItem = new JMenuItem("退出");
 95
 96     JMenu conMenu = new JMenu("设置");
 97     JMenuItem userItem = new JMenuItem("用户设置");
 98     JMenuItem connectItem = new JMenuItem("连接设置");
 99
100     JMenu helpMenu = new JMenu("帮助");
101     JMenuItem helpItem = new JMenuItem("帮助");
102
103     //建立工具栏
104     JToolBar toolBar = new JToolBar();
105
106     //建立工具栏中的按钮组件
107     JButton loginButton;//用户登录
108     JButton logoffButton;//用户注销
109     JButton userButton;//用户信息的设置
110     JButton connectButton;//连接设置
111     JButton exitButton;//退出按钮
112     JButton captureScreenButton; //截屏按钮
113
114     //框架的大小
115     Dimension faceSize = new Dimension(550, 550);
116
117     JPanel downPanel;
118     GridBagLayout girdBag;
119     GridBagConstraints girdBagCon;
120
121     public ChatClient() {
122         init();//初始化程序
123
124         //添加框架的关闭事件处理
125         this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
126         this.pack();
127         //设置框架的大小
128         this.setSize(faceSize);
129
130         //设置运行时窗口的位置
131         Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
132         this.setLocation((int) (screenSize.width - faceSize.getWidth()) / 2,
133                 (int) (screenSize.height - faceSize.getHeight()) / 2);
134         this.setResizable(false);
135         this.setTitle("聊天室客户端"); //设置标题
136
137         setVisible(true);
138
139         //为操作菜单栏设置热键‘V‘
140         operateMenu.setMnemonic(‘O‘);
141
142     }
143
144     /**
145      * 程序初始化函数
146      */
147     public void init() {
148
149         Container contentPane = getContentPane();
150         contentPane.setLayout(new BorderLayout());
151
152         //添加菜单栏,对应55行相关介绍
153         jMenuBar.add(operateMenu);   //操作(1.2.3)
154         operateMenu.add(loginItem);  //1.用户登录
155         operateMenu.add(logoffItem); //2.用户注销
156         operateMenu.add(exitItem);   //2.退出
157
158         jMenuBar.add(conMenu);       //设置(a.b)
159         conMenu.add(userItem);       //a.用户设置
160         conMenu.add(connectItem);    //b.连接设置
161
162         jMenuBar.add(helpMenu);      //帮助(I)
163         helpMenu.add(helpItem);      //I.帮助
164
165         setJMenuBar(jMenuBar);
166
167         //初始化按钮
168         loginButton = new JButton("登录");
169         logoffButton = new JButton("注销");
170         userButton = new JButton("用户设置");
171         connectButton = new JButton("连接设置");
172         exitButton = new JButton("退出");
173         captureScreenButton = new JButton("全屏截屏");
174         JButton  screenShotButton = new JButton("区域截图");
175
176         //当鼠标放上显示信息
177         loginButton.setToolTipText("连接到指定的服务器");
178         logoffButton.setToolTipText("与服务器断开连接");
179         userButton.setToolTipText("设置用户信息");
180         connectButton.setToolTipText("设置所要连接到的服务器信息");
181         captureScreenButton.setToolTipText("现在只能全屏截下全屏");
182         //将按钮添加到工具栏
183         toolBar.add(userButton);
184         Component add = toolBar.add(connectButton);
185         toolBar.addSeparator();//添加分隔栏
186         toolBar.add(loginButton);
187         toolBar.add(logoffButton);
188         toolBar.addSeparator();//添加分隔栏
189         toolBar.add(exitButton);
190         toolBar.add(captureScreenButton);
191         toolBar.add(screenShotButton);
192
193         contentPane.add(toolBar, BorderLayout.NORTH);
194
195         checkbox = new JCheckBox("悄悄话");
196         checkbox.setSelected(false);
197
198         actionlist = new JComboBox();
199         actionlist.addItem("@/微笑@");
200         actionlist.addItem("@/高兴@");
201         actionlist.addItem("@/轻轻@");
202         actionlist.addItem("@/生气@");
203         actionlist.addItem("@/小心@");
204         actionlist.addItem("@/静静@");
205         actionlist.setSelectedIndex(0);
206
207         //初始时
208         loginButton.setEnabled(true);
209         logoffButton.setEnabled(false);
210
211         //为菜单栏添加事件监听
212         loginItem.addActionListener(this);
213         logoffItem.addActionListener(this);
214         exitItem.addActionListener(this);
215         userItem.addActionListener(this);
216         connectItem.addActionListener(this);
217         helpItem.addActionListener(this);
218
219         //添加按钮的事件侦听
220         loginButton.addActionListener(this);
221         logoffButton.addActionListener(this);
222         userButton.addActionListener(this);
223         connectButton.addActionListener(this);
224         exitButton.addActionListener(this);
225
226         /*
227         *全屏截屏事件监听处理
228         */
229         captureScreenButton.addActionListener((ActionEvent e) -> {
230             try {
231                 CaptureScreen.RandomName filename = new CaptureScreen.RandomName();
232                 captureScreen("C:\\Users\\silianbo\\Desktop\\计算机网络课程设计\\image", filename + ".png");
233             } catch (Exception ex) {
234                 Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
235             }
236         });
237         /**
238          * 区域截屏监听
239          */
240         screenShotButton.addActionListener(this);
241
242         combobox = new JComboBox();
243         combobox.insertItemAt("所有人", 0);
244         combobox.setSelectedIndex(0);
245
246         messageShow = new JTextArea();
247         messageShow.setEditable(false);
248         //添加滚动条
249         messageScrollPane = new JScrollPane(messageShow,
250                 JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
251                 JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
252         messageScrollPane.setPreferredSize(new Dimension(400, 400));
253         messageScrollPane.revalidate();
254
255         clientMessage = new JTextField(23);
256         clientMessage.setEnabled(false);
257         clientMessageButton = new JButton();
258         clientMessageButton.setText("发送");
259
260         //添加系统消息的事件侦听
261         clientMessage.addActionListener(this);
262         clientMessageButton.addActionListener(this);
263
264         sendToLabel = new JLabel("发送至:");
265         express = new JLabel("         表情:   ");
266         messageLabel = new JLabel("发送消息:");
267         downPanel = new JPanel();
268         girdBag = new GridBagLayout();
269         downPanel.setLayout(girdBag);
270
271         girdBagCon = new GridBagConstraints();
272         girdBagCon.gridx = 0;
273         girdBagCon.gridy = 0;
274         girdBagCon.gridwidth = 5;
275         girdBagCon.gridheight = 2;
276         girdBagCon.ipadx = 5;
277         girdBagCon.ipady = 5;
278         JLabel none = new JLabel("    ");
279         girdBag.setConstraints(none, girdBagCon);
280         downPanel.add(none);
281
282         girdBagCon = new GridBagConstraints();
283         girdBagCon.gridx = 0;
284         girdBagCon.gridy = 2;
285         girdBagCon.insets = new Insets(1, 0, 0, 0);
286         //girdBagCon.ipadx = 5;
287         //girdBagCon.ipady = 5;
288         girdBag.setConstraints(sendToLabel, girdBagCon);
289         downPanel.add(sendToLabel);
290
291         girdBagCon = new GridBagConstraints();
292         girdBagCon.gridx = 1;
293         girdBagCon.gridy = 2;
294         girdBagCon.anchor = GridBagConstraints.LINE_START;
295         girdBag.setConstraints(combobox, girdBagCon);
296         downPanel.add(combobox);
297
298         girdBagCon = new GridBagConstraints();
299         girdBagCon.gridx = 2;
300         girdBagCon.gridy = 2;
301         girdBagCon.anchor = GridBagConstraints.LINE_END;
302         girdBag.setConstraints(express, girdBagCon);
303         downPanel.add(express);
304
305         girdBagCon = new GridBagConstraints();
306         girdBagCon.gridx = 3;
307         girdBagCon.gridy = 2;
308         girdBagCon.anchor = GridBagConstraints.LINE_START;
309         //girdBagCon.insets = new Insets(1,0,0,0);
310         //girdBagCon.ipadx = 5;
311         //girdBagCon.ipady = 5;
312         girdBag.setConstraints(actionlist, girdBagCon);
313         downPanel.add(actionlist);
314
315         girdBagCon = new GridBagConstraints();
316         girdBagCon.gridx = 4;
317         girdBagCon.gridy = 2;
318         girdBagCon.insets = new Insets(1, 0, 0, 0);
319 //        girdBagCon.ipadx = 5;
320 //        girdBagCon.ipady = 5;
321         girdBag.setConstraints(checkbox, girdBagCon);
322         downPanel.add(checkbox);
323
324         girdBagCon = new GridBagConstraints();
325         girdBagCon.gridx = 0;
326         girdBagCon.gridy = 3;
327         girdBag.setConstraints(messageLabel, girdBagCon);
328         downPanel.add(messageLabel);
329
330         girdBagCon = new GridBagConstraints();
331         girdBagCon.gridx = 1;
332         girdBagCon.gridy = 3;
333         girdBagCon.gridwidth = 3;
334         girdBagCon.gridheight = 1;
335         girdBag.setConstraints(clientMessage, girdBagCon);
336         downPanel.add(clientMessage);
337
338         girdBagCon = new GridBagConstraints();
339         girdBagCon.gridx = 4;
340         girdBagCon.gridy = 3;
341         girdBag.setConstraints(clientMessageButton, girdBagCon);
342         downPanel.add(clientMessageButton);
343
344         showStatus = new JTextField(35);
345         showStatus.setEditable(false);
346         girdBagCon = new GridBagConstraints();
347         girdBagCon.gridx = 0;
348         girdBagCon.gridy = 5;
349         girdBagCon.gridwidth = 5;
350         girdBag.setConstraints(showStatus, girdBagCon);
351         downPanel.add(showStatus);
352
353         contentPane.add(messageScrollPane, BorderLayout.CENTER);
354         contentPane.add(downPanel, BorderLayout.SOUTH);
355
356         //关闭程序时的操作
357         this.addWindowListener(
358                 new WindowAdapter() {
359                     @Override
360                     public void windowClosing(WindowEvent e) {
361                         if (type == 1) {
362                             DisConnect();
363                         }
364                         System.exit(0);
365                     }
366                 }
367         );
368     }
369
370     /**
371      * 事件处理
372      */
373     @Override
374     public void actionPerformed(ActionEvent e) {
375         Object obj = e.getSource();
376
377         if (obj == userItem || obj == userButton) { //用户信息设置
378             //调出用户信息设置对话框
379             UserConf userConf = new UserConf(this, userName);
380             userConf.setVisible(true);
381             userName = userConf.userInputName;
382         } else if (obj == connectItem || obj == connectButton) { //连接服务端设置
383             //调出连接设置对话框
384             ConnectConf conConf = new ConnectConf(this, ip, port);
385             conConf.setVisible(true);
386             ip = conConf.userInputIp;
387             port = conConf.userInputPort;
388         } else if (obj == loginItem || obj == loginButton) { //登录
389             Connect();
390         } else if (obj == logoffItem || obj == logoffButton) { //注销
391             DisConnect();
392             showStatus.setText("");
393         } else if (obj == clientMessage || obj == clientMessageButton) { //发送消息
394             SendMessage();
395             clientMessage.setText("");
396         } else if (obj == exitButton || obj == exitItem) { //退出
397             int j = JOptionPane.showConfirmDialog(
398                     this, "真的要退出吗?", "退出",
399                     JOptionPane.YES_OPTION, JOptionPane.QUESTION_MESSAGE);
400
401             if (j == JOptionPane.YES_OPTION) {
402                 if (type == 1) {
403                     DisConnect();
404                 }
405                 System.exit(0);
406             }
407         } else if (obj == helpItem) { //菜单栏中的帮助
408             //调出帮助对话框
409             Help helpDialog = new Help(this);
410             helpDialog.setVisible(true);
411         }
412     }
413 /**
414  * 连接服务器
415  */
416     public void Connect() {
417         try {
418             socket = new Socket(ip, port);
419         } catch (Exception e) {
420             JOptionPane.showConfirmDialog(
421                     this, "不能连接到指定的服务器。\n请确认连接设置是否正确。", "提示",
422                     JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE);
423             return;
424         }
425
426         try {
427             output = new ObjectOutputStream(socket.getOutputStream());
428             output.flush();
429
430             input = new ObjectInputStream(socket.getInputStream());
431
432             output.writeObject(userName);
433             output.flush();
434
435             recvThread = new ClientReceive(socket, output, input, combobox, messageShow, showStatus);
436             recvThread.start();
437
438             loginButton.setEnabled(false);
439             loginItem.setEnabled(false);
440             userButton.setEnabled(false);
441             userItem.setEnabled(false);
442             connectButton.setEnabled(false);
443             connectItem.setEnabled(false);
444             logoffButton.setEnabled(true);
445             logoffItem.setEnabled(true);
446             clientMessage.setEnabled(true);
447             messageShow.append("连接服务器 " + ip + ":" + port + " 成功...\n");
448             type = 1;//标志位设为已连接
449         } catch (Exception e) {
450             System.out.println(e);
451         }
452     }
453
454     /**
455      *服务器注销
456      */
457     public void DisConnect() {
458         loginButton.setEnabled(true);
459         loginItem.setEnabled(true);
460         userButton.setEnabled(true);
461         userItem.setEnabled(true);
462         connectButton.setEnabled(true);
463         connectItem.setEnabled(true);
464         logoffButton.setEnabled(false);
465         logoffItem.setEnabled(false);
466         clientMessage.setEnabled(false);
467
468         if (socket.isClosed()) {
469             return;
470         }
471
472         try {
473             output.writeObject("用户下线");
474             output.flush();
475
476             input.close();
477             output.close();
478             socket.close();
479             messageShow.append("已经与服务器断开连接...\n");
480             type = 0;//标志位设为未连接
481         } catch (Exception e) {
482             //
483         }
484     }
485
486     public void SendMessage() {
487         String toSomebody = combobox.getSelectedItem().toString();
488         String status = "";
489         if (checkbox.isSelected()) {
490             status = "悄悄话";
491         }
492
493         String action = actionlist.getSelectedItem().toString();
494         String message = clientMessage.getText();
495
496         if (socket.isClosed()) {
497             return;
498         }
499
500         try {
501             output.writeObject("聊天信息");
502             output.flush();
503             output.writeObject(toSomebody);
504             output.flush();
505             output.writeObject(status);
506             output.flush();
507             output.writeObject(action);
508             output.flush();
509             output.writeObject(message);
510             output.flush();
511         } catch (Exception e) {
512             //
513         }
514     }
515
516     public static void main(String[] args) throws UnsupportedLookAndFeelException {
517         try {
518             UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
519         } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException e) {
520         }
521         ChatClient chatClient = new ChatClient();
522     }
523 }

ConnectConf.java

该类继承自Jdialog,是用户对所有要连接的服务器IP及监听端口进行修改配置的类

  1 /*
  2  * To change this license header, choose License Headers in Project Properties.
  3  * To change this template file, choose Tools | Templates
  4  * and open the template in the editor.
  5  */
  6 package com.silianbo.client;
  7
  8 import java.awt.BorderLayout;
  9 import java.awt.Container;
 10 import java.awt.Dimension;
 11 import java.awt.GridLayout;
 12 import java.awt.Label;
 13 import java.awt.Toolkit;
 14 import java.awt.event.ActionEvent;
 15 import java.awt.event.WindowAdapter;
 16 import java.awt.event.WindowEvent;
 17 import java.net.InetAddress;
 18 import java.net.UnknownHostException;
 19 import javax.swing.JButton;
 20 import javax.swing.JDialog;
 21 import javax.swing.JFrame;
 22 import javax.swing.JLabel;
 23 import javax.swing.JPanel;
 24 import javax.swing.JTextField;
 25
 26 /**
 27  *
 28  * @author silianbo
 29  * 生成连接信息输入的对话框 让用户输入连接服务器的IP和端口
 30  */
 31 public class ConnectConf extends JDialog {
 32
 33     /**
 34      *
 35      */
 36     private static final long serialVersionUID = 1L;
 37     JPanel panelUserConf = new JPanel();
 38     JButton save = new JButton();
 39     JButton cancel = new JButton();
 40     JLabel DLGINFO = new JLabel(
 41             "                  默认连接设置为  127.0.0.1:8888");
 42
 43     JPanel panelSave = new JPanel();
 44     JLabel message = new JLabel();
 45
 46     String userInputIp;
 47     int userInputPort;
 48
 49     JTextField inputIp;
 50     JTextField inputPort;
 51
 52     public ConnectConf(JFrame frame, String ip, int port) {
 53         super(frame, true);
 54         this.userInputIp = ip;
 55         this.userInputPort = port;
 56         try {
 57             jbInit();
 58         } catch (Exception e) {
 59         }
 60         //设置运行位置,使对话框居中
 61         Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
 62         this.setLocation((int) (screenSize.width - 400) / 2 + 50,
 63                 (int) (screenSize.height - 600) / 2 + 150);
 64         this.setResizable(false);
 65     }
 66
 67     private void jbInit() throws Exception {
 68         this.setSize(new Dimension(300, 130));
 69         this.setTitle("连接设置");
 70         message.setText(" 请输入服务器的IP地址:");
 71         inputIp = new JTextField(10);
 72         inputIp.setText(userInputIp);
 73         inputPort = new JTextField(4);
 74         inputPort.setText("" + userInputPort);
 75         save.setText("保存");
 76         cancel.setText("取消");
 77
 78         panelUserConf.setLayout(new GridLayout(2, 2, 1, 1));
 79         panelUserConf.add(message);
 80         panelUserConf.add(inputIp);
 81         panelUserConf.add(new JLabel(" 请输入服务器的端口号:"));
 82         panelUserConf.add(inputPort);
 83
 84         panelSave.add(new Label("              "));
 85         panelSave.add(save);
 86         panelSave.add(cancel);
 87         panelSave.add(new Label("              "));
 88
 89         Container contentPane = getContentPane();
 90         contentPane.setLayout(new BorderLayout());
 91         contentPane.add(panelUserConf, BorderLayout.NORTH);
 92         contentPane.add(DLGINFO, BorderLayout.CENTER);
 93         contentPane.add(panelSave, BorderLayout.SOUTH);
 94
 95         //保存按钮的事件处理
 96         save.addActionListener((ActionEvent a) -> {
 97             int savePort;
 98             //判断端口号是否合法
 99             try {
100                 userInputIp = "" + InetAddress.getByName(inputIp.getText());
101                 userInputIp = userInputIp.substring(1);
102             } catch (UnknownHostException e) {
103                 DLGINFO.setText(
104                         "                                    错误的IP地址!");
105
106                 return;
107             }
108             //userInputIp = inputIP;
109
110             //判断端口号是否合法
111             try {
112                 savePort = Integer.parseInt(inputPort.getText());
113
114                 if (savePort < 1 || savePort > 65535) {
115                     DLGINFO.setText("               侦听端口必须是0-65535之间的整数!");
116                     inputPort.setText("");
117                     return;
118                 }
119                 userInputPort = savePort;
120                 dispose();
121             } catch (NumberFormatException e) {
122                 DLGINFO.setText("                错误的端口号,端口号请填写整数!");
123                 inputPort.setText("");
124             }
125         });
126
127         //关闭对话框时的操作
128         this.addWindowListener(
129                 new WindowAdapter() {
130                     @Override
131                     public void windowClosing(WindowEvent e) {
132                         DLGINFO.setText("                  默认连接设置为  127.0.0.1:8888");
133                     }
134                 }
135         );
136
137         //取消按钮的事件处理
138         cancel.addActionListener((ActionEvent e) -> {
139             DLGINFO.setText("                  默认连接设置为  127.0.0.1:8888");
140             dispose();
141         });
142     }
143 }

UserConf.java

该类继承自Jdialog,是用户对链接到服务器时所显示的用户名进行修改配置的类。

  1 /*
  2  * To change this license header, choose License Headers in Project Properties.
  3  * To change this template file, choose Tools | Templates
  4  * and open the template in the editor.
  5  */
  6 package com.silianbo.client;
  7
  8 import java.awt.*;
  9 import javax.swing.*;
 10 import java.awt.event.*;
 11 /**
 12  *
 13  * @author silianbo
 14  * 生成用户信息输入对话框的类
 15  * 让用户输入自己的用户名
 16  */
 17 public class UserConf extends JDialog {
 18     /**
 19      *
 20      */
 21     private static final long serialVersionUID = 1L;
 22     JPanel panelUserConf = new JPanel();
 23     JButton save = new JButton();
 24     JButton cancel = new JButton();
 25     JLabel DLGINFO=new JLabel(
 26         "                         默认用户名为:silianbo");
 27
 28     JPanel panelSave = new JPanel();
 29     JLabel message = new JLabel();
 30     String userInputName;
 31
 32     JTextField userName ;
 33
 34     public UserConf(JFrame frame,String str) {
 35         super(frame, true);
 36         this.userInputName = str;
 37         try {
 38             jbInit();
 39         }
 40         catch (Exception e) {
 41             e.printStackTrace();
 42         }
 43         //设置运行位置,使对话框居中
 44         Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
 45         this.setLocation( (int) (screenSize.width - 400) / 2 + 50,
 46                         (int) (screenSize.height - 600) / 2 + 150);
 47         this.setResizable(false);
 48     }
 49
 50     private void jbInit() throws Exception {
 51         this.setSize(new Dimension(300, 120));
 52         this.setTitle("用户设置");
 53         message.setText("请输入用户名:");
 54         userName = new JTextField(10);
 55         userName.setText(userInputName);
 56         save.setText("保存");
 57         cancel.setText("取消");
 58
 59         panelUserConf.setLayout(new FlowLayout());
 60         panelUserConf.add(message);
 61         panelUserConf.add(userName);
 62
 63         panelSave.add(new Label("              "));
 64         panelSave.add(save);
 65         panelSave.add(cancel);
 66         panelSave.add(new Label("              "));
 67
 68         Container contentPane = getContentPane();
 69         contentPane.setLayout(new BorderLayout());
 70         contentPane.add(panelUserConf, BorderLayout.NORTH);
 71         contentPane.add(DLGINFO, BorderLayout.CENTER);
 72         contentPane.add(panelSave, BorderLayout.SOUTH);
 73
 74         //保存按钮的事件处理
 75         save.addActionListener(
 76             new ActionListener() {
 77                 public void actionPerformed (ActionEvent a) {
 78                     if(userName.getText().equals("")){
 79                         DLGINFO.setText(
 80                             "                                 用户名不能为空!");
 81                         userName.setText(userInputName);
 82                         return;
 83                     }
 84                     else if(userName.getText().length() > 15){
 85                         DLGINFO.setText("                    用户名长度不能大于15个字符!");
 86                         userName.setText(userInputName);
 87                         return;
 88                     }
 89                     userInputName = userName.getText();
 90                     dispose();
 91                 }
 92             }
 93         );
 94
 95         //关闭对话框时的操作
 96         this.addWindowListener(
 97             new WindowAdapter(){
 98                                 @Override
 99                 public void windowClosing(WindowEvent e){
100                     DLGINFO.setText("                         默认用户名为:silianbo");
101                 }
102             }
103         );
104
105         //取消按钮的事件处理
106         cancel.addActionListener((ActionEvent e) -> {
107                     DLGINFO.setText("                         默认用户名为:silianbo");
108                     dispose();
109                 });
110     }
111 }

Help.java

客户端程序的帮助类

 1 /*
 2  * To change this license header, choose License Headers in Project Properties.
 3  * To change this template file, choose Tools | Templates
 4  * and open the template in the editor.
 5  */
 6 package com.silianbo.client;
 7
 8 /**
 9  *
10  * @author silianbo
11  */
12 import java.awt.*;
13 import javax.swing.*;
14 import java.awt.event.*;
15
16 /**
17  * 生成设置对话框的类
18  */
19 public class Help extends JDialog {
20
21     /**
22      *
23      */
24     private static final long serialVersionUID = 1L;
25     JPanel titlePanel = new JPanel();
26     JPanel contentPanel = new JPanel();
27     JPanel closePanel = new JPanel();
28
29     JButton close = new JButton();
30     JLabel title = new JLabel("聊天室客户端帮助");
31     JTextArea help = new JTextArea();
32
33     Color bg = new Color(255,255,255);
34
35     public Help(JFrame frame) {
36         super(frame, true);
37         try {
38             jbInit();
39         }
40         catch (Exception e) {
41             e.printStackTrace();
42         }
43         //设置运行位置,使对话框居中
44         Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
45         this.setLocation( (int) (screenSize.width - 400) / 2 + 25,
46                         (int) (screenSize.height - 320) / 2);
47         this.setResizable(false);
48     }
49
50     private void jbInit() throws Exception {
51         this.setSize(new Dimension(350, 270));
52         this.setTitle("帮助");
53
54         titlePanel.setBackground(bg);;
55         contentPanel.setBackground(bg);
56         closePanel.setBackground(bg);
57
58         help.setText("1、设置所要连接服务端的IP地址和端口"+
59             "(默认设置为\n      127.0.0.1:8888)。\n"+
60             "2、输入你的用户名(默认设置为:silianbo)。\n"+
61             "3、点击“登录”便可以连接到指定的服务器;\n"+
62             "      点击“注销”可以和服务器端开连接。\n"+
63             "4、选择需要接受消息的用户,在消息栏中写入消息,\n"+
64             "      同时选择表情,之后便可发送消息。\n");
65         help.setEditable(false);
66
67         titlePanel.add(new Label("              "));
68         titlePanel.add(title);
69         titlePanel.add(new Label("              "));
70
71         contentPanel.add(help);
72
73         closePanel.add(new Label("              "));
74         closePanel.add(close);
75         closePanel.add(new Label("              "));
76
77         Container contentPane = getContentPane();
78         contentPane.setLayout(new BorderLayout());
79         contentPane.add(titlePanel, BorderLayout.NORTH);
80         contentPane.add(contentPanel, BorderLayout.CENTER);
81         contentPane.add(closePanel, BorderLayout.SOUTH);
82
83         close.setText("关闭");
84         //事件处理
85         close.addActionListener((ActionEvent e) -> {
86                     dispose();
87                 });
88     }
89 }

ClientReceive.java

该类是实现服务器端与客户端消息收发的类

 1 /*
 2  * To change this license header, choose License Headers in Project Properties.
 3  * To change this template file, choose Tools | Templates
 4  * and open the template in the editor.
 5  */
 6 package com.silianbo.client;
 7
 8 import java.io.IOException;
 9 import java.io.ObjectInputStream;
10 import java.io.ObjectOutputStream;
11 import java.net.Socket;
12 import javax.swing.JComboBox;
13 import javax.swing.JTextArea;
14 import javax.swing.JTextField;
15
16 /**
17  *
18  * @author silianbo
19  * 聊天客户端消息收发类
20  */
21 public class ClientReceive extends Thread {
22     private final JComboBox combobox;
23     private final JTextArea textarea;
24
25     Socket socket;
26     ObjectOutputStream output;
27     ObjectInputStream  input;
28     JTextField showStatus;
29
30     public ClientReceive(Socket socket,ObjectOutputStream output,
31         ObjectInputStream  input,JComboBox combobox,JTextArea textarea,JTextField showStatus){
32
33         this.socket = socket;
34         this.output = output;
35         this.input = input;
36         this.combobox = combobox;
37         this.textarea = textarea;
38         this.showStatus = showStatus;
39     }
40
41         @Override
42     public void run(){
43         while(!socket.isClosed()){
44             try{
45                 String type = (String)input.readObject();
46
47                 if(type.equalsIgnoreCase("系统信息")){
48                     String sysmsg = (String)input.readObject();
49                     textarea.append("系统信息: "+sysmsg);
50                 }
51                 else if(type.equalsIgnoreCase("服务关闭")){
52                     output.close();
53                     input.close();
54                     socket.close();
55
56                     textarea.append("服务器已关闭!\n");
57
58                     break;
59                 }
60                 else if(type.equalsIgnoreCase("聊天信息")){
61                     String message = (String)input.readObject();
62                     textarea.append(message);
63                 }
64                 else if(type.equalsIgnoreCase("用户列表")){
65                     String userlist = (String)input.readObject();
66                     String usernames[] = userlist.split("\n");
67                     combobox.removeAllItems();
68
69                     int i =0;
70                     combobox.addItem("所有人");
71                     while(i < usernames.length){
72                         combobox.addItem(usernames[i]);
73                         i ++;
74                     }
75                     combobox.setSelectedIndex(0);
76                     showStatus.setText("在线用户 " + usernames.length + " 人");
77                 }
78             }
79             catch (IOException | ClassNotFoundException e ){
80                 System.out.println(e);
81             }
82         }
83     }
84 }

时间: 2024-10-06 20:59:14

基于java网络聊天室--客户端的相关文章

基于java网络聊天室---前言

很久之前做的一个东西,现在拿出来整理一下放在自己的博客中! 一. 设计目的 随着人互联网的发展,人和人之间的沟通方式也越来越便捷和多样化,在线聊天工具已经成为人们生活中够通不可缺少的部分,在学习完 java网络编程课程,如果能开发一款属于自己的聊天工具,和好友进行私密对话,则是一件令人兴奋的事.同时,安全可靠的TCP这两种 通信协议,是非常重要的内容,值得研究. 二. 设计内容 本聊天室程序基于C/S模式,聊天室共分为服务器端和客户端两部分,服务器端程序主要负责侦听客户端发来的消息,客户端需登陆

基于java网络聊天室--服务器端

服务器端: ChatServer.java 包含名为ChatServer的public类,其主要功能为定义服务器端的界面,添加时间监听与时间处理.调用ServerListen类来实现服务端用户上线与下线的监听,调用ServerListen来实现服务器端的消息收发. 1 package com.silianbo.server; 2 3 import com.silianbo.CaptureScreen; 4 import java.awt.BorderLayout; 5 import java.a

基于java网络聊天室--截图实现

package com.silianbo; /* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ import java.awt.BorderLayout; import java.awt.C

基于java的聊天室/群发控制台程序

java聊天室 1.概述 基于tcp协议的,由一个服务器和多个客户端组成,一个客户端发送消息,其他所有客户端都能接收到消息.在服务器端设置一个线程监听客户端发来的请求(消息),并且向所有的客户端响应.每个客户端也有一个线程用来接收服务器端的请求. 2.代码如下 public class Client { public static void main(String[] args) throws IOException { //创建套接字 Socket socket = new Socket("l

基于linux的TCP网络聊天室设计与实现

利用Linux实现基于TCP模式的网络聊天程序 主要完成的两大组成部分为:服务器和客户端. 服务器程序主要负责监听客户端发来的消息. 客户端需要登录到服务器端才可以实现正常的聊天功能.该程序是利用进程以及共享内存来实现群发送消息的. 以下简单分析一下服务器端和客户端两个方面所要完成的任务. 服务器的主要功能如下: 在特定的端口上进行监听,等待客户端的连接. 用户可以配置服务器端的监听端口. 向连接的客户端发送登录成功信息. 向已经连接到服务器的客户端的用户发送系统消息. 使用TCP多线程并发服务

Linux网络编程--聊天室客户端程序

聊天室客户端程序 #define _GNU_SOURCE 1 #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <assert.h> #include <stdio.h> #include <unistd.h> #include <string.h> #in

聊天室客户端源码

import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.OutputStreamWriter;import java.io.PrintWriter;import java.net.Socket;import java.net.Unkno

Socket编程(简易聊天室客户端/服务器编写、CocoaAsyncSocket)

Socket编程(简易聊天室客户端/服务器编写.CocoaAsyncSocket) 一.Socket 1.1 Socket简介 Socket就是为网络服务提供的一种机制.网络通信其实就是Socket间的通信,通信的两端都是Socket,数据在两个Socket间通过IO传输. 在Web服务大行其道的今天,调用Web服务的代价是高昂的,尤其是仅仅是抓取少量数据的时候尤其如此.而使用Socket,可以只传送数据本身而不用进行XML封装,大大降低数据传输的开销.Socket允许使用长连接,允许应用程序运

基于SSH的聊天室

随网络聊天室是用户比较喜欢的一种WEB应用程序,借助聊天室,用户可以及时互通信息,交流思想.本系统主要采用了基于B/S(Browser/Server,即浏览器/服务器)模式开发的简易聊天室系统.本系统主要是采用了S2SH技术和JSP技术开发的动态网站.系统开发主要包括前台页面设计.功能设计和后台数据处理设计(即发言区管理和用户管理). 本系统采用了MYECLIPSE8.5作为开发工具,后台数据库采用了MYSQL数据库设计,利用JAVA的框架技术S2SH和后台数据处理.利用TOMCAT6.0以上的