千家信息网

java怎么实现群聊功能

发表于:2025-01-16 作者:千家信息网编辑
千家信息网最后更新 2025年01月16日,这篇文章主要介绍"java怎么实现群聊功能"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"java怎么实现群聊功能"文章能帮助大家解决问题。1、服务端packa
千家信息网最后更新 2025年01月16日java怎么实现群聊功能

这篇文章主要介绍"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 all= new CopyOnWriteArrayList();     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();            }        }    }}

关于"java怎么实现群聊功能"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注行业资讯频道,小编每天都会为大家更新不同的知识点。

0