想用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();
}
}
}
|