服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - java网络编程之群聊功能

java网络编程之群聊功能

2022-12-19 20:44fire-fire-fox Java教程

这篇文章主要为大家详细介绍了java网络编程之群聊功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了java网络编程之群聊功能的具体代码,供大家参考,具体内容如下

1、服务端

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
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、客户端

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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)发送封装类

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
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)接收封装类

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
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、工具类

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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();
            }
        }
    }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/wangrong111222/article/details/103341378

延伸 · 阅读

精彩推荐