Java实现群聊(小型)

来源:互联网 发布:非农数据走势图片 编辑:程序博客网 时间:2024/06/05 13:27

Client 定义客户端

public class Client {    public static void main(String args[]) throws UnknownHostException,            IOException {        Socket client = new Socket("192.168.1.188", 10000);        // 穿件发送信息的线程        new ClientSend(client).start();        // 创建接收信息的线程        new ClientReceive(client).start();     // 因为要实现聊天功能,而不是只发送一次信息,所以输出流和客户端都不能关闭。        // client.shutdownOutput();        // client.close();    }}

ClientSend类 定义客户端向服务端发送消息的线程

public class ClientSend extends Thread {    private Scanner scanner;    private Socket socket;    public ClientSend(Socket socket) {        this.socket = socket;    }    @Override    public void run() {        scanner = new Scanner(System.in);        try {            PrintStream ps = new PrintStream(socket.getOutputStream());            String line = "";            // 阻塞式发送信息            while ((line = scanner.nextLine()) != null) {                ps.println(line);            }        } catch (IOException e) {            e.printStackTrace();        }    }}

ClientReceive 类 定义客户端接受服务端消息的线程

public class ClientReceive extends Thread {    private Socket socket;    public ClientReceive(Socket socket) {        this.socket = socket;    }    @Override    public void run() {        try {            BufferedReader br = new BufferedReader(new InputStreamReader(                    socket.getInputStream()));            // 按行接收信息            String line = "";            while ((line = br.readLine()) != null) {                System.out.println(line);            }        } catch (Exception e) {            e.printStackTrace();        }    }}

Server 类定义服务端 (客户端需要连接服务端,服务器需要最先开启)

public class Server {    public static void main(String[] args) throws IOException,            InterruptedException {        List<Socket> list = new ArrayList<>();        // 创建服务器端的套接字        ServerSocket server = new ServerSocket(10000);        while (true) {            // 接收客户端的阻塞方法            Socket socket = server.accept();            // 设计到多个线程可能会对集合进行增删的操作,要进行同步的处理            synchronized (list) {                list.add(socket);            }            // 启动一个新的线程去处理这个客户端的交流            new HandleSocket(socket, list).start();        }     // 因为不知道客户端什么时候发送信息,所以服务端要一直开启不能关闭。    }}

HandleSocket 类 对连接到服务端的客户端进行操作

public class HandleSocket extends Thread {    private Socket socket;    private List<Socket> list;    /**     * 构造方法     *      * @param socket     *            当前连接的客户端     * @param list     *            存储已连接客户端的集合     */    public HandleSocket(Socket socket, List<Socket> list) {        this.socket = socket;        this.list = list;    }    /**     * 线程run方法     */    @Override    public void run() {        InetAddress address = socket.getInetAddress(); // 获取连接到服务器的这的客户端的地址        String ip = address.getHostAddress();        System.out.println(ip + "上线了!");        if (ip.equals("192.168.1.117")) {            synchronized (list) {                sendToAll(ip + "由于违规操作,已被拉入黑名单!");                list.remove(socket);            }            return;        }        try {            BufferedReader br = new BufferedReader(new InputStreamReader(                    socket.getInputStream(), "gbk"));            String line = "";            while ((line = br.readLine()) != null) {                String msg = ip + ":" + line;                System.out.println(msg); // 输出到服务器端的控制台                // 把这个客户端说的话,发给其他所有的客户端                sendToAll(msg);            }        } catch (IOException e) {            // e.printStackTrace();            System.out.println(ip + "下线了!");            synchronized (list) {                list.remove(socket);            }        }    }    /**     * 把信息发送给所有的客户端,去除当前socket     *      * @param msg     *            发送的信息     */    private void sendToAll(String msg) {        synchronized (list) {            for (Socket s : list) {                if (s != socket) {                    try {                        PrintStream ps = new PrintStream(s.getOutputStream());                        ps.println();                    } catch (IOException e) {                        e.printStackTrace();                    }                }            }        }    }}


0 0
原创粉丝点击