zoukankan      html  css  js  c++  java
  • Java实现多个客户端聊天程序

    复习了一天Java。晚上写了一个HeartChat 0.1,实现多个客户端相互聊天的机制。代码如下:

    import java.io.*;
    import java.net.*;
    import java.util.*;
    
    
    public class HeartServer {
         
        /*
         * 成员变量闪亮登场
         */
        List<ClientThread> clients = new ArrayList<ClientThread>();
        
        /**
         * 这系入口啊,向这里看齐...
         * @param args
         */
        public static void main(String[] args) {
            new HeartServer().start();
        }
        
        /**
         * 启动服务器中...
         *
         */
        public void start(){
            try {
                boolean iConnect = false;
                ServerSocket ss = new ServerSocket(1720);
                iConnect = true;
                while(iConnect){
    System.out.println("绑定服务器端口成功!");
                    Socket s = ss.accept();
                    ClientThread currentClient = new ClientThread(s);//创建线程引用
    System.out.println("发现客户端!");
                    clients.add(currentClient);//把当前客户端加入集合
                    new Thread(currentClient).start();
    System.out.println("客户端进程已经启动!");
                }
            } catch (IOException e) {
                System.out.println("IOException");
                e.printStackTrace();
            }
        }
        
        /**
         * 给每个客户端留个家(客户端的进程)
         *
         */
        class ClientThread implements Runnable {
            /*
             * 成员变量又来啦...
             */
            private Socket s;
            private DataInputStream dis;
            private DataOutputStream dos;
            private String str;
            private boolean iConnect = false;
            
            /**
             * 小构一下
             */
            ClientThread(Socket s){
                this.s = s;
                iConnect = true;
            }
            
            public void run(){
    System.out.println("run方法启动了!");
                try {
                    
                    while(iConnect){
    System.out.println("RUN方法中的while循环启动,正在等待客户端的发送消息...");
                        dis = new DataInputStream(s.getInputStream());
                        str = dis.readUTF();
    System.out.println(str);
                        for(int i=0; i<clients.size(); i++){
    System.out.println("转发消息中..."+i);
                            ClientThread c = clients.get(i);
                            c.sendMsg(str);
                        }
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
                
            }
            
            /**
             * 转发消息,我做主...
             * 将送至服务器的消息发送给每个连接到的客户端
             */
            public void sendMsg(String str){
                try {
    System.out.println("创建输出管道!");
                    dos = new DataOutputStream(this.s.getOutputStream());
    System.out.println("正在向客户端写消息!");
                    dos.writeUTF(str);
    System.out.println("正在向客户端写消息成功!");            
                } catch (IOException e) {
                    e.printStackTrace();
                }
                
            }
            
        }
        
    }
    import java.awt.*;
    import java.awt.event.*;
    import java.io.*;
    import java.lang.*;
    import java.net.*;
    
    public class HeartClient extends Frame {
    
        /*
         *  成员方法出场...
         */
        private TextField tfText;
        private TextArea taContent;
        private Socket s;
        private DataOutputStream dos;
        private DataInputStream dis;
        
        /**
         * 注意,入口... ^^
         * @param args
         */
        public static void main(String[] args) {
            new HeartClient().launchFrame();
            
        }
        
        /**
         * Loading GU
         */
        public void launchFrame(){
            tfText = new TextField();
            taContent = new TextArea();
            this.setSize(300,300);
            this.setLocation(300,300);
            this.tfText.addActionListener(new TFListener());
            this.add(tfText,BorderLayout.SOUTH);
            this.add(taContent,BorderLayout.NORTH);
            this.addWindowListener(new WindowAdapter(){
                @Override
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }});
            this.pack();
            this.connect();
            this.setVisible(true);
        }
    
        /**
         * 我在努力地连接服务器中...
         */
        public void connect() {
            try {
                s = new Socket("127.0.0.1",1720);
                dos = new DataOutputStream(s.getOutputStream());
                dis = new DataInputStream(s.getInputStream());
                new Thread(new SendThread()).start();
    //            dos.writeUTF("Hello,i find u!");
            } catch (UnknownHostException e) {
                System.out.println("UnknownHostException");
                e.printStackTrace();
            } catch (IOException e) {
                System.out.println("IOException");
                e.printStackTrace();
            }finally{
                //关闭啥尼...
            }
            
        }
    
        /**
         * 额不会傻等着tfText(TextField tfText的监听器类)
         */
        class TFListener implements ActionListener{
            private String str;
            @Override
            public void actionPerformed(ActionEvent e) {
                str = tfText.getText().trim();
                tfText.setText("");
                try {
                    dos.writeUTF(str);
                } catch (IOException e1) {
                    System.out.println("IOException");
                    e1.printStackTrace();
                }
            }
            
        }
        
        /**
         * 客户端接收消息的线程呦...
         *
         */
        class SendThread implements Runnable{
            private String str;
            private boolean iConnect = false;
            
            public void run(){
                iConnect = true;
                recMsg();
                
            }
            
            /**
             * 消息,看招,哪里跑...(客户端接收消息的实现)
             * @throws IOException 
             */
            public void recMsg() {
                try {
                    while(iConnect){
                        str = dis.readUTF();
                        taContent.setText(str);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
                
            }
            
        }
        
    }
  • 相关阅读:
    TCP 窗口缩放、时间戳和 SACK
    对微前端的11个错误认识
    终于解决了使用Python装饰器的一个痛点
    go使用mongo
    获取鼠标当前元素
    console控制台屏蔽console
    httpx使用HTTP/2
    go解析未知结构的json
    python字典转对象
    .::Best Musica Paradisa::.
  • 原文地址:https://www.cnblogs.com/wuniaoheart/p/2870666.html
Copyright © 2011-2022 走看看