java網絡編程之群聊功能

本文實例為大傢分享瞭java網絡編程之群聊功能的具體代碼,供大傢參考,具體內容如下

1、服務端

package networkCoding;
 
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.CopyOnWriteArrayList;
 
/**
 * 
 * 1, 指定端口,使用serverSocket創建服務器
 * 2, 阻塞式等待連接accept
 * 3, 操作:輸入輸出流操作
 * 4, 釋放資源
 * 
 * 5,加入容器實現群聊
 * 
 * **/
 
public class WeiHuShanChatRoomServer {
    private static CopyOnWriteArrayList<Chat> all= new CopyOnWriteArrayList<Chat>();
 
    public static void main(String[] args) throws IOException {
        System.out.println("-----server");
         // 1, 指定端口,使用serverSocket創建服務器
        ServerSocket server= new ServerSocket(9999);
         // 2, 阻塞式等待連接accept
        while(true) {
        Socket client=server.accept();
        Chat chat= new Chat(client);
        // 交給容器管理
        all.add(chat);
        new Thread(chat) .start();
        }
    }
    static class Chat implements Runnable{
        private DataOutputStream dos;
        private DataInputStream dis;
        private Socket client;
        private boolean isRuning;
        private String name;
        public Chat(Socket client) {
            this.client=client;
            this.isRuning=true;
            try {
                this.dis = new DataInputStream(client.getInputStream());
                this.dos=new DataOutputStream(client.getOutputStream());
                this.name=receive();
                this.send(this.name+",威虎山歡迎你的到來");
                this.sendOthers(this.name+"來到瞭威虎山",true);
            } catch (IOException e) {
                // 出錯釋放資源
                System.out.println("===1==");
                this.release();
            
            }
        }
        private String receive() {
            String data="";
            try {
                data= dis.readUTF();
            } catch (IOException e) {
                System.out.println("===2==");
                //this.release();
                
            }
            return data;
        }
        // 群聊
        private void send(String data) {
            try {
                dos.writeUTF(data);
                dos.flush();
            } catch (IOException e) {
                System.out.println("===3==");
                this.release();
                
            }
        }
        private void sendOthers(String data,boolean isSys) {
            boolean isPrivate = data.startsWith("@"); 
            if(isPrivate) {
                int index= data.indexOf(":");
                String targetName=data.substring(1,index);
                String msg=data.substring(index+1);
                for (Chat chat : all) {
                    if(chat.name.equals(targetName)) {
                        System.out.println("******"+chat.name+targetName);
                        chat.send(this.name+"悄悄對你說:"+msg);
                    }
                }
                
            }else {
                for (Chat chat : all) {
                    if(chat==this) {
                        continue;
                    }else {
                        if(isSys) {
                            chat.send(data);
                        }else {
                            chat.send(this.name+"對大傢說:"+data);
                        }
                    }
                    
                }
            }
            
        }
        private void release() {
            this.isRuning=false;
            Utils.close(dis,dos,client);
            all.remove(this);
            sendOthers(this.name+"離開瞭威虎山", true);
        }
        @Override
        public void run() {
            while(isRuning) {
                String data = receive();
                if(!data.equals("")) {
                     sendOthers(data,false);
                }else {
                    send("不能發送空消息");
                }
                
            }
            
        }
    }
 
}

2、客戶端

package networkCoding;
 
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;
 
/**
 * 
 * 1, 建立連接,使用socket 創建客戶端 + 服務端的地址端口號;
 * 2, 操作:輸入輸出流操作
 * 3, 釋放資源
 * 
 * **/
 
public class WeiHuShanChatRoomClient {
 
    public static void main(String[] args) throws UnknownHostException, IOException {
        BufferedReader bf= new BufferedReader(new InputStreamReader(System.in));
        System.out.println("請輸入姓名");
        String bfString = bf.readLine();
        //1, 建立連接,使用socket 創建客戶端 + 服務端的地址端口號;
        Socket client = new Socket("localhost",9999);
        // 2, 操作:輸入輸出流操作
        new Thread(new Send(client,bfString)).start();
        new Thread(new Receive(client)).start();
        
    }
    
 
}

(1)發送封裝類

package networkCoding;
 
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
 
public class Send implements  Runnable{
    private BufferedReader bf;
    private DataOutputStream dos;
    private Socket client;
    private boolean isRuning;
    private String name;
    public Send(Socket client,String name) {
        this.client=client;
        this.isRuning=true;
        this.name=name;
        this.bf= new BufferedReader(new InputStreamReader(System.in));
        try {
            this.dos=new DataOutputStream(client.getOutputStream());
            this.send(name);
        } catch (IOException e) {
            // 出錯釋放資源
            System.out.println("===4==");
            this.release();
            this.isRuning=false;
        }
    }
    private void release() {
        this.isRuning=false;
        Utils.close(dos,client);
    }
    private void send(String data) {
        try {
            dos.writeUTF(data);
            dos.flush();
        } catch (IOException e) {
            System.out.println("===5==");
            this.release();
            
        }
    }
    private String getString() {
        String dataString ="";
        try {
            dataString = this.bf.readLine();
        } catch (IOException e) {
            System.out.println("===6==");
            this.release();
        }
        return dataString;
    }
    
    @Override
    public void run() {
        // TODO Auto-generated method stub
        while(isRuning) {
            String data = getString();
            if(!data.equals("")) {
                send(data);
            }else {
                //send("不能發送空消息");
            }
            
        }
    }
 
}

(2)接收封裝類

package networkCoding;
 
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
 
public class Receive implements Runnable {
    private DataInputStream dis;
    private Socket client;
    private boolean isRuning;
    public Receive(Socket client) {
        this.client=client;
        this.isRuning=true;
        try {
            this.dis = new DataInputStream(client.getInputStream());
        } catch (IOException e) {
            // 出錯釋放資源
            System.out.println("===6==");
            this.release();
            this.isRuning=false;
        }
    }
    private String receive() {
        String data="";
        try {
            data= dis.readUTF();
        } catch (IOException e) {
            System.out.println("===7==");
            this.release();
        }
        return data;
    }
    private void release() {
        this.isRuning=false;
        Utils.close(dis,client);
    }
    @Override
    public void run() {
        while(isRuning) {
            String data = receive();
            if(!data.equals("")) {
                System.out.println(data);
            }else {
                
            }
            
        }
        
    }
 
    
 
}

3、工具類

package networkCoding;
 
import java.io.Closeable;
import java.io.IOException;
 
public class Utils {
    public static void main(String[] args) {
        
    }
    public static void close(Closeable...target) {
        for (Closeable obj : target) {
            try {
                if(null!=obj) {
                    obj.close();
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。

推薦閱讀: