🔍 登录 注册

基于BIO模式下的即时通信客户端的实现

大 大苹果 2023-12-15 linux 👁 54 ⏱ 6min

界面设计

  1. 登录界面设计

    1. ip地址输入
    2. 用户名输入

    示例图如下:

    image.png

  2. 聊天界面设计

    1. 登录用户显示
    2. 聊天内容显示
    3. 在线用户显示
    4. 私聊选择
    5. @选择
    6. 聊天输入及发送

    示例图如下:

    image.png

界面代码实现

  • 登录界面

    private JFrame loginView;
    private JTextField ipEt, nameEt, idEt;
    
    private void displayLoginView() {
    	// TODO Auto-generated method stub
    	loginView = new JFrame("登录");
    	loginView.setLayout(new GridLayout(3, 1));
    	loginView.setSize(400, 230);
    
    	JPanel ip = new JPanel();
    	JLabel label = new JLabel("ip:");
    	ip.add(label);
    
    	ipEt = new JTextField(20);
    	ipEt.setText("127.0.0.1");
    	ip.add(ipEt);
    	loginView.add(ip);
    
    	JPanel name = new JPanel();
    	JLabel labelName = new JLabel("姓名:");
    	name.add(labelName);
    
    	nameEt = new JTextField(20);
    	nameEt.setText("zyw");
    	name.add(nameEt);
    	loginView.add(name);
    
    	JPanel btnView = new JPanel();
    	JButton login = new JButton("登录");
    	btnView.add(login);
    	JButton cancel = new JButton("取消");
    	btnView.add(cancel);
    	loginView.add(btnView);
    
    	loginView.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	setWindowCenter(loginView, 400, 260, true);
    
    	// 给登录和取消绑定事件
    	login.addActionListener(this);
    	cancel.addActionListener(this);
    }
    
  • 聊天界面代码

    public JTextArea smsContent = new JTextArea(23, 50);
    private JTextArea smsSend = new JTextArea(4, 40);
    public JList<String> onLineUsers = new JList<String>();
    private JCheckBox isPrivateBn = new JCheckBox("私聊");
    private JButton sendBn = new JButton("发送");
    private void displayChatView() {
    	JPanel bottomPanel = new JPanel(new BorderLayout());
    	win.add(bottomPanel, BorderLayout.SOUTH);
    	bottomPanel.add(smsSend);
    	JPanel btns = new JPanel(new FlowLayout(FlowLayout.LEFT));
    	btns.add(sendBn);
    	btns.add(isPrivateBn);
    	bottomPanel.add(btns, BorderLayout.EAST);
    
    	smsContent.setBackground(new Color(0xdd, 0xdd, 0xdd));
    	win.add(new JScrollPane(smsContent), BorderLayout.CENTER);
    	smsContent.setEditable(false);
    	Box rightBox = new Box(BoxLayout.Y_AXIS);
    	onLineUsers.setFixedCellWidth(120);
    	onLineUsers.setVisibleRowCount(13);
    	rightBox.add(new JScrollPane(onLineUsers));
    	win.add(rightBox, BorderLayout.EAST);
    
    	win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	win.pack();
    	setWindowCenter(win, 650, 600, true);
    
    	sendBn.addActionListener(this);
    
    }
    
  • 登录事件及聊天内容发送事件绑定

    @Override
    public void actionPerformed(ActionEvent e) {
    	// TODO Auto-generated method stub
    	JButton btn = (JButton) e.getSource();
    
    	switch (btn.getText()) {
    	case "登录":
    		String ip = ipEt.getText().toString();
    		String name = nameEt.getText().toString();
    		String msg = "";
    		if (ip == null || !ip.matches("\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}")) {
    			msg = "请输入合法的服务端地址";
    		} else if (name == null || !name.matches("\\S{1,}")) {
    			msg = "姓名必须1个字符以上";
    		}
    		if (!msg.equals("")) {
    			JOptionPane.showMessageDialog(loginView, msg);
    		} else {
    			try {
    				win.setTitle(name);
    				socket = new Socket(ip, Constants.PORT);
    				new ClientReader(this, socket).start();
    				DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
    				dos.writeInt(1);
    				dos.writeUTF(name.trim());
    				dos.flush();
    				loginView.dispose();
    				displayChatView();
    			} catch (IOException ioException) {
    				// TODO: handle exception
    				ioException.printStackTrace();
    			}
    		}
    		break;
    	case "取消":
    		System.exit(0);
    		break;
    	case "发送":
    		String msgSend = smsSend.getText().toString();
    		if (!msgSend.trim().equals("")) {
    			String selectName = onLineUsers.getSelectedValue();
    			int flag = 2;
    			if (selectName != null && !selectName.equals("")) {
    				msgSend = ("@" + selectName + "," + msgSend);
    				if (isPrivateBn.isSelected()) {
    					flag = 3;
    				}
    			}
    			try {
    				DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
    				dos.writeInt(flag);
    				dos.writeUTF(msgSend);
    				if (flag == 3) {
    					dos.writeUTF(selectName.trim());
    				}
    				dos.flush();
    			} catch (IOException e1) {
    				// TODO Auto-generated catch block
    				e1.printStackTrace();
    			}
    
    		}
    		smsSend.setText(null);
    		System.out.println("111111");
    		break;
    	default:
    		break;
    	}
    }
    

    实现代码源码

读完了?给作者一点支持

本文采用 CC BY 4.0 协议转载 · © 大苹果

评论(0)

登录 后参与评论。

  • 还没有评论,来抢沙发。

🔗 相关文章

Mysql 表被标记为崩溃,最后一次自动化修复失败

当 MySQL 日志中出现“表被标记为崩溃且自动修复失败”的提示时,通常表示 MySQL 在启动过程中检测到某个表的文件系统或存储引擎层出现了问题。这种情况通常会导致表无法正常使用,需要手动进行修复。以下是处理这种情况的一些步骤和方法: ### 1. **查看具体错误信息** 首先,需要查看 MySQL 错误日志以获取更多的错误信息。这可以帮助确定崩溃的表和具体的问题。 ```bash # 查看 MySQL 错误日志 tail -f /var/log/mysql/error.log ``` ### 2. **修复表** 不同的存储引擎有不同的修复工具,以下是常用的修复方法: #### **使用 `myisamchk` 修复 MyISAM 表** 如果崩溃的表使用的是 MyISAM 存储引擎,可以使用 `myisamchk` 工具来修复表。 1. 停止 MySQL 服务: ```bash sudo systemctl stop mysql ``` 2. 使用 `myisamchk` 修复表:

2024/8/11👍 0

mermaid.min.js的使用及介绍

`mermaid.min.js` 是一个 JavaScript 库,用于在浏览器中轻松绘制复杂的图表和流程图。Mermaid 通过使用简单的标记语言来描述图表,使得用户无需深入学习图表绘制的底层技术即可创建专业的图形。 在这篇文章中,我们将介绍 `mermaid.min.js` 的功能、应用场景、如何在项目中使用,以及一些常用的示例。 ## Mermaid 的功能 Mermaid 支持多种类型的图表,包括但不限于: 1. **流程图(Flowchart)**: - 用于表示流程或过程中的步骤。 - 支持各种节点和连线风格。 2. **序列图(Sequence Diagram)**: - 用于表示对象之间的交互。 - 展示消息的发送和接收过程。 3. **类图(Class Diagram)**: - 用于表示类及其关系。 - 支持类的属性和方法定义。 4. **状态图(State Diagram)**: - 用于描述系统状态及其转换。 - 适用于复杂的状态机建模。 5. **甘

2024/8/9👍 0

docker之Dockerfile及docker compose配置文件的说明及使用

Docker 的配置文件对于镜像构建和容器化应用的管理至关重要。在 Docker 中,主要的配置文件是 Dockerfile 和 docker-compose.yml。Dockerfile 用于构建镜像,而 docker-compose.yml 用于定义多容器应用。下面将详细介绍这两个文件的配置选项和用法。 ## Dockerfile 配置详解 **Dockerfile** 是一个文本文件,其中包含一组指令,用于定义如何构建 Docker 镜像。以下是 Dockerfile 中常用的指令及其用法: ### FROM `FROM` 指令用于指定基础镜像,是 Dockerfile 中的第一条指令。 ```dockerfile FROM node:14 ``` 上例中,`node:14` 是官方的 Node.js 版本 14 的镜像。 ### LABEL `LABEL` 用于为镜像添加元数据,以键值对形式存在。 ```dockerfile LABEL maintainer="your-email@example.com" LABE

2024/8/9👍 0