基于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及监听端口进行修改配置的类

基于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.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 }
View Code

UserConf.java

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

基于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.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 }
View Code

Help.java

客户端程序的帮助类

基于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 }
View Code

ClientReceive.java

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

基于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 }
View Code

 

你可能感兴趣的:(java)