Socket類
套接字是網絡連接的端點,套接字使應用可以從網絡中讀取數據,可以向網絡中寫入數據。不同計算機上的兩個應用程序可以通過連接發送或接收字節流,以此達到相互通信的目的。
為了從一個應用程序向另一個應用程序發送消息,需要知道另一個應用程序中套接字的 IP 地址和端口號,在java中,套接字由java.net.Socket 表示。
要創建一個套接字,可以使用Socket類中眾多構造函數中的一個。其中一個構造函數接收兩個參數:主機號和端口號。
1
|
public Socket (String host, int port) |
其中參數host是遠程主機的名稱或IP地址,參數port是連接遠程應用程序的端口號,例如,想要通過80端口連接yahoo.com,可以使用如下語句創建Socket對象
1
|
new Socket ("yahoo.com", 80); |
一旦成功創建了Socket類的實例,就可以使用該實例發送或接收字節流,要發送字節流,需要調用Socket類的getOutputStream() 方法獲取一個java.io.OutputStream對象,
要發送文本到遠程應用程序,通常需要使用返回的OutputStream對象創建一個java.io.PrintWriter對象。若想要從連接的另一端接收字節流,需要調用Socket類的getInputStream()
方法,該方法會返回一個java.io.InputStream對象。
下面的代碼創建了一個套接字,用于與本地Http服務器進行通信,發送HTTP請求,接收服務器的相應信息,以下代碼創建了一個StringBuffer對象來保存信息,并輸出。
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
|
Socket socket = new Socket("127.0.0.1", "8080"); OutputStream os = socket.getOutputStream(); boolean autoflush = true; PrintWriter out = new PrintWriter( socket.getOutputStream(), autoflush); BufferedReader in = new BufferedReader( new InputStreamReader(socket.getInputStream())); //send an HTTP request to the web server out.println("GET /index.jsp HTTP/1.1"); out.println("Host: localhost:8080"); out.println("Connection Close"); out.println(); //read the response boolean loop = true; StringBuffer sb = new StringBuffer(8096); while (loop) { if (in.ready()) { int i = 0; while (i != -1){ i = in.read(); sb.append((char) i); } loop = flase; } Thread.currentThread().sleep(50); } System.out.println(sb.toString()); socket.close(); |
ServerSocket類
Socket類表示一個客戶端套接字,即,當想要連接遠程服務器應用程序時創建的套接字。但如果你想要實現一個服務器應用程序(例如一個HTTP服務器或FTP服務器),
你需要另一種方法,因為服務器必須時刻待命,它并不知道客戶端應用程序會在什么時候發起連接,正因為如此,需要使用java.net.ServerSocket類。這是服務器套接字的實現。
ServerSocket類和Socket類并不相同,服務器套接字要等待來自客戶端的連接請求,當服務器套接字收到了連接請求后,它會創建一個Socket實例來處理與客戶端的通信。
要創建一個服務器套接字,可以使用ServerSocket類提供的4個構造函數中的任意一個,需要指明IP地址和服務器套接字偵聽的端口號,典型情況下,IP地址可以為127.0.0.1,
即服務器套接字會偵聽本地機器接收到的連接請求,服務器套接字偵聽的IP地址稱為綁定地址。服務器套接字的另一個重要屬性是backlog,后者表示在服務器拒絕接收傳入的
請求之前,傳入的連接請求的最大隊列長度。
ServerSocket類的其中一個構造函數的簽名如下:
1
|
public ServerSocket (int port, int backLog, InetAddress bindingAddress); |
值得注意的是,在這個構造函數中,參數綁定地址必須是java.net.InetAddress類的實例。創建InetAddress對象的一種簡單方法是調用其靜態方法getByName(),
傳入包含主機名的字符串,代碼如下所示:
1
|
InetAddress.getByName("127.0.0.1"); |
下面的一行代碼創建了一個ServerSocket對象,ServerSocket對象偵聽本地主機的8080端口,其backlog值為1;
1
|
new ServerSocket(8080, 1, InetAddress.getByName("127.0.01")); |
創建了ServerSocket實例后,可以使其等待傳入的連接請求,該連接請求會通過服務器套接字偵聽的端口上綁定地址傳入,這些工作可以通過調通ServerSocket類的accept方法
完成。只有當接收到連接請求后,該方法才會返回,其返回值是一個Socket實例,然后,就可以如上所述使用該Socket對象與客戶端應用程序進行字節流的發送/接收。
以上這篇基于Socket類以及ServerSocket類的實例講解就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。
原文鏈接:http://www.cnblogs.com/xinde123/archive/2017/09/20/7563185.html