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();
            }
            
        }
        
    }
    
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM