当前位置:   article > 正文

java实现群聊设计思路_群组@的实现思路 java

群组@的实现思路 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();
		}
	}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

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();
		}
	}
	
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

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();
		}
		
	}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

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);
		 
	 }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/178610
推荐阅读
相关标签
  

闽ICP备14008679号