<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    march alex's blog
    hello,I am march alex
    posts - 52,comments - 7,trackbacks - 0
    這是我很多月以前學習馬士兵的Java教學視頻的時候在教程的基礎上稍微改進了一點的一個聊天室軟件。
    聊天室軟件分為ChatClient類和ChatServer類。
    ChatServer相當于一個服務器。
    ChatClient類相當于一個客戶端。
    用戶可以通過客戶端進行聊天。
    客戶端登錄時會詢問你的姓名,輸入姓名后大家就可以基于此聊天室軟件進行聊天了。

    CHatClient.java
    import java.awt.*;
    import java.awt.event.*;
    import java.io.*;
    import java.net.*;

    public class ChatClient extends Frame {
        Socket socket = null;
        DataOutputStream dos = null;
        DataInputStream dis = null;
        private boolean bConnected = false;
        private String name;
        //private boolean named = false;
        
        TextField tfTxt = new TextField();
        TextArea taContent = new TextArea();
        
        Thread tRecv = new Thread(new RecvThread());
        
        public static void main(String[] args) {
            new ChatClient().launchFrame();
            
        }
        
        public void launchFrame() {
            setLocation(400, 300);
            this.setSize(300, 300);
            add(tfTxt, BorderLayout.SOUTH);
            add(taContent, BorderLayout.NORTH);
            pack();
            this.addWindowListener(new WindowAdapter() {
                public void windowClosing(WindowEvent e) {
                    disconnect();
                    System.exit(0);
                }
            });
            
            setVisible(true);
            connect();
            
            tfTxt.addActionListener(new TFListener());
            
            //new Thread(new RecvThread()).start();
            tRecv.start();
        }
        
        public void connect() {
                try {
                    socket = new Socket("127.0.0.1", 8888);
                    dos = new DataOutputStream(socket.getOutputStream());
                    dis = new DataInputStream(socket.getInputStream());
                    System.out.println("connected!");
                    taContent.setText("你叫什么名字?\n");
                    bConnected  = true;
                } catch (UnknownHostException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
        }
        
        public void disconnect() {
            try {
                dos.close();
                dis.close();
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            /*
            try {
                bConnected = false;
                tRecv.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                try {
                    dos.close();
                    dis.close();
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            
    */
        }
        
        private class TFListener implements ActionListener {
            
            private boolean named = false;
            
            public void actionPerformed(ActionEvent e) {
                
                String str = tfTxt.getText().trim();
                //taContent.setText(str);
                tfTxt.setText("");
                
                if(named == false) {
                    named = true;
                    name = str;
                    try {
                        dos.writeUTF(name+" is coming!");
                        dos.flush();
                    } catch (IOException e1) {
                        e1.printStackTrace();
                    }
                    return;
                }
                
                try {
                    //dos = new DataOutputStream(socket.getOutputStream());
                    dos.writeUTF(name + ":" + str);
                    dos.flush();                    //dos.close();
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
            }
            
        } 
        
        private class RecvThread implements Runnable {
            
            private String name;

            public void run() {
                /*
                while(bConnected) {
                    try {
                        String str = dis.readUTF();
                        //System.out.println(str);
                        taContent.setText(taContent.getText()+str+'\n');
                    } catch (SocketException e) {
                        System.out.println("退出了,bye!");
                    } catch (EOFException e) {
                        System.out.println("退出了,bye - bye!");
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                
    */
                try {
                    while(bConnected) {
                        String str = dis.readUTF();
                        //System.out.println(str);
                        taContent.setText(taContent.getText()+str+'\n');
                    }
                } catch (SocketException e) {
                    System.out.println("退出了,bye!");
                } catch (EOFException e) {
                    System.out.println("退出了,bye - bye!");
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            
        }
        
    }

    ChatServer.java
    import java.io.*;
    import java.net.*;
    import java.util.*;

    public class ChatServer {
        boolean started = false;
        ServerSocket ss = null;
        
        List<Client> clients = new ArrayList<Client>();
        
        public static void main(String[] args) {
            new ChatServer().start();
        }
        
        public void start() {
            try {
                ss = new ServerSocket(8888);
                started = true;
            } catch (BindException e) {
                System.out.println("端口使用中");
                System.out.println("請關掉相應程序并重新運行服務器!");
                System.exit(0);
            } catch (IOException e) {
                e.printStackTrace();
            }
            
            try {
                while(started) {
                    Socket s = ss.accept();
                    Client c = new Client(s);
                    System.out.println("a client connected!");
                    new Thread(c).start();
                    clients.add(c);
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    ss.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            
        }
        
        class Client implements Runnable {
            private Socket s;
            private DataInputStream dis = null;
            private DataOutputStream dos = null;
            private boolean bConnected = false;
            
            public Client(Socket s) {
                this.s = s;
                try {
                    dis = new DataInputStream(s.getInputStream());
                    dos = new DataOutputStream(s.getOutputStream());
                    bConnected = true;
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            
            public void send(String str) {
                try {
                    dos.writeUTF(str);
                } catch (IOException e) {
                    clients.remove(this);
                    System.out.println("對方退出了!我從List里面去掉了!");
                    //e.printStackTrace();
                }
            }
            
            public void run() {
                try {
                    while(bConnected) {
                        String str = dis.readUTF();
                        System.out.println(str);
                        for(int i=0;i<clients.size();i++) {
                            Client c = clients.get(i);
                            c.send(str);
                        }
                        /*
                        for(Iterator<Client> it = clients.iterator(); it.hasNext(); ) {
                            Client c = it.next();
                            c.send(str);
                        }
                        
    */
                        /*
                        Iterator<Client> it = clients.iterator();
                        while(it.hasNext()) {
                            Client c = it.next();
                            c.send(str);
                        }
                        
    */
                    }    
                } catch (EOFException e) {
                    System.out.println("Client closed!");
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    try {
                        if(dis != null) dis.close();
                        if(dos != null) dos.close();
                        if(s != null) {
                            s.close();
                            s = null;
                        }
                    } catch (IOException e1) {
                        e1.printStackTrace();
                    }
                }
            }
        }
        
    }

    posted on 2015-03-09 08:39 marchalex 閱讀(576) 評論(0)  編輯  收藏 所屬分類: java小程序
    主站蜘蛛池模板: 亚洲国产成人久久精品动漫| 国产青草视频免费观看97| 亚洲精品无码专区在线在线播放| 高清免费久久午夜精品| 国产jizzjizz免费看jizz| 国产精品亚洲一区二区在线观看| 高清国语自产拍免费视频国产| 亚洲人成人网站18禁| 日韩在线免费电影| 亚洲AV日韩AV无码污污网站| 国产美女精品视频免费观看| 美女被暴羞羞免费视频| 亚洲精品无码激情AV| 久久精品成人免费国产片小草| 国产亚洲成av片在线观看| 十八禁无码免费网站| 亚洲a级成人片在线观看| 全免费a级毛片免费看不卡| 全黄A免费一级毛片| 亚洲国产a∨无码中文777| 久久成人免费播放网站| 亚洲成a人片毛片在线| 免费被黄网站在观看| 九九视频高清视频免费观看| 亚洲AV成人一区二区三区AV| 在线精品一卡乱码免费| 边摸边脱吃奶边高潮视频免费| 亚洲国产另类久久久精品黑人| 中文字幕免费观看| 美女被免费网站在线视频免费 | 成人午夜视频免费| www.av在线免费观看| 久久久久亚洲AV无码专区体验| 免费不卡视频一卡二卡| 国产精品亚洲专区无码唯爱网| 国产精品亚洲精品日韩已满| 1000部拍拍拍18免费网站| 成年网站免费入口在线观看| 久久夜色精品国产噜噜噜亚洲AV | 免费大片av手机看片高清| 亚洲人成人网站色www|