Java网络编程之Tcp实现多人聊天

网络编程

用Tcp实现多人聊天窗口

实现思路

Java网络编程之Tcp实现多人聊天_第1张图片

具体思路:

​ 1、写一个server服务器,用于监听10001端口,以及处理接收和向客户端发出数据。

​ 2、客户端寻找服务器的ip地址与服务器端口。建立连接。

​ 3、每个客户端与服务器建立连接后,创建一个InputStream流和一个OutputStream流用于传输数据。

同时客户端将自己的用户信息对象通过ObejcetOutputStream流传输过来。

​ 4、服务器同时为客户端开启一个线程,用于while(true)死循环接收所发来的信息。

​ 5、服务器根据用户信息的不同权限,处理信息,并将消息发送给每个客户端,使每个客户端可见。

补充内容:

​ 1、编写一个登陆界面,用于输入你的用户名。(已实现)

​ 2、编写一个聊天窗口,用于收发数据。(已实现)

​ 3、用户分为两种不同的权限,普通用户与管理员。(已实现)

​ 4、管理员拥有踢人、禁言功能,普通用户拥有私聊功能(待实现)。

运行界面

Java网络编程之Tcp实现多人聊天_第2张图片
Java网络编程之Tcp实现多人聊天_第3张图片

具体代码

​ 写的乱七八糟- -!,看看就好

服务器

package chat;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextArea;

public class Login extends Thread{
	static JTextArea user,psd;
	static JButton jbLogin, jbExit;
	static String usname="";
	static ObjectOutputStream os;
	static DataInputStream dis;
	static DataOutputStream dos;
	static String ReadIn=" ";
	static Login thread;
	static User u1;
	public void show() {
		JFrame Loginmenu=new JFrame();
		Loginmenu.setLayout(null);
		
		user=new JTextArea();//新建一个文本框
		user.setBorder(BorderFactory.createTitledBorder("你的名字"));//给这个文本框添加标题
		Loginmenu.add(user);//将一个文本框加入面板之中
		user.setBounds(120, 75, 260, 50);//设置这个文本框的(x轴,y轴,长,宽)
		
		psd=new JTextArea();//新建一个文本框
		psd.setBorder(BorderFactory.createTitledBorder("待定"));//给这个文本框添加标题
		Loginmenu.add(psd);//将一个文本框加入面板之中
		psd.setBounds(15, 380, 660, 200);//设置这个文本框的(x轴,y轴,长,宽)
		
		jbLogin=new JButton("登录");//新建一个按钮
		jbLogin.setBounds(280, 250, 100, 50);//设置这个按钮的位置大小
		Loginmenu.add(jbLogin);//将一个组件加入面板之中
		
		jbExit=new JButton("退出");//新建一个按钮
		jbExit.setBounds(120, 250, 100, 50);//设置这个按钮的位置大小
		Loginmenu.add(jbExit);//将一个组件加入面板之中
		
		//下面是按钮监听器
		jbLogin.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
            	usname=user.getText();//获取用户名
            	Loginmenu.setVisible(false);
            	Menu.show();
            	thread.start();
            }
        });
		
		
		
		Loginmenu.setSize(500,400);//设置整个面板的大小
		Loginmenu.setVisible(true);//将整个面板设置为可见
		
	}
	public static void main(String[] args) throws IOException, InterruptedException {
		Login l=new Login();
		l.show();
		thread = new Login();
		
		}
	public static void send() throws IOException {
		System.out.println(u1.talk);
		if(u1.talk) {
			dos.writeUTF(Menu.Chat);
		}
		else {
		Menu.readW.append("你已被禁言!\n");
		}
	}
	public void run(){
		try {
		super.run();
		u1=new User(usname);
		u1.ip=InetAddress.getLocalHost().getHostAddress();
		// 1:连接对象
		Socket out = new Socket("192.168.101.177",10001);		
		// 2:创建流对象 发送数据信息与接收数据
		os = new ObjectOutputStream(out.getOutputStream());
		dis = new DataInputStream(out.getInputStream());
		dos = new DataOutputStream(out.getOutputStream());
		// 3:写出数据到服务器
		os.writeObject(u1);
		while(true) {
		ReadIn=dis.readUTF();
		Menu.readW.append(ReadIn);
		Menu.readW.setCaretPosition(Menu.readW.getText().length());
		}
		}
		catch(IOException e) {
			System.out.println("错误!");
		}	
	}
}

客户端

客户端登录界面
package chat;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextArea;

public class Login extends Thread{
	static JTextArea user,psd;
	static JButton jbLogin, jbExit;
	static String usname="刘建宏";
	static ObjectOutputStream os;
	static DataInputStream dis;
	static DataOutputStream dos;
	static String ReadIn=" ";
	static Login thread;
	static User u1;
	public void show() {
		JFrame Loginmenu=new JFrame();
		Loginmenu.setLayout(null);
		
		user=new JTextArea();//新建一个文本框
		user.setBorder(BorderFactory.createTitledBorder("你的名字"));//给这个文本框添加标题
		Loginmenu.add(user);//将一个文本框加入面板之中
		user.setBounds(120, 75, 260, 50);//设置这个文本框的(x轴,y轴,长,宽)
		
		psd=new JTextArea();//新建一个文本框
		psd.setBorder(BorderFactory.createTitledBorder("待定"));//给这个文本框添加标题
		Loginmenu.add(psd);//将一个文本框加入面板之中
		psd.setBounds(15, 380, 660, 200);//设置这个文本框的(x轴,y轴,长,宽)
		
		jbLogin=new JButton("登录");//新建一个按钮
		jbLogin.setBounds(280, 250, 100, 50);//设置这个按钮的位置大小
		Loginmenu.add(jbLogin);//将一个组件加入面板之中
		
		jbExit=new JButton("退出");//新建一个按钮
		jbExit.setBounds(120, 250, 100, 50);//设置这个按钮的位置大小
		Loginmenu.add(jbExit);//将一个组件加入面板之中
		
		//下面是按钮监听器
		jbLogin.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
            	usname=user.getText();//获取用户名
            	Loginmenu.setVisible(false);
            	Menu.show();
            	thread.start();
            }
        });
		
		
		
		Loginmenu.setSize(500,400);//设置整个面板的大小
		Loginmenu.setVisible(true);//将整个面板设置为可见
		
	}
	public static void main(String[] args) throws IOException, InterruptedException {
		Login l=new Login();
		l.show();
		thread = new Login();
		
		}
	public static void send() throws IOException {
		System.out.println(u1.talk);
		if(u1.talk) {
			dos.writeUTF(Menu.Chat);
		}
		else {
		Menu.readW.append("你已被禁言!\n");
		}
	}
	public void run(){
		try {
		super.run();
		u1=new User(usname);
		u1.ip=InetAddress.getLocalHost().getHostAddress();
		// 1:连接对象
		Socket out = new Socket("192.168.101.177",10001);		
		// 2:创建流对象 发送数据信息与接收数据
		os = new ObjectOutputStream(out.getOutputStream());
		dis = new DataInputStream(out.getInputStream());
		dos = new DataOutputStream(out.getOutputStream());
		// 3:写出数据到服务器
		os.writeObject(u1);
		while(true) {
		ReadIn=dis.readUTF();
		Menu.readW.append(ReadIn);
		Menu.readW.setCaretPosition(Menu.readW.getText().length());
		}
		}
		catch(IOException e) {
			System.out.println("错误!");
		}	
	}
}

客户端聊天界面
package chat;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class Menu {
	static JFrame MenuC;
	static JTextArea readW;
	static JTextArea writeW;
	static JButton jbSend;
	static JButton jbExit;
	static String Chat="0";
	static JScrollPane JspRead;
	public static void show() {
		JFrame MenuC=new JFrame();
		MenuC.setLayout(null);
		
		readW=new JTextArea();//新建一个文本框
		readW.setBorder(BorderFactory.createTitledBorder("聊天内容"));//给这个文本框添加标题
		//readW.setBounds(15, 10, 660, 350);//设置这个文本框的(x轴,y轴,长,宽)
		readW.setEditable(false);
		JspRead = new JScrollPane();//增加一个滚动条
		JspRead.setViewportView(readW);
		//JspRead.setHorizontalScrollBarPolicy( JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); 
		JspRead.setVerticalScrollBarPolicy( JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 
		JspRead.setBounds(10, 5, 680, 360);
		MenuC.add(JspRead);
		//MenuC.add(readW);//将一个文本框加入面板之中
		
		writeW=new JTextArea();//新建一个文本框
		writeW.setBorder(BorderFactory.createTitledBorder("输入内容"));//给这个文本框添加标题
		MenuC.add(writeW);//将一个文本框加入面板之中
		writeW.setBounds(15, 380, 660, 200);//设置这个文本框的(x轴,y轴,长,宽)
		
		jbSend=new JButton("发送");//新建一个按钮
		jbSend.setBounds(550, 600, 100, 50);//设置这个按钮的位置大小
		MenuC.add(jbSend);//将一个组件加入面板之中
		
		jbExit=new JButton("退出");//新建一个按钮
		jbExit.setBounds(400, 600, 100, 50);//设置这个按钮的位置大小
		MenuC.add(jbExit);//将一个组件加入面板之中
		
		MenuC.setSize(750,700);//设置整个面板的大小
		MenuC.setVisible(true);//将整个面板设置为可见
		jbSend.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
            	Chat=writeW.getText();//获取聊天内容
            	try {
					Login.send();
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
            	writeW.setText("");
            }
        });
	}
}

用户对象包装类
package chat;

import java.io.Serializable;

public class User implements Serializable{
	public String name;
	public int power;
	public boolean talk;
	public String ip;
	public  User(String name) {
		this(name,1,true);//默认权限为1,可以发言
	}
	public  User(String name,int power,boolean talk) {
		this.name=name;
		this.power=power;
		this.talk=talk;
	}
}


你可能感兴趣的:(个人笔记)