Java聊天室——實現多人聊天、私聊、羣聊


客戶端

package project.java;
//客戶端
//輸入、輸出流分別爲處於一個線程

import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;

class OutToServer2 implements Runnable{
	private Socket client;
	
	public OutToServer2(Socket client) {
		super();
		this.client = client;
	}

	@Override
	public void run() {
		PrintStream printStream;
		try {
			printStream = new PrintStream(client.getOutputStream(),true);
			Scanner scanner = new Scanner(System.in);
			scanner.useDelimiter("\n");
			while(true) {
				System.out.println("請輸入:");
				while(scanner.hasNext()) {
					String string = scanner.nextLine();
					printStream.println(string);
					if(string.equals("拜拜")) {
						System.out.println("客戶端退出");
						printStream.close();
						scanner.close();
					    //client.close();
						break;
					}
				}
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
}

class ReadFromServer2 implements Runnable{
	private Socket client;
	public ReadFromServer2(Socket client) {
		super();
		this.client = client;
	}
	public void run() {
		try {
			Scanner scanner = new Scanner(client.getInputStream());
			scanner.useDelimiter("\n");
			while(scanner.hasNext()) {
				System.out.println("服務器端輸入:"+scanner.nextLine());
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
	
}

public class SingelClient2 {
	public static void main(String[] args) {
		String serverName = "127.0.0.1";
		int port = 6666;
		Socket client;
		try {
		    client = new Socket(serverName,port);
			Thread ouThread = new Thread(new OutToServer2(client));
			Thread inThread = new Thread(new ReadFromServer2(client));
			ouThread.start();
			inThread.start();
		} catch (Exception e) {

			e.printStackTrace();
		} 
	}
} 

服務器端

package project.java;

import java.io.IOException;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
//服務器端
/**
 * Map<String,Socket>
 * 用戶註冊:username:yyy
 * 羣聊:G:hello
 * 私聊:P:yyy-hhh
*/

class  ExcuteClientServer1 implements Runnable{
	private Socket client;
	private Map<String,Socket> clientMap;
	public ExcuteClientServer1(Socket client, Map<String, Socket> clientMap) {
		super();
		this.client = client;
		this.clientMap = clientMap;
	}

	public void run() {
		try {
			//拿到客戶端輸入流,讀取用戶信息
			Scanner scanner = new Scanner(client.getInputStream());
			String string = null;
			while(true){
				if(scanner.hasNext()) {
					string = scanner.nextLine();
					Pattern pattern = Pattern.compile("\r\n|\r|\n");
					Matcher matcher = pattern.matcher(string);
					string = matcher.replaceAll("");
					//用戶註冊
					if(string.startsWith("user")) {
						//獲取用戶名
						String useName = string.split("\\:")[1];
						userRegist(useName, client);
						continue;
					}
					//羣聊
					else if(string.startsWith("G")) {
						String message = string.split("\\:")[1];
						gropChat(message);
						continue;
					}
					//私聊
					else if(string.startsWith("P")) {
						String temp = string.split("\\:")[1];
						//取得用戶名
						String useName = temp.split("\\-")[0];
						//取得消息內容
						String message = temp.split("\\-")[1];
						privateChat(useName, message);
						continue;
					}
					//用戶退出
					else if(string.contains("拜拜")) {
						//先根據Socket知道用戶名
						String useName = getUseName(client);
						System.out.println("用戶名爲"+useName +"的用戶下線了!!!");
						clientMap.remove(useName);
						continue;
					}
				} 
			}
		}catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	//獲取key值(即由端口號找到用戶名)
	public String getUseName(Socket socket) {
		String useName = null;
		for(String getKey : clientMap.keySet()) {
			if(clientMap.get(getKey).equals(socket)) {
				useName = getKey;
			}
		}
		return useName;
	}
	//註冊實現
	public void userRegist(String useName,Socket client) {
		System.out.println("用戶姓名爲:" + useName);
		System.out.println("用戶socket爲:" + client);
		System.out.println("用戶名爲"+ useName +"的用戶上線了!");
		System.out.println("當前用戶數爲:"+ (clientMap.size()+1) +"人");
		clientMap.put(useName, client);
	}
	//羣聊實現
	public void gropChat(String message) {
		Iterator<Entry<String, Socket>> iterable = clientMap.entrySet().iterator();
		for(Map.Entry<String, Socket> stringSocketEntry:clientMap.entrySet()) {
			try {
				Socket socket = stringSocketEntry.getValue();
				PrintStream printStream = new PrintStream(socket.getOutputStream(),true);
	            System.out.println("用戶說"+message);	
	            printStream.println(message);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}
	}
	//私聊實現
	public void privateChat(String useName,String message) {
		//根據對應的useName找到對應的Socket
		Socket privateSocket = clientMap.get(useName);
		try {
			PrintStream printStream = new PrintStream(privateSocket.getOutputStream());
			printStream.println("用戶名爲"+getUseName(client)+"的用戶對你說:"+message);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

public class SingleServer2 {
	public static void main(String[] args) throws IOException {
		ServerSocket serverSocket = new ServerSocket(6666);
		//存取用戶信息(用戶名和Socket)
		Map<String, Socket> map = new HashMap<String, Socket>();
		//線程池,線程大小爲20
		ExecutorService executorService =Executors.newFixedThreadPool(20);
		System.out.println("等待客戶連接中...");
			try {
				for(int i = 0;i < 20;i ++) {
				Socket socket = serverSocket.accept();
				System.out.println("有新的用戶連接:"+socket.getInetAddress()+socket.getPort());
				executorService.execute(new ExcuteClientServer1(socket,map));
				}
				executorService.shutdown();
				serverSocket.close();
			} catch (Exception e) {
		}
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章