聊天室

package chat;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 服务端
 * @author  Administrator
 *
 */
public class Server {
    public static void main(String[] args) {
        Server server = new Server();
        server.start();
    }
    ExecutorService threadPool;
    private ServerSocket serverSocket;
    private Map<String,PrintWriter> allOut;
    public Server(){
        threadPool = Executors.newFixedThreadPool(40);
        allOut = new HashMap<String,PrintWriter>();
        try{
            serverSocket = new ServerSocket(8088);
        }catch(Exception e){
            e.printStackTrace();
        }
    }
    private synchronized void addOut(String nickName,PrintWriter out){
        allOut.put(nickName, out);
    }
    private synchronized void removeOut(String nickName){
        allOut.remove(nickName);
    }
    private synchronized void sendMessage(String message){
        for(PrintWriter pw:allOut.values()){
            pw.println(message);
        }
    }
    private synchronized void sendMessageToOne(String nickName,String message){
        PrintWriter pw = allOut.get(nickName);
        if(pw!=null){
            pw.println(message);
        }
    }
    private class ClientHandler implements Runnable{
        private Socket socket;
        private String nickName;
        public ClientHandler(Socket socket){
            this.socket = socket;
        }
        public void run(){
            PrintWriter pw = null;
            try{
                pw = new PrintWriter(new OutputStreamWriter(socket.getOutputStream(),"utf-8"),true);
                nickName = getNickName();
                addOut(nickName,pw);
                Thread.sleep(100);
                sendMessage(nickName+"上线了!");
                sendMessage("当前在线人数:"+allOut.size());
                
                BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream(),"utf-8"));
                String message = null;
                while((message = br.readLine())!=null){
                    //查看是不是私聊
                    if(message.startsWith("\\")){
                        /*
                         * 私聊格式:\昵称:内容
                         */
                        //找到":"的位置
                        int index = message.indexOf(":");
                        //截取昵称
                        String name = message.substring(1,index);
                        String info = message.substring(index+1);
                        info = name+"对你说:"+info;
                        sendMessageToOne(name,info);
                        //发送完私聊后就不再进行广播了。
                        continue;
                    }
                    sendMessage(nickName+"说:"+message);
                }
            }catch(Exception e){
                //注释掉后客户端下线不会报异常。
                //e.printStackTrace();
            }finally{
                removeOut(nickName);
                sendMessage(nickName+"下线了!");
                sendMessage("当前在线人数:"+allOut.size());
                if(socket!=null){
                    try{
                        socket.close();
                    }catch(IOException e){
                        e.printStackTrace();
                    }
                }
            }
        }
        private String getNickName()throws Exception{
            try{
                PrintWriter pw = new PrintWriter(new OutputStreamWriter(socket.getOutputStream(),"utf-8"),true);
                BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream(),"utf-8"));
                String nickName = br.readLine();
                while(true){
                    if(nickName.trim().equals("")){
                        pw.println("FAIL");
                    }
                    if(allOut.containsKey(nickName)){
                        pw.println("FAIL");
                    }else{
                        pw.println("OK");
                        return nickName;
                    }
                    nickName = br.readLine();
                }
            }catch(Exception e){
                throw e;
            }
        }
    }
    public void start(){
        try{
            while(true){
                System.out.println("等待客户端连接。。。");
                Socket socket = serverSocket.accept();
                System.out.println("客户端已连接");
                ClientHandler hanlder = new ClientHandler(socket);
                threadPool.execute(hanlder);
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }    
}



package chat;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

/**
 * 客户端
 * @author  Administrator
 *
 */
public class Client {
    public static void main(String[] args) {
        Client client = new Client();
        client.start();
    }
    private Socket socket;
    public Client(){
        try {
            socket = new Socket("localhost",8088);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public void start(){
        Scanner scan = new Scanner(System.in);
        try {
            inputNickName(scan);
            ServerHandler handler = new ServerHandler();
            Thread t = new Thread(handler);
            t.setDaemon(true);
            t.start();
            
            PrintWriter pw = new PrintWriter(
            new OutputStreamWriter(socket.getOutputStream(),"utf-8"),true);
            while(true){
                pw.println(scan.nextLine());
            }
        } catch (Exception e){
            //注释掉后客户端下线不会报异常
            //e.printStackTrace();
        }finally{
            if(socket!=null){
                try{
                    socket.close();
                }catch(IOException e){
                    e.printStackTrace();
                }
            }
        }
    }
    class ServerHandler implements Runnable{
        public void run(){
            try{
                BufferedReader br = new BufferedReader(
                new InputStreamReader(socket.getInputStream(),"utf-8"));
                String message;
                while((message=br.readLine())!=null){
                    System.out.println(message);
                }
            }catch(Exception e){
                e.printStackTrace();
            }
        }
    }
    private void inputNickName(Scanner scan)throws Exception{
        String nickName = null;
            PrintWriter pw = new PrintWriter(
            new OutputStreamWriter(socket.getOutputStream(),"utf-8"),true);
            BufferedReader br = new BufferedReader(
            new InputStreamReader(socket.getInputStream(),"utf-8"));
        while(true){
            System.out.println("请输入昵称:");
            nickName = scan.nextLine();
            if(nickName.trim().equals("")){
                System.out.println("昵称不能为空!");
            }else{
                pw.println(nickName);
                String pass = br.readLine();
                if(pass!=null&&!"OK".equals(pass)){
                    System.out.println("昵称已被占用!");
                }else{
                    System.out.println("你好!"+nickName+"开始聊天吧!");
                    break;
                }
            }
        }    
    }
}

你可能感兴趣的:(java,聊天室,聊天软件)