Java 简单模拟聊天功能的群聊

Java 简单模拟聊天功能的群聊

废话不多说直接上代码吧

首先是服务器端


import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
//聊天功能的服务器类
public class Server {

	public static List<BufferedWriter> list = new ArrayList();
	
	public static void start() throws Exception {
//		定义服务器应用的端口号
		ServerSocket ssocket = new ServerSocket(9000);
		System.out.println("服务器开启。。。");
		while(true) {
//			等待接收客户端连接进来
			Socket client =  ssocket.accept();
//			为了能接收多个客户端可以链接进来,因此需分别为每个客户端启动一条线程进行处理
			new Thread() {
				public void run() {
					try {
						System.out.println("有客户进来了》》》》");
//						获取读取客户端数据的流对象
						BufferedReader br =new BufferedReader(new InputStreamReader(client.getInputStream()));
//						获取往客户端写数据的流对象
						BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
//						把每个客户端的写数据的流对象保存到list 列表中,相当于加入到同一个聊天室
						list.add(bw);
						String data = null;
//						读取客户端发送过来的信息
						while((data = br.readLine()) !=  null) {
//							循环写出到聊天室内的每个客户端
							Iterator<BufferedWriter>  iterator = list.iterator();
							while(iterator.hasNext()) {
								BufferedWriter bw1  =iterator.next();
								try {
									bw1.write(data);
									bw1.newLine();
									bw1.flush();
								} catch (Exception e) {
//									如果有客户端中途退出聊天室,则删除该客户端的流对象
									iterator.remove();
								}
							}
						}
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
			}.start();
		}
	}
	
	public static void main(String[] args)  throws Exception{
		Server.start();
	}
}

然后是客户端


import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
//聊天功能的客户端类
public class ClientSide {

	public static void start() throws Exception {
//定义客户端的ip
		String ip = "127.0.0.1";
//		定义要链接的服务器的端口号
		int port = 9000;
//创建网络连接对象
		Socket socket = new Socket(ip, port);

		/**
		 * 发送消息
		 */
		new Thread() {
			public void run() {
				try {
//					获取往服务去写数据的流对象
					BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
//					监听键盘输入的流对象
					BufferedReader keyIn = new BufferedReader(new InputStreamReader(System.in));
					String data = null;
//					读取键盘输入的信息,并写出到服务去
					while ((data = keyIn.readLine()) != null) {
						System.out.println(data);
						bw.write(data);
						bw.newLine();
						bw.flush();
					}
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}.start();

		/**
		 * 接收消息
		 */
		new Thread() {
			public void run() {
				try {
					BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
					String data1 = null;
					while ((data1 = br.readLine()) != null) {
						System.out.println("服务器回复:"+data1);
					}
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}.start();
	}

	public static void main(String[] args) throws Exception {
		ClientSide.start();

	}
}

启动服务器后,在启动客户端(同时启动多个客户端),客户端之间就可以相互发消息了。

这是基本模拟群聊功能,还有很多可以改善和优化的地方,欢迎大家指正和评论。

你可能感兴趣的:(java基础)