用java語言構(gòu)建一個網(wǎng)絡(luò)服務(wù)器,實現(xiàn)客戶端和服務(wù)器之間通信,實現(xiàn)客戶端擁有獨立線程,互不干擾。
應(yīng)用多線程來實現(xiàn)服務(wù)器與多線程之間的通信的基本步驟
- 服務(wù)器端創(chuàng)建ServerSocket,循環(huán)調(diào)用accept()等待客戶端鏈接
- 客戶端創(chuàng)建一個Socket并請求和服務(wù)器端鏈接
- 服務(wù)器端接受客戶端請求,創(chuàng)建socekt與該客戶端建立專線鏈接
- 建立鏈接的socket在一個單獨的線程上對話
- 服務(wù)器繼續(xù)等待新的鏈接
服務(wù)器端Server.java
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
|
package test.concurrent.socket; import java.io.*; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; /** * Created by dong on 15-6-22. * 基于TCP協(xié)議的Socket通信,實現(xiàn)用戶登錄 * 服務(wù)器端 */ public class Server { public static void main(String[] args) { try { //1、創(chuàng)建一個服務(wù)器端Socket,即ServerSocket, 指定綁定的端口,并監(jiān)聽此端口 ServerSocket serverSocket = new ServerSocket( 8888 ); Socket socket = null ; //記錄客戶端的數(shù)量 int count = 0 ; System.out.println( "***服務(wù)器即將啟動,等待客戶端的鏈接***" ); //循環(huán)監(jiān)聽等待客戶端的鏈接 while ( true ){ //調(diào)用accept()方法開始監(jiān)聽,等待客戶端的鏈接 socket = serverSocket.accept(); //創(chuàng)建一個新的線程 ServerThread serverThread = new ServerThread(socket); //啟動線程 serverThread.start(); count++; //統(tǒng)計客戶端的數(shù)量 System.out.println( "客戶端的數(shù)量: " + count); InetAddress address = socket.getInetAddress(); System.out.println( "當(dāng)前客戶端的IP : " + address.getHostAddress()); } } catch (IOException e) { e.printStackTrace(); } } } |
服務(wù)器端線程處理類ServerThread.java
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
|
package test.concurrent.socket; import java.io.*; import java.net.Socket; /** * Created by dong on 15-6-22. * 服務(wù)器端線程處理類 */ public class ServerThread extends Thread { //和本線程相關(guān)的Socket Socket socket = null ; public ServerThread(Socket socket){ this .socket = socket; } //線程執(zhí)行的操作,響應(yīng)客戶端的請求 public void run(){ InputStream is = null ; InputStreamReader isr = null ; BufferedReader br = null ; OutputStream os = null ; PrintWriter pw = null ; try { //獲取一個輸入流,并讀取客戶端的信息 is = socket.getInputStream(); isr = new InputStreamReader(is); //將字節(jié)流轉(zhuǎn)化為字符流 br = new BufferedReader(isr); //添加緩沖 String info = null ; //循環(huán)讀取數(shù)據(jù) while ((info = br.readLine()) != null ){ System.out.println( "我是服務(wù)器,客戶端說: " +info); } socket.shutdownInput(); //關(guān)閉輸入流 //獲取輸出流,響應(yīng)客戶端的請求 os = socket.getOutputStream(); pw = new PrintWriter(os); //包裝為打印流 pw.write( "歡迎你" ); pw.flush(); //將緩存輸出 } catch (IOException e) { e.printStackTrace(); } finally { try { //關(guān)閉資源 if (pw != null ) pw.close(); if (os != null ) os.close(); if (is != null ) is.close(); if (isr != null ) isr.close(); if (br != null ) br.close(); if (socket != null ) socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } |
客戶端Client.java
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
|
package test.concurrent.socket; import java.io.*; import java.net.Socket; /** * Created by dong on 15-6-22. * 客戶端 */ public class Client { public static void main(String[] args) { try { //1、創(chuàng)建客戶端Socket,指定服務(wù)器端口號和地址 Socket socket = new Socket( "localhost" , 8888 ); //2、獲取輸出流,向服務(wù)器發(fā)送信息 OutputStream os = socket.getOutputStream(); //字節(jié)輸出流 PrintWriter pw = new PrintWriter(os); //將輸出流包裝為打印流 pw.write( "用戶名:tom; 密碼:456" ); pw.flush(); socket.shutdownOutput(); //關(guān)閉輸出流 InputStream is = socket.getInputStream(); InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); String info = null ; //循環(huán)讀取 while ((info = br.readLine()) != null ){ System.out.println( "我是客戶端:服務(wù)器說:" + info); } br.close(); is.close(); isr.close(); pw.close(); os.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } } |
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。