学习笔记04(java多人聊天室)

用JavaSocket编程开发聊天室

实验介绍

  1. 用Java图形用户界面编写聊天室服务器端和客户端,支持多个客户端连接到一个服务器。每个客户端能够输入账号。
  2. 可以实现群聊(聊天记录显示在所有客户端界面)。
  3. 完成好友列表在各个客户端上显示。
  4. 可以实现 私人聊天,用户可以选择某个其他用户,单独发送信息。
  5. 服务器能够群发系统消息,能够强行让某些用户下线。
  6. 客户端的上线下线要求能够在其他客户端上面实时刷新。

私聊,客户端、服务端的群发消息和上线提醒
在这里插入图片描述
客户端的下线提醒
在这里插入图片描述
登陆界面
在这里插入图片描述
项目结构
在这里插入图片描述

服务器端

服务器端需要用到多线程,当一个客户端请求连接时,服务器便为其分配一个线程来处理他的需求。并且服务器端创建一个线程集合,方便管理所有连入的线程。
下面展示部分代码。

	public void run() {
		try {
			while (true) {
				s = ss.accept();
         //s 就是当前的连接对应的 Socket,对应一个客户端
         //该客户端随时可能发信息过来,必须要接收
         //另外开辟一个线程,专门为这个 s 服务,负责接受信息
				ChatThread ct = new ChatThread(s);
				clients.add(ct);
				ct.start();
			}
		} catch (Exception ex) {
		}
	}

同时根据客户端传来的标志数flag来进行相应的操作,如发送消息,退出等。
下面展示部分代码。

public void run() {
			try {
				int flag;
				while (true) {
					flag = br.read();
					flag-=48;
					if(flag==1) {
						//登录
	                    String name1 = br.readLine();
	                    String pwd1 = br.readLine();
	            		int flag1=login(name1,pwd1);
	            		ps.print(flag1);	  
	            		if(flag1==1) {
	            			this.username=name1;
	            			ps.print(vv.size());
	            			if(vv.size()>0) {
		            			for(int i=0;i<vv.size();i++) {
		            				ps.println(vv.get(i));
		            			}
	            			}
	            			vv.add(name1);
	            			jComboBox.addItem(name1);
	            			sendUsers(name1);
	            			taMsg.append(name1 + "进入了聊天室" + "\n");
	            		}
					}else if(flag==2) {
						//注册
						String name1 = br.readLine();
	        	        String pwd1 = br.readLine();
	        			int flag2 = Register(name1, pwd1);
	        			ps.print(flag2);
					}else if(flag==3) {
						//发消息
						String str = br.readLine();// 读取该 Socket 传来的信息
						sendMessage(str); // 将 str 转发给所有客户端
						taMsg.append(str+"\n");
					}else if(flag==4) {
						//退出
						String user = br.readLine();
						taMsg.append(user+"退出了聊天室"+"\n");
						sendMessage(user+"退出了聊天室");
						for(int i=0;i<vv.size();i++) {
							if(vv.get(i).equals(user)) {
								vv.remove(i);
							}
						}
						exit(user);
					}else if(flag==5) {
						//私聊
						String user1 = br.readLine();
						String user2 = br.readLine();
						String msg = br.readLine();
						sendMessageToUser(msg,user1,user2);
					}
				}
			} catch (Exception ex) {
			}
		}
	}

客户端

客户端分为登录,注册,和聊天主界面
客户端首先打开登录&注册界面,当登陆成功后,打开聊天主界面,且要将登录界面连接的socket和用户名传入聊天界面,还需要在服务器端得到一个jComboBox(下拉列表框),传给主界面显示。
下面展示部分代码。

if(登录成功){
     new Chat(socket,name,jComboBox).init();
     login.dispose();
}

主界面很简单,功能的实现也不复杂,要注意的就是在传给服务器数据时要提前传入一个标志数flag(我用的是一个整数)。
下面展示部分代码。

private volatile boolean exit = false; 
public void run() {
		try {
			while (!exit) {
			    - - - - - - - -
			    - - - - - - - -
			    if(关闭){
			       exit = br.ready();
			    }
			}
		    this.dispose();
		} catch (Exception ex) {
		}

这里的处理,因为服务器可以随时关闭客户端,所以需要有一个exit来控制线程的关闭。服务器端会在关闭客户端时,给exit传入一个true。

结束

实验总结:学习了Java多线程,JavaSocket编程,Java图形界面,实现了实验要求的功能。
实验不足:界面简单。设计的不够美观。

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值