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

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

一、创建服务端

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

       

 

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

Logo

致力于链接即构和开发者,提供实时互动和元宇宙领域的前沿洞察、技术分享和丰富的开发者活动,共建实时互动世界。

更多推荐