您的位置:首页 > 编程语言 > Java开发

java实现多人聊天室

2017-11-26 12:55 316 查看
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<Client> 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);

            }

        }

    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: