Java SE——实现多人聊天室

客户端
package chatroom_singal;

import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Map;
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 GroupClient {  
    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 chatroom_singal;

import java.io.IOException;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
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;

import javax.swing.text.html.HTMLDocument.Iterator;

//服务端

class ExcuteClientServer1 implements Runnable
{
	private Socket client;
	private Map<String, Socket> clientMap;
	public ExcuteClientServer1(Socket client,Map<String, Socket> clientMap) {
		// TODO Auto-generated constructor stub
		super();
		this.client = client;
		this.clientMap = clientMap;
	}
	
	@Override
	public void run() {
		// TODO Auto-generated method stub
		//拿到客户输入流,读取用信息
		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("userName"))
					{
						String userName = string.split("\\:")[1];
						userRegist(userName,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 userName = temp.split("\\-")[0];
						//取得消息内容
						String message = temp.split("\\-")[1];
						privateChat(userName,message);
						continue;					
					}
					//用户退出
					//此时有 Socket,需要找出对应的key
					else if (string.contains("bye")) {
						//先根据Socket知道用户名
						String userName = getUseName(client);
						System.out.println("用户"+userName+"下线了。。。");
						System.out.println("当前在线人数为"+clientMap.size());
						clientMap.remove(userName);
						continue;
					}				
				}
			}
			
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		
	}

	//获取Key值,即由端口号找到用户名
	private String getUseName(Socket socket) {
		// TODO Auto-generated method stub
		String useName = null;
		for(String getKey : clientMap.keySet())
		{
			if(clientMap.get(getKey).equals(socket))
			{
				useName = getKey;
			}
		}
		return useName;
	}

	//私聊
	private void privateChat(String useName, String message) {
		// TODO Auto-generated method stub
		//根据对应的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();  
        }  
    }  

	//群聊
	private void gropChat(String message) {
		// TODO Auto-generated method stub
		java.util.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();  
            }  
              
        }  
	}

	//注册
	private void userRegist(String userName, Socket client) {
		// TODO Auto-generated method stub
		System.out.println("用户名为:"+userName);
		System.out.println("用户Socket为:"+client);
		System.out.println("用户名为"+userName+"上线了!!!");
		System.out.println("当前用户为"+(clientMap.size()+1)+"人");
		clientMap.put(userName, client);
	}
}

public class GroupServer {
	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) {  
        }  
	}

}

猜你喜欢

转载自blog.csdn.net/L_X_Y_HH/article/details/80633819