[JAVA]多人聊天室控制台实现,服务端向所有客户端下发消息实现


把项目分为五个模块:客户端,服务端,写入线程,读出线程,服务端向所有客户端写入线程。


读出线程

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.Socket;

public class ReadThread extends Thread 
{
	Socket socket;
	String client;
	public ReadThread(Socket socket,String client)
	{
		this.socket = socket;
		this.client = client;
	}
	public void run()
	{
		try {
			String line = "";
			BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			line = is.readLine();
			while (line != null)
			{
				System.out.println(client+" : "+line);
				line = is.readLine();
			}
			is.close();
			socket.close();
		} catch (Exception e) {
			System.out.println("Error : "+e);
		}
	}
}

写入线程


import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

public class WriteThread extends Thread 
{
	Socket socket = null;
	String client;
	public WriteThread(Socket socket,String client)
	{
		this.socket = socket;
		this.client = client;
	}
	public void run()
	{
		try {
			PrintWriter os = new PrintWriter(socket.getOutputStream());
			Scanner scanner = new Scanner(System.in);
			String readline = scanner.nextLine();
			while (readline != null)
			{
				os.println(readline);
				os.flush();
				readline = scanner.nextLine();
			}	
			os.close();
			socket.close();
		} catch (Exception e) {
			System.out.println("Error : "+e);
		}
	}
}
服务端向所有客户端下发消息线程,使用到了集合,socket的集合和printwriter的集合

import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
import java.util.Vector;

public class ServerWriteThread  extends Thread
{
	Vector<Socket> vector = null;
	Vector<PrintWriter> oosVector = null;
	public ServerWriteThread(Vector<Socket> vector)
	{
		this.vector = vector;
		oosVector = new Vector<PrintWriter>();
	}
	public void run()
	{
		try {
			while(true)
			{
				String line;
				Scanner scanner = new Scanner(System.in);
				line = scanner.nextLine();
				if (vector != null)
				{
					oosVector.clear();
					for (int i=0;i<vector.size();i++)
					{
						try {
							Socket socket = vector.elementAt(i);
							PrintWriter os = new PrintWriter(socket.getOutputStream());
							oosVector.addElement(os);
						} catch (Exception e) {
							vector.removeElement(i);
						}
					}
					for (int i=0;i<oosVector.size();i++)
					{
						PrintWriter oos = oosVector.elementAt(i);
						oos.println(line);
						oos.flush();
					}
				}
			}
		} catch (Exception e) {
			System.out.println("Error :"+e);
		}finally{
			//关闭各个连接
			if (oosVector != null)
			{
				for (int i=0;i<oosVector.size();i++)
				{
					PrintWriter obj = oosVector.remove(i);
					obj.close();
				}
			}
			if (vector != null)
			{
				for (int i=0;i<vector.size();i++)
				{
					Socket obj = vector.remove(i);
					try {
						obj.close();
					} catch (Exception e2) {
						System.out.println("socket关闭出现错误 " + e2);
					}
				}
			}
		}
	}
}

客户端

import java.net.Socket;
import java.util.Scanner;

public class MultiClient 
{
	public static void main(String[] args) //throws Exception
	{
		Scanner scanner = new Scanner(System.in);
		System.out.println("请输入客户端名称");
		String ClientName = scanner.next();
		try {
			Socket socket = new Socket("127.0.0.1",5200);
			Thread read = new ReadThread(socket,ClientName);
			Thread write = new WriteThread(socket,ClientName);
			read.start();
			write.start();
		} catch (Exception e) {
			System.out.println("Error :" + e);
		}
	}
}

服务端

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Vector;

public class MultiServer 
{
	ServerSocket serverSocket = null;
	boolean listening = true;
	int cliennum = 0;
	Vector<Socket> vector = new Vector<Socket>();
	public MultiServer()
	{
		try {
			serverSocket = new ServerSocket(5200);
			System.out.println("服务端启动");
			ServerWriteThread write = new ServerWriteThread(vector);	//向所有客户端发送同一消息
			write.start();
			while (listening)
			{
				Socket socket = serverSocket.accept();
				cliennum++;
				vector.addElement(socket);  //将收到的socket加入到集合中
				System.out.println("接收到 : "+cliennum+" 客户端");
				String client = "从客户端["+cliennum+"]:"+"读取";
				Thread read = new ReadThread(socket, client);
				read.start();
			}
		} catch (IOException e) {
			System.out.println("无法监听到端口");
			System.exit(-1);
		}
		try {
			serverSocket.close();
		} catch (Exception e) {
			System.out.println(e.toString());
		}
	}
	public static void main(String[] args)
	{
		new MultiServer();
	}
}



 /*

******逸雨清风 出品

*/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值