[JAVA]多人聊天室控制檯實現,服務端向所有客戶端下發訊息實現

逸雨清風發表於2013-05-19

把專案分為五個模組:客戶端,服務端,寫入執行緒,讀出執行緒,服務端向所有客戶端寫入執行緒。


讀出執行緒

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



 /*

******逸雨清風 出品

*/


相關文章