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();
                }
                
            }
            
        }
        
    }
  • 相关阅读:
    atitit.TokenService v3 qb1 token服务模块的设计 新特性.docx
    Atitit attilax在自然语言处理领域的成果
    Atitit 图像清晰度 模糊度 检测 识别 评价算法 原理
    Atitit (Sketch Filter)素描滤镜的实现  图像处理  attilax总结
    atitit。企业的价值观 员工第一 vs 客户第一.docx
    Atitit 实现java的linq 以及与stream api的比较
    Atitit dsl exer v3 qb3 新特性
    Atititi tesseract使用总结
    Atitit 修改密码的功能流程设计 attilax总结
    atitit.TokenService v3 qb1  token服务模块的设计 新特性.docx
  • 原文地址:https://www.cnblogs.com/wuniaoheart/p/2870666.html
Copyright © 2011-2022 走看看