java简易多用户聊天室

java Swing写的一个小Demo

Server

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

public class Server {
    static Boolean start = true;
    List<Client> clients = new ArrayList<Client>();

    public static void main(String[] args) {
        new Server().start();
    }

    public void start() {
        Socket s = null;
        ServerSocket serverSocket = null;
        try {
            serverSocket = new ServerSocket(8888);
            while (start) {
                s = serverSocket.accept();
                Client client = new Client(s);
                new Thread(client).start();
                clients.add(client);
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (serverSocket != null) {
                try {
                    serverSocket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    class Client implements Runnable {
        private Socket socket;
        private BufferedReader br;
        private PrintWriter pWriter;
        private String mes;

        public Client(Socket socket) {
            this.socket = socket;
            try {
                this.br = new BufferedReader(new InputStreamReader(
                        socket.getInputStream()));
                this.pWriter = new PrintWriter(socket.getOutputStream(),true);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void run() {
            try{
                while (start) {
                    while((mes=br.readLine())!=null){
                        System.out.println(mes);
                        for (int i = 0; i < clients.size(); i++) {
                            if(!this.equals(clients.get(i)))
                                clients.get(i).pWriter.println(mes);
                        }
                    }
                }
                }catch(Exception e){
                e.printStackTrace();
            }finally{

                try {
                    if (br!=null) {
                    br.close();
                    }
                    if(socket!=null){
                        socket.close();
                    }
                    if(this!=null){
                        clients.remove(this);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            }
        }

}

Client

import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.JTextArea;
import javax.swing.JLabel;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.SocketException;
import java.net.UnknownHostException;

public class ChatClient extends JFrame {
    JTextArea textArea;
    Socket socket;
    OutputStream oStream;
    PrintWriter pWriter;
    private JTextField textField;
    private boolean start;
    private BufferedReader bReader;

    public ChatClient() {
        getContentPane().setLayout(null);

        textArea = new JTextArea();
        textArea.setEditable(false);
        textArea.setBounds(10, 58, 414, 309);
        getContentPane().add(textArea);

        textField = new JTextField();
        textField.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                if (e.getKeyChar() == KeyEvent.VK_ENTER) {
                    String string = textField.getText();
                    if (!string.equals("")) {
                        textArea.append(string + "\n");
                        textField.setText("");
                        pWriter.println(string);
                    }
                }
            }
        });
        textField.setBounds(10, 377, 414, 21);
        getContentPane().add(textField);
        textField.setColumns(10);

        JLabel userName = new JLabel("userName");
        userName.setBounds(34, 33, 61, 15);
        getContentPane().add(userName);

        this.setSize(452, 446);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setVisible(true);
        this.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                super.windowClosing(e);
                disconnect();
                System.exit(0);

            }
        });

        new Thread() {
            String mesString;
            boolean start = true;

            @Override
            public void run() {
                try {
                    connect();
                    while (start) {
                        while ((mesString = bReader.readLine()) != null) {
                            textArea.append(mesString + "\n");
                        }
                    }
                } catch (SocketException e1) {

                } catch (IOException e) {
                    e.printStackTrace();
                }
            };
        }.start();
    }

    public void connect() {
        try {
            socket = new Socket("127.0.0.1", 8888);
            oStream = socket.getOutputStream();
            pWriter = new PrintWriter(oStream, true);
            bReader = new BufferedReader(new InputStreamReader(
                    socket.getInputStream()));
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void disconnect() {
        try {
            if (pWriter != null) {
                pWriter.close();
            }
            if (bReader != null) {
                bReader.close();
            }
            if (socket != null) {
                socket.close();
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        new ChatClient();
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值