Java 编写一个简单的客户端和服务端聊天室

聊天室是一个利用网络编写的一个应用服务端程序

每个客户端先连接服务器,然后任意客户端发消息,都会经过服务器处理,然后服务器将消息分发个每个连接上的客户端

一、创建服务端

public class SimpleChatServer {


    ArrayList clientOutPutStreams = new ArrayList();

    public class ClientHandler implements Runnable
    {
        BufferedReader reader;
        Socket socket;

        public ClientHandler(Socket clientSocket)
        {
            try {
                //与socket建立输入流
                this.socket = clientSocket;
                InputStreamReader inputStreamReader = new InputStreamReader(socket.getInputStream());
                reader = new BufferedReader(inputStreamReader);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void run()
        {
            String message = null;
            try
            {
                //不断地从socket上读入数据
                while ((message = reader.readLine()) != null)
                {
                    System.out.println("read " + message);
                    //将数据发送给每一个客户端
                    tellEveryone(message);
                }
            }catch (Exception e)
            {
                e.printStackTrace();
            }

        }
    }

    public static void main(String[] args) {
       new SimpleChatServer().go();
    }

    public void go()
    {
        try {
            //服务器应用程序对特定的端口号创建ServerSocket
            ServerSocket serverSocket = new ServerSocket(5000);
            while (true)
            {
                //服务器创建出与客户端通信的socket
                Socket clientSocket = serverSocket.accept();
                //与socket建立输出流
                PrintWriter printWriter = new PrintWriter(clientSocket.getOutputStream());
                clientOutPutStreams.add(printWriter);
                //开启一个线程
                Thread thread = new Thread(new ClientHandler(clientSocket));
                thread.start();
                System.out.println("服务器得到一个连接");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void tellEveryone(String message)
    {
        Iterator it = clientOutPutStreams.iterator();
        while (it.hasNext())
        {
            try
            {
                PrintWriter writer = (PrintWriter)it.next();
                writer.println(message);
                writer.flush();
            }catch (Exception e)
            {
                e.printStackTrace();
            }
        }
    }

}

二、编写客户端A和B

public class SimpleChatClientA
{
    JTextArea incoming;              //文本域
    JTextField  outgoing;           //输入框
    BufferedReader reader;   //缓冲输入字符流
    PrintWriter writer;              //输出字符流
    Socket socket;

    public static void main(String[] args)
    {
        new SimpleChatClientA().go();
    }

    public void go()
    {
        JFrame jFrame = new JFrame("simple chat clientA");
        JPanel jPanel = new JPanel();


        //创建文本域
        incoming = new JTextArea(15,30);
        incoming.setLineWrap(true);      //设置在行过长的时候是否要自动换行
        incoming.setWrapStyleWord(true);  //设置在单词过长的时候是否要把长单词移到下一行
        incoming.setEditable(false);

        //创建滚动面板,并将文本域放入其中
        JScrollPane jScrollPane = new JScrollPane(incoming);
        jScrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        jScrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);

        //创建输入框
        outgoing = new JTextField(20);

        //创建发送按钮,并创建监听器
        JButton sendButton = new JButton("send");
        sendButton.addActionListener(new sendButtonListener());

        //将上面组件放入JPanel容器中
        jPanel.add(jScrollPane);
        jPanel.add(outgoing);
        jPanel.add(sendButton);

        //与服务器建立连接
        setUpNetworking();

        //开启一个线程,并执行run方法
        Thread thread = new Thread(new IncomingReader());
        thread.start();

        //将JPanel容器放入JFrame面板中
        jFrame.getContentPane().add(BorderLayout.CENTER,jPanel);
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jFrame.setSize(400,400);
        jFrame.setVisible(true);

    }

    /**
     * 与服务器建立socket连接,并在socket的基础上建立输入、输出流
     */
    private void setUpNetworking()
    {

        try {
            //与服务器建立socket连接
            socket = new Socket("127.0.0.1",5000);

            //与socket建立字符输入缓冲流
            InputStreamReader inputStreamReader = new InputStreamReader(socket.getInputStream());
            reader = new BufferedReader(inputStreamReader);

            //与socket建立字符输出流
            writer = new PrintWriter(socket.getOutputStream());
            incoming.append("客户端A 成功连接服务器......" + "\n");
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    /**
     * 监听器
     */
    class sendButtonListener implements ActionListener
    {
        @Override
        public void actionPerformed(ActionEvent e)
        {
            //当发送按钮点击,则触发事件,将输入框中的文字获取,并输出到服务器
            writer.println("客户端A: " + outgoing.getText());
            writer.flush();
            //输入框文字清空
            outgoing.setText("");
            outgoing.requestFocus();
        }
    }

    /**
     * 该线程任务是不断地读取服务器的信息,并把它加载到文本域中
     */
    class IncomingReader implements Runnable
    {

        @Override
        public void run()
        {
                String message;
                try {
                    while ((message = reader.readLine()) != null)
                    {
                        System.out.println("read " + message);
                        incoming.append(message + "\n");
                    }
                }catch (Exception e)
                {
                    e.printStackTrace();
                }
        }
    }
}

 

public class SimpleChatClientB
{
    JTextArea incoming;              //文本域
    JTextField  outgoing;           //输入框
    BufferedReader reader;   //缓冲输入字符流
    PrintWriter writer;              //输出字符流
    Socket socket;

    public static void main(String[] args)
    {
        new SimpleChatClientB().go();
    }

    public void go()
    {
        JFrame jFrame = new JFrame("simple chat clientB");
        JPanel jPanel = new JPanel();


        //创建文本域
        incoming = new JTextArea(15,30);
        incoming.setLineWrap(true);      //设置在行过长的时候是否要自动换行
        incoming.setWrapStyleWord(true);  //设置在单词过长的时候是否要把长单词移到下一行
        incoming.setEditable(false);

        //创建滚动面板,并将文本域放入其中
        JScrollPane jScrollPane = new JScrollPane(incoming);
        jScrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        jScrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);

        //创建输入框
        outgoing = new JTextField(20);

        //创建发送按钮,并创建监听器
        JButton sendButton = new JButton("send");
        sendButton.addActionListener(new sendButtonListener());

        //将上面组件放入JPanel容器中
        jPanel.add(jScrollPane);
        jPanel.add(outgoing);
        jPanel.add(sendButton);

        //与服务器建立连接
        setUpNetworking();

        //开启一个线程,并执行run方法
        Thread thread = new Thread(new IncomingReader());
        thread.start();

        //将JPanel容器放入JFrame面板中
        jFrame.getContentPane().add(BorderLayout.CENTER,jPanel);
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jFrame.setSize(400,400);
        jFrame.setVisible(true);

    }

    /**
     * 与服务器建立socket连接,并在socket的基础上建立输入、输出流
     */
    private void setUpNetworking()
    {

        try {
            //与服务器建立socket连接
            socket = new Socket("127.0.0.1",5000);

            //与socket建立字符输入缓冲流
            InputStreamReader inputStreamReader = new InputStreamReader(socket.getInputStream());
            reader = new BufferedReader(inputStreamReader);

            //与socket建立字符输出流
            writer = new PrintWriter(socket.getOutputStream());
            incoming.append("客户端B 成功连接服务器.........." + "\n");
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    /**
     * 监听器
     */
    class sendButtonListener implements ActionListener
    {
        @Override
        public void actionPerformed(ActionEvent e)
        {
            //当发送按钮点击,则触发事件,将输入框中的文字获取,并输出到服务器
            writer.println("客户端B: " + outgoing.getText());
            writer.flush();
            //输入框文字清空
            outgoing.setText("");
            outgoing.requestFocus();
        }
    }

    /**
     * 该线程任务是不断地读取服务器的信息,并把它加载到文本域中
     */
    class IncomingReader implements Runnable
    {

        @Override
        public void run()
        {
                String message;
                try {
                    while ((message = reader.readLine()) != null)
                    {
                        System.out.println("read " + message);
                        incoming.append(message + "\n");
                    }
                }catch (Exception e)
                {
                    e.printStackTrace();
                }
        }
    }
}

三、先开启服务端、在开启客户端A和B

       

 

客户端发送信息后,服务端会读取,然后分发给每个客户端

  • 17
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
好的,以下是一个简单Java聊天室: 1. 服务端 服务端可以使用JavaSocket和ServerSocket类来实现。以下是一个简单服务端代码: ```java import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.List; public class Server { private final int PORT = 8080; private List<ClientHandler> clients = new ArrayList<>(); public void start() { try { // 创建一个ServerSocket,监听指定端口 ServerSocket serverSocket = new ServerSocket(PORT); System.out.println("Server started on port " + PORT); while (true) { // 等待客户端连接 Socket clientSocket = serverSocket.accept(); System.out.println("New client connected: " + clientSocket); // 创建一个新的ClientHandler,并将其加入到列表中 ClientHandler clientHandler = new ClientHandler(clientSocket, this); clients.add(clientHandler); // 开启一个新的线程来处理该客户端的请求 new Thread(clientHandler).start(); } } catch (IOException e) { e.printStackTrace(); } } public void broadcast(String message) { // 将消息广播给所有客户端 for (ClientHandler client : clients) { client.sendMessage(message); } } public void removeClient(ClientHandler client) { // 将指定客户端从列表中移除 clients.remove(client); } public static void main(String[] args) { new Server().start(); } } ``` 2. 客户端 客户端也可以使用JavaSocket类来实现。以下是一个简单客户端代码: ```java import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; public class Client { private final String HOST = "localhost"; private final int PORT = 8080; private Socket socket; private BufferedReader in; private PrintWriter out; public void start() { try { // 创建一个Socket,连接到指定地址和端口 socket = new Socket(HOST, PORT); System.out.println("Connected to server on " + HOST + ":" + PORT); // 获取输入输出流 in = new BufferedReader(new InputStreamReader(socket.getInputStream())); out = new PrintWriter(socket.getOutputStream(), true); // 开启一个新的线程来接收服务器发送的消息 new Thread(new ServerListener()).start(); // 从命令行读取用户输入,并将其发送给服务器 BufferedReader console = new BufferedReader(new InputStreamReader(System.in)); while (true) { String input = console.readLine(); out.println(input); } } catch (IOException e) { e.printStackTrace(); } finally { try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } private class ServerListener implements Runnable { @Override public void run() { try { while (true) { String message = in.readLine(); System.out.println(message); } } catch (IOException e) { e.printStackTrace(); } } } public static void main(String[] args) { new Client().start(); } } ``` 3. 客户端处理器 客户端处理器负责处理客户端的请求并将其转发给其他客户端。以下是一个简单客户端处理器代码: ```java import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; public class ClientHandler implements Runnable { private Socket clientSocket; private Server server; private BufferedReader in; private PrintWriter out; public ClientHandler(Socket clientSocket, Server server) { this.clientSocket = clientSocket; this.server = server; } @Override public void run() { try { // 获取输入输出流 in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); out = new PrintWriter(clientSocket.getOutputStream(), true); while (true) { String input = in.readLine(); if (input == null) { break; } // 将接收到的消息转发给其他客户端 server.broadcast(input); } } catch (IOException e) { e.printStackTrace(); } finally { try { // 关闭输入输出流和客户端Socket in.close(); out.close(); clientSocket.close(); // 将该客户端服务器中移除 server.removeClient(this); } catch (IOException e) { e.printStackTrace(); } } } public void sendMessage(String message) { // 将消息发送给该客户端 out.println(message); } } ``` 以上就是一个简单Java聊天室。当然,在实际开发中,你还需要考虑消息的编码和解码、用户认证和安全等问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值