java socket 单服务器多客户端实时通信
想用JAVA做一个服务器,请问怎么利用TCP和线程,实现多个客户端同时在线,能与服务器进行交互?
服务器监听端口 做个无限循环 接到一个连接就创建一个通道线程,并将通道线程存储到一个list集合中
|
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
|
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.ServerSocket;import java.net.Socket;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Date;import java.util.List;/* * 4.用socket通讯写出多个客户端和一个服务器端的通讯, * 要求客户发送数据后能够回显相同的数据(回显功能)(实用TCP方式)。 */public class Test4Server { // 主入口 public static void main(String[] args) throws IOException { scoketServer(); } // 开启的tcp8888监听端口 public static void scoketServer() throws IOException { ServerSocket server = new ServerSocket(8888); while (true) { // 未连通前线程阻塞,连通后开启一个socket通道线程后继续监听8888端口 Socket socket = server.accept(); System.out.println(socket.getInetAddress().getHostAddress() + "连接进入"); new SocketThread(socket).start(); } } }// 一个服务器端口中监听多个客服端通道线程class SocketThread extends Thread {// 所有通道写入流的集合 private static List<PrintWriter> list =new ArrayList<PrintWriter>(); private BufferedReader bufferedReader; private PrintWriter printWriter; public SocketThread(Socket socket) throws IOException { this.bufferedReader = new BufferedReader(new InputStreamReader(socket .getInputStream())); this.printWriter = new PrintWriter(socket.getOutputStream()); list.add(printWriter); } @Override public void run() { String string = null; while (true) { try { // 服务器在通道中读到的信息回显给客服端 string = bufferedReader.readLine(); System.out.println("客服端信息:" + string); for(PrintWriter printWriter:list ){ printWriter.write("服务器回显:" + string + "\r\n"); printWriter.flush(); } } catch (IOException e) { } } }} |
客服端代码 可以用在局域网中用多台来连接测试
|
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
|
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.Socket;import java.util.Scanner;public class Test4Client { public static Object obj = new Object(); // 客服端的主入口 public static void main(String[] args) throws IOException { socketClient(); } // 与服务器连通地址本机(127.0.0.1),局域网中其他机器是(服务器在局域网中的ip地址) 端口都是8888 public static void socketClient() throws IOException { Socket socket = new Socket("127.0.0.1", 8888); if (socket.isConnected()) { // 如果连接成功了就开启写和读的进程 new writer(socket).start(); new read(socket).start(); } else { System.out.println("服务器未开启"); } }}// 写入到通道的线程class writer extends Thread { @SuppressWarnings("unused") private Socket socket; private PrintWriter printWriter; private Scanner scanner = new Scanner(System.in); private String str = null; public writer(Socket socket) throws IOException { this.socket = socket; this.printWriter = new PrintWriter(socket.getOutputStream()); } @Override public void run() { scanner.useDelimiter("\r\n"); while (true) { System.out.print("请输入信息:"); // 产生扫描器的线程阻塞 str = scanner.next(); System.out.println("我说:"+str); printWriter.write(str + "\r\n"); printWriter.flush(); try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } } }}// 从通道中读取的线程class read extends Thread { private Socket socket; private BufferedReader bufferedReader; private String str = null; public read(Socket socket) throws IOException { this.socket = socket; this.bufferedReader = new BufferedReader(new InputStreamReader(socket .getInputStream())); } @Override public void run() { while (true) { try { str = bufferedReader.readLine(); System.out.println(str); } catch (IOException e) { } try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } } }} |
追问:
追答:
|
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
|
public class Test4Server { // 主入口 public static void main(String[] args) throws IOException { scoketServer(); } // 开启的tcp8888监听端口 public static void scoketServer() throws IOException { ServerSocket server = new ServerSocket(8888); //这里开启你的服务端界面 while (true) { // 未连通前线程阻塞,连通后开启一个socket通道线程后继续监听8888端口 Socket socket = server.accept();// 这里将连接进来的 ip地址 显示在你的 服务端界面列表中: socket.getInetAddress().getHostAddress() System.out.println(socket.getInetAddress().getHostAddress() + "连接进入"); new SocketThread(socket).start(); } } } |


浙公网安备 33010602011771号