用Java网络编程Socket编程实现群聊天室的功能,使用C/S平台

群聊天室是客户端连接服务器端之后,客户端向服务器端发送消息,然后服务器端接收到该客户端的消息之后,转发给其他的所有客户端的功能小程序。客户端需要输入自己的昵称,然后在群里发言,大家都能看见。
一、服务器端
1、先构建服务器端,开启服务器之后,客户端才能够进行连接

public class Server {
	//用客户端的昵称作为key
	Map<String,PrintWriter> allout;
	//添加start方法
	public void start() {
		allout=new HashMap<String, PrintWriter>();
		try {
			//在Start方法中用ServerSocket创建服务器
			ServerSocket server=new ServerSocket(8888);
			System.out.println("服务器已经成功创建,等待客户端连接");
			while(true) {
				//用accept()方法等待客户端连接
				Socket client=server.accept();
				System.out.println("有客户接入,IP地址为:"+client.getInetAddress());
				//启动线程
				new ClientThread(client, allout).start();
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	public static void main(String[] args) {
		//创建Server对象,并调用start方法
		Server server=new Server();
		server.start();
	}
}

2、建立接受客户端的消息和向客户端转发消息的线程

//向客户端发送消息,接受客户端发的消息
 class ClientThread extends Thread{
	 //连接到服务器端的客户端
	 Socket client;
	 Map<String,PrintWriter> allout;
	 //建立有参构造器
	public ClientThread(Socket client, Map<String, PrintWriter> allout) {
		super();
		this.client = client;
		this.allout = allout;
	}
	public void run() {
		//获取输入流对象
		try {
			OutputStream out=client.getOutputStream();
			//使用自动刷新的输出流
			PrintWriter pw=new PrintWriter(out);
			pw.println("欢迎来到新明天补习班");
			pw.println("请先输入学生姓名:");
			//强制刷新
			pw.flush();
			//接受客户端的 消息
			InputStream in=client.getInputStream();
			BufferedReader br=new BufferedReader(new InputStreamReader(in));
			//获取名字
			String name=br.readLine();
			//将名字和消息放入map集合
			allout.put(name, pw);
			String line=null;
			while((line=br.readLine())!=null) {
				//把信息发给当前除了自己的所有人
				sendMsg(name+"说"+line,pw);
			}
			br.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	private void sendMsg(String line, PrintWriter pw) {
		Set<String> names=allout.keySet();
		//遍历
		for(String name:names) {
			PrintWriter p=allout.get(name);
			if(p!=pw) {
				p.println(line);
				p.flush();
			}
		}
	}
 }

二、客户端
1、先建立客户端

public class Client {
	//添加Open方法
	public void open() {
		try {
			Socket client=new Socket("localhost",8888);
			System.out.println("已成功连接服务器");
			//获取客户端输入流对象
			InputStream in=client.getInputStream();
			new ReadFromServer(in).start();;
			//获取客户端输出流对象
			OutputStream out=client.getOutputStream();
			new WriteToServer(out).start();
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	public static void main(String[] args) {
		//建立Client对象,调用open()方法
		Client client=new Client();
		client.open();
	}
	
}

2、建立读取服务器所发送消息的线程

//读取服务器发送消息的线程
class ReadFromServer extends Thread{
	InputStream in;

	public ReadFromServer(InputStream in) {
		super();
		this.in = in;
	}
	public void run() {
		//缓冲字符输入流传入信息
		BufferedReader br=new BufferedReader(new InputStreamReader(in));
		String line=null;
		try {
			while((line=br.readLine())!=null) {
				System.out.println(line);
			}
			br.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

3、建立客户端向服务器发送消息的线程

//客户端向服务器发送消息的线程
class WriteToServer extends Thread{
	OutputStream out;

	public WriteToServer(OutputStream out) {
		super();
		this.out = out;
	}
	public void run() {
		Scanner key=new Scanner(System.in);
		PrintWriter p=new PrintWriter(out);
		while(true) {
			String line=key.nextLine();
			p.println(line);
			p.flush();
		}
	}
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值