java实现多人聊天室

package my.tcp;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.BindException;
import java.net.Socket;
import java.util.Scanner;

public class Client {
    private Socket client = null;
    private String name = null;
    public static void main(String[] args) {
        new Client().connect();
    }
    
    public void connect() {
        try {
            client = new Socket("localhost", 8888);
            Scanner in = new Scanner(System.in);
            System.out.print("请输入名字:");
            name = in.next();
            new Thread(new Send(client, name)).start();
            new Thread(new Receive(client)).start();
        } catch(BindException e) {
            System.out.println("端口已被占用");
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
}




package my.tcp;

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

public class Send implements Runnable {
    private String name;
    private DataOutputStream dos = null;
    private boolean isRunning = true;
    
    public Send(Socket client,String name) {
        try {
            dos = new DataOutputStream(client.getOutputStream());
            this.name = name;
        } catch (Exception e) {
            e.printStackTrace();
            isRunning = false;
            CloseUtil.closeall(dos);
        }
    }
    public void send() {
        Scanner in = new Scanner(System.in);
        String msg = in.next();
        try {
            dos.writeUTF(name + ":" + msg);
        } catch (Exception e) {
            e.printStackTrace();
            isRunning = false;
            CloseUtil.closeall(dos);
        }
    }
    @Override
    public void run() {
        while(isRunning) {
            send();
        }
    }
}


package my.tcp;

import java.io.DataInputStream;
import java.io.IOException;
import java.net.Socket;

public class Receive implements Runnable {
    private DataInputStream dis = null;
    private boolean isRunning = true;
    
    public Receive(Socket client) {
        try {
            dis = new DataInputStream(client.getInputStream());
        } catch(Exception e) {
            e.printStackTrace();
            isRunning = false;
            CloseUtil.closeall(dis);
        }
    }
    
    public void receive() {
        try {
            String msg = dis.readUTF();
            System.out.println(msg);
        } catch (Exception e) {
        
            e.printStackTrace();
            isRunning = false;
            CloseUtil.closeall(dis);
        }
    }
    @Override
    public void run() {
        while(isRunning) {
            receive();
        }
    }
}

package my.tcp;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.IOException;
import java.net.BindException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Server {
    private ServerSocket server = null;
    private Socket client = null;
    private  List list = new ArrayList<>();
    
    public static void main(String[] args) {
        new Server().connect();
    }
    
    public  void connect() {
        try{
            server = new ServerSocket(8888);
            while(true) {
                client = server.accept();
                System.out.println("一个客户端连接上来了");
                Client c = new Client(client);
                list.add(c);
                new Thread(c).start();
            }
        } catch(BindException e) {
            System.out.println("端口已被占用");
        } catch(Exception e) {
            e.printStackTrace();
            CloseUtil.closeall(server);
        }
    }
    class Client implements Runnable {
        private DataOutputStream dos = null;
        private DataInputStream dis = null;
        private boolean isRunning= true;

        public Client(Socket client) {
            try {
                dos = new DataOutputStream(client.getOutputStream());
                dis = new DataInputStream(client.getInputStream());
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                isRunning = false;
                CloseUtil.closeall(dos, dis);
            }
        }
        
        @Override
        public void run() {
            while(isRunning) {
                sendOthers();
            }
        }
        
        public String  receive() {
            String message = "";
            try {
                message = dis.readUTF();
            } catch(EOFException e) {
                System.out.println("一个用户退出");
                isRunning = false;
                CloseUtil.closeall(dos, dis);
                list.remove(this);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return message;
        }

        public void sendOthers() {
            String msg = receive();
            
            for (Client c : list) {
                if (c == this) {
                    continue;
                }
                c.send(msg);
            }
        }
        
        public void send(String msg) {
            try {
                dos.writeUTF(msg);
                dos.flush();
            } catch(Exception e) {
                e.printStackTrace();
                isRunning = false;
                CloseUtil.closeall(dos, dis);
                list.remove(this);
            }
        }
    }
}



你可能感兴趣的:(java)