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

目录
一、需求分析 1
1.1 设计需求 1
1.2 系统设计分析 1
1.3 系统功能分析 2
二、模块概要分析 3
2.1 模块划分 3
2.2 模块结构图 3
2.3 模块功能 3
三、模块详细设计 4
3.1 客户端实现 4
3.2 服务器实现 7
3.3 公共类实现 11
四、运行结果 13
4.1 客户端进入聊天室 13
4.2 聊天界面 13
4.3 选择聊天类型 14
4.4 人数动态刷新 17
五、毕业设计总结 18
六、附录 19
6.1 参考文献 19
6.2 源代码 19
一、需求分析
1.1 设计需求
1.采用C/S模式,基于TCP协议编程的方式,使得各个用户通过服务器转发实现聊天的功能。
2.分为三大模块:客户端模块、服务器端模块和公共辅助类模块。
3. 客户端模块的主要功能:
1)登陆功能:用户可以注册,然后选择服务器登入聊天室。
2)显示用户:将在线用户显示在列表中。
3)接收信息:能接收其他用户发出的信息。
4)发送信息:能发出用户要发出的信息。
4. 服务器端模块的主要功能:

  1. 检验登陆信息:本文转载自http://www.biyezuopin.vip/onews.asp?id=15098检查登陆信息是否正确,并向客户端返回登陆信息,如信息正确。就允许用户登陆。
  2. 显示在线状态:将该用户的状态发给各在线用户。
  3. 转发聊天信息:将消息转发给所有在线的用户。
    5. 公共辅助类模块的主要功能:
    1) 定义完整的消息传递机制
    2) 对消息转发的方式进行有效约束
  4. 规定消息类型

1.2 系统设计分析
一.实现网络聊天室编程,关键在于Socket通信,程序的功能都是在Socket的基础上一层一层增加的。实现Socket通信的基本方法为以下4个步骤。
(1)客户端与服务器端分别实例化ServerSockot/Socket。
(2)打开连接到Socket的面向对象输入输出流。
(3)利用输入输出流按照TCP协议对Socket进行读写操作。
(4)关闭输入输出流和Socket。
我们要实现的功能都是在第3步对Socket的输入输出流做相应的操作。

package client;import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import common.*;public class Client extends Thread {public ClientUI ui; // 客户端界面public String name; // 用户名private Socket csocket; // 客户端套接字private ObjectInputStream in; // 输入流private ObjectOutputStream out; // 输出流public static void main(String[] args) {new Client(Config.IP, Config.PORT);}public Client(String server, int port) {try {csocket = new Socket(server, port);out = new ObjectOutputStream(csocket.getOutputStream());in = new ObjectInputStream(csocket.getInputStream());} catch (Exception e) {System.out.println(e.toString() + " 客户端初始化失败");this.close();System.exit(0);}this.start();}public void run() {try {// 获取用户名while (name == null || name.equals(""))name = JOptionPane.showInputDialog("请输入名字").trim();// 第一次运行,发送登陆消息send(new Message("login", name, null, null));// 显示界面ui = new ClientUI(this, name + " 的客户端");// 消息处理主循环while (true) {Message rcv = (Message) in.readObject(); // 服务器端发来的消息System.out.println(rcv.toString());new ClientMsgType(this, rcv).process();}} catch (Exception e) {System.out.println(e.toString() + " 连接中断");close();}}/*** 客户端发送消息给服务器* * @param msg*            消息对象*/public void send(Message msg) {try {out.writeObject(msg);out.flush();} catch (Exception e) {System.out.println(e.toString() + " 消息转换出错");}}/*** 关闭所有资源*/public void close() {try {if (ui != null)ui.dispose();if (out != null)out.close();if (in != null)in.close();if (csocket != null)csocket.close();} catch (IOException e) {System.out.println(e.toString() + " 资源无法释放");}}
}/*** 客户端界面类* * @author Administrator**/
@SuppressWarnings("serial")
class ClientUI extends Frame {JTextArea msgArea; // 显示消息文本JTextField msgField; // 输入消息文本JComboBox clientList; // 在线用户列表JComboBox msgType;	// 聊天文本或者文件 JButton btn; // 发送消息按钮JLabel cntLabel; // 统计在线人数JScrollPane textAreaScrollPane;JPanel textFieldPanel = new JPanel();Client client;public ClientUI(Client client, String winname) {super(winname); // 继承父类的名字setSize(600, 400);this.client = client;// 消息文本显示区域msgArea = new JTextArea(400, 400);msgArea.setEditable(false);textAreaScrollPane = new JScrollPane(msgArea);add(textAreaScrollPane, BorderLayout.CENTER);// 发送消息区域textFieldPanel.setLayout(new FlowLayout(0, 10, 10));add(textFieldPanel, BorderLayout.SOUTH);clientList = new JComboBox(); // 在线用户列表clientList.addItem("All");textFieldPanel.add(clientList);msgType = new JComboBox();	// 聊天文本或者文件msgType.addItem("chat");msgType.addItem("file");textFieldPanel.add(msgType);msgField = new JTextField(20); // 输入消息文本textFieldPanel.add(msgField);btn = new JButton("发送"); // 发送消息按钮btn.setMnemonic(KeyEvent.VK_ENTER);textFieldPanel.add(btn);cntLabel = new JLabel("在线人数:1"); // 显示在线人数textFieldPanel.add(cntLabel);// 发送消息按钮监听器btn.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {String type = (String) msgType.getSelectedItem();String title = "";String content = getText().trim();byte[] fbyte = null;if (content.equals("")) {JOptionPane.showMessageDialog(client.ui, "输入不能为空");return;}if (type.equals("file")) {// 获取客户端发送文件JFileChooser dlg = new JFileChooser();dlg.setDialogTitle("选择文件");int result = dlg.showOpenDialog(client.ui);if (result == JFileChooser.APPROVE_OPTION) {File file = dlg.getSelectedFile();fbyte = Common.file2Byte(file);title = file.getName();} else {return;}append("TO " + getName() + ": " + title + "\n");}append("TO " + getName() + ": " + content + "\n");client.send(new Message(type, client.name, getName(), title, content, fbyte));clear();}});addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e) {if (JOptionPane.OK_OPTION == JOptionPane.showConfirmDialog(client.ui, "确定退出吗?")) {client.close();System.exit(0);}}});setVisible(true);}/*** 获得输入框中的消息文本* * @return*/public String getText() {return msgField.getText().trim();}/*** 设置cntLabel文本以更新在线用户数* @param txt*/public void setText(String txt) {cntLabel.setText(txt);}/*** 获得选中的聊天对象的名字*/public String getName() {return (String) clientList.getSelectedItem();}/*** 获得在线用户数* * @return*/public int getClientCount() {return clientList.getItemCount();}/*** 添加在线用户* * @param name*            用户名*/public void addClient(String name) {clientList.addItem(name);}/*** 删除在线用户* * @param name*            用户名*/public void removeClient(String name) {clientList.removeItem(name);}/*** 清空输入框*/public void clear() {msgField.setText(" ");}/*** 添加文本到消息显示区域* * @param txt*            消息文本*/public void append(String txt) {msgArea.append(txt);}
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部