JAVA聊天室-极简版

实现客户端和服务端的连接并且可以群聊*##“`

客户端

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

public class Client {

    private Socket socket;

    public Client() {
        try {
            System.out.println("正在启动客户端");
            socket = new Socket("localhost",8088);
            System.out.println("客户端启动成功");
        } catch (Exception  e) {

        }   
    }

    public void start() {
        try {

            OutputStream out = socket.getOutputStream();

            OutputStreamWriter osw = new OutputStreamWriter(out,"UTF-8");

            PrintWriter pw = new PrintWriter(osw,true);

            Scanner scan = new Scanner(System.in);
            String name;
            while(true) {
                System.out.println("输入用户名");
                name =scan.nextLine();
                if((name.length())>0) {
                    break;
                }else {
                    System.out.println("你输入的用户名不合法发");
                }
            }
            System.out.println("欢迎"+name+"加入聊天室");
            pw.println(name);

            ServerHandler handler =new ServerHandler();

            Thread t =  new Thread(handler);
            t.start();
            String message = null;

            while(true) {
                pw.println(scan.nextLine());
            }           
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }       
    }



    public static void main(String[] args) {

        try {
            Client c =new Client();
            c.start();
        }catch(Exception e) {
            System.out.println("启动客户端失败");
        }


    }


    //接收服务端发过来的消息,并输出
    class ServerHandler implements Runnable {
        public void run(){
            try {
                BufferedReader in =new BufferedReader(new InputStreamReader (socket.getInputStream(),"UTF-8"));
                String message =null;
                while((message=in.readLine())!=null) {
                    System.out.println(message);
                }   
            }catch(Exception e){

            }
        }
    }

}
服务端

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

public class Server {

    private ServerSocket server;

    private List<PrintWriter> allOut;

    public Server() {
        try {
            server  = new ServerSocket(8088);

            allOut = new ArrayList<PrintWriter>();
        }catch(Exception e) {

        }
    }
    private synchronized void  addOut(PrintWriter out ){
        allOut.add(out);
    }
    private synchronized void removeOut(PrintWriter out){
        allOut.remove(out);
    }
    private synchronized void sendMessage(String message) {
        for(PrintWriter out : allOut ){
            out.println(message);
        }
    }
    public void start() {
        try {
            while(true) {
                System.out.println("等待客户端连接");
                Socket socket = server.accept();
                System.out.println("客户端已经连接");

                ClientHandler handler = new ClientHandler(socket);

                Thread t =new Thread(handler);
                t.start();
            }
        }catch(Exception e) {

        }
    }
    public static void main(String[] args) {
        try {
            Server s =new Server();
            s.start();
        }catch(Exception e){

        }


    }
    class ClientHandler implements Runnable{

        private Socket socket;
        private String host;
        private String nickName;

        public ClientHandler(Socket socket) {
            this.socket=socket;
            InetAddress address = socket.getInetAddress();
            host=address.getHostAddress();
        }

        public void run() {
            PrintWriter pw =null;
            try {

                BufferedReader br =new BufferedReader(new InputStreamReader (socket.getInputStream(),"UTF-8"));
                nickName =br.readLine();
                System.out.println(nickName+"上线了"+"他的IP地址为"+host);

                pw = new PrintWriter( new OutputStreamWriter( socket.getOutputStream(),"UTF-8"),true);
                addOut(pw);

                String message =null;

                while((message =br.readLine())!=null) {
                    sendMessage(nickName+"说"+message);
                }
            }catch(Exception e) {

            }finally {
                System.out.println(nickName+"下线了");
                removeOut(pw);
                try {
                    socket.close();
                }catch(IOException e) {
                    e.printStackTrace();
                }
            }





        }
    }

}

猜你喜欢

转载自blog.csdn.net/LSummer_/article/details/80501460
今日推荐