本文实例为大家分享了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