- Java核心技術·卷Ⅱ:高級特性(原書第10版)
- (美)凱S.霍斯特曼
- 929字
- 2020-10-30 18:10:56
4.2.1 服務器套接字
一旦啟動了服務器程序,它便會等待某個客戶端連接到它的端口。在我們的示例程序中,我們選擇端口號8189,因為所有標準服務都不使用這個端口。ServerSocket類用于建立套接字。在我們的示例中,下面這行命令:

用于建立一個負責監控端口8189的服務器。以下命令:

用于告訴程序不停地等待,直到有客戶端連接到這個端口。一旦有人通過網絡發送了正確的連接請求,并以此連接到了端口上,該方法就會返回一個表示連接已經建立的Socket對象。你可以使用這個對象來得到輸入流和輸出流,代碼如下:

服務器發送給服務器輸出流的所有信息都會成為客戶端程序的輸入,同時來自客戶端程序的所有輸出都會被包含在服務器輸入流中。
因為在本章的所有示例程序中,我們都要通過套接字來發送文本,所以我們將流轉換成掃描器和寫入器。

以下代碼將給客戶端發送一條問候信息:

當使用telnet通過端口8189連接到這個服務器程序時,將會在終端屏幕上看到上述問候信息。
在這個簡單的服務器程序中,它僅僅只是讀取客戶端輸入,每次讀取一行,并回送這一行。這表明程序接收到了客戶端的輸入。當然,實際應用中的服務器都會對輸入進行計算并返回處理結果。

在代碼的最后,我們關閉了連接進來的套接字。

這就是整個示例代碼的大致情況。每一個服務器程序,比如一個HTTP Web服務器,都會不間斷地執行下面這個循環:
1)通過輸入數據流從客戶端接收一個命令(“get me this information”)。
2)解碼這個客戶端命令。
3)收集客戶端所請求的信息。
4)通過輸出數據流發送信息給客戶端。
程序清單4-3給出了這個程序的完整代碼。
程序清單4-3 server/EchoServer.java


想要試一下這個例子,就請編譯并運行這個程序。然后使用telnet連接到服務器localhost(或IP地址127.0.0.1)和端口8189。
如果你直接連接到因特網上,那么世界上任何人都可以訪問到你的回送服務器,只要他們知道你的IP地址和端口號。
當你連接到該端口時,將看到如圖4-4所示的信息:


圖4-4 訪問一個回送服務器
可以隨意鍵入一條信息,然后觀察屏幕上的回送信息。輸入BYE(全為大寫字母)可以斷開連接,同時,服務器程序也會終止運行。
java.net.ServerSocket 1.0
·ServerSocket(int port)
創建一個監聽端口的服務器套接字。
·Socket accept()
等待連接。該方法阻塞(即,使之空閑)當前線程直到建立連接為止。該方法返回一個Socket對象,程序可以通過這個對象與連接中的客戶端進行通信。
·void close()
關閉服務器套接字。