java实现群聊设计思路

在这里插入图片描述

  1. 服务器线程
public void run() {
		// TODO 自动生成的方法存根
		String line="";
		try {
			BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
			while((line=br.readLine())!=null) {
				if(line.equals("quit")) {
					System.out.println("客户端"+num+"断开");
					break;
					}
				System.out.println(line);
				//line+="\n";
				for(Socket s : sockets) {//严格for循环
					print_out(s,line);
					System.out.println(s);
				}
				/*bw.write(line.toUpperCase());
				bw.newLine();
				bw.flush();*/
			}
		} catch (IOException e) {
			// TODO 自动生成的 catch 块
			//e.printStackTrace();
			System.out.println("线程异常");
		}
	}
	
	private void print_out(Socket s,String msg) {
		try {
			BufferedWriter bos = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
			bos.write(msg);
			bos.newLine();
			bos.flush();
		} catch (IOException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
	}

2.客户端线程

public class clientRead implements Runnable {

	private Socket socket;
	String content2;//打印你传进来的内容
	public clientRead(Socket socket) {
		super();
		this.socket = socket;
	}
	
	public void run() {
		// TODO 自动生成的方法存根
		try {
			BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			
			while(true) {
				content2=br.readLine();
				content2+="\n";
				if(content2 != null && !content2.trim().equals(""))
				UIcode.chatContent.append(content2);//将读取的数据追加到文本域后面
			//	System.out.println(1);
			}
		} catch (IOException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
	}
	
}

3.用户名验证成功后

public UIcode(String username) {//检查用户名后,启动服务器。
		
		this.username = username;
		try {
			
			socket = new Socket("127.0.0.1",8000);
			 bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
			 
		} catch (UnknownHostException e2) {
			// TODO 自动生成的 catch 块
			e2.printStackTrace();
		} catch (IOException e2) {
			// TODO 自动生成的 catch 块
			e2.printStackTrace();
		}
		new Thread(new clientRead(socket)).start();
		public static void myWrite(String str,BufferedWriter bw2) {
		try {
			
			bw2.write(str);
			bw2.newLine();
			bw2.flush();
		} catch (UnknownHostException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		} catch (IOException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
		
	}

4.java界面

public class login extends JFrame//图形界面容器 JFrame
{
	JPanel mb1,mb2,mb3;//面板容器类
	JButton an1,an2;//按钮组件
	JLabel bq1,bq2;//标签组件 一个标签,本身是用于显示信息的,一      般情况下是不能直接更改器显示内容的
	JTextField wbk;//轻量级组件,它允许编辑单行文本
	JPasswordField mmk;//一个只能输入数字的密码框
	 static String username;
	 static char[] password;
	public static void main(String[] args) 
	{
		login lx=new login();
	}
	
	 login()
	 {
		
		 mb1=new JPanel();
		 mb2=new JPanel();
		 mb3=new JPanel();
		 
		 bq1=new JLabel("用户名");
		 bq2=new JLabel("密   码");
		 an1=new JButton("登录");
		 an2=new JButton("注册");
		 wbk=new JTextField(10);//具有指定列数的新的空TextField
		 mmk=new JPasswordField(10);
		 
		 
		 
		 this.setLayout(new GridLayout(3,1));//来设置用户界面上的屏幕组件的格式布局 GridLayout 网格布局 3行1列
		 
		 mb1.add(bq1);   mb1.add(wbk);
		 mb2.add(bq2);   mb2.add(mmk);
		 mb3.add(an1);   mb3.add(an2);
		 
		 an1.addActionListener(new ActionListener() {//为按担组件注册 ActionListener 监听 。在制发生操作事件时,调用该对象 actionPerformed 方法。JButton中的方法

			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO 自动生成的方法存根
				 username=wbk.getText();
				 password=mmk.getPassword();
//				 System.out.println(username);
//				 System.out.println(password);
				 boolean flag=myCheck(username,password);//调用数据库工具类中的方法,检查用户名和密码是否与数据库一致。
				 if(flag) {
						UIcode ui = new UIcode(username);
						setVisible(false);//将窗口隐藏
					}
					else {
						//显示用户或密码错误or
						wbk.setText("");
						mmk.setText("");
						JOptionPane.showMessageDialog(null, "用户名或密码错误", "警告", JOptionPane.PLAIN_MESSAGE);//(确定Frame在其中显示的对话框,提示框里显示的信息,可以改变窗体的主题信息,设置了信息提示内容的图标)
   				  }
				//关掉登录窗口
				 
			}
			 
		 });
		 
		 an2.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO 自动生成的方法存根
				register rg = new register();
			}
		});
		 this.add(mb1);
		 this.add(mb2);
		 this.add(mb3);
		 
		 this.setTitle("用户登录");
		 this.setSize(500,300);
		 this.setLocation(300,280);
		 this.setResizable(false);
		 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		 this.setVisible(true);
		 
	 }

5.关于输入输出流的理解
输入流是将资源数据读入到缓冲Buffer中
输出流是将Buffer中的数据按照规定格式写入到指定位置

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值