基于Socket類以及ServerSocket類的實例講解
Socket類
套接字是網(wǎng)絡(luò)連接的端點,套接字使應(yīng)用可以從網(wǎng)絡(luò)中讀取數(shù)據(jù),可以向網(wǎng)絡(luò)中寫入數(shù)據(jù)。不同計算機上的兩個應(yīng)用程序可以通過連接發(fā)送或接收字節(jié)流,以此達到相互通信的目的。
為了從一個應(yīng)用程序向另一個應(yīng)用程序發(fā)送消息,需要知道另一個應(yīng)用程序中套接字的 IP 地址和端口號,在java中,套接字由java.net.Socket 表示。
要創(chuàng)建一個套接字,可以使用Socket類中眾多構(gòu)造函數(shù)中的一個。其中一個構(gòu)造函數(shù)接收兩個參數(shù):主機號和端口號。
public Socket (String host, int port)
其中參數(shù)host是遠程主機的名稱或IP地址,參數(shù)port是連接遠程應(yīng)用程序的端口號,例如,想要通過80端口連接yahoo.com,可以使用如下語句創(chuàng)建Socket對象
new Socket ("yahoo.com", 80);
一旦成功創(chuàng)建了Socket類的實例,就可以使用該實例發(fā)送或接收字節(jié)流,要發(fā)送字節(jié)流,需要調(diào)用Socket類的getOutputStream() 方法獲取一個java.io.OutputStream對象,
要發(fā)送文本到遠程應(yīng)用程序,通常需要使用返回的OutputStream對象創(chuàng)建一個java.io.PrintWriter對象。若想要從連接的另一端接收字節(jié)流,需要調(diào)用Socket類的getInputStream()
方法,該方法會返回一個java.io.InputStream對象。
下面的代碼創(chuàng)建了一個套接字,用于與本地Http服務(wù)器進行通信,發(fā)送HTTP請求,接收服務(wù)器的相應(yīng)信息,以下代碼創(chuàng)建了一個StringBuffer對象來保存信息,并輸出。
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類表示一個客戶端套接字,即,當想要連接遠程服務(wù)器應(yīng)用程序時創(chuàng)建的套接字。但如果你想要實現(xiàn)一個服務(wù)器應(yīng)用程序(例如一個HTTP服務(wù)器或FTP服務(wù)器),
你需要另一種方法,因為服務(wù)器必須時刻待命,它并不知道客戶端應(yīng)用程序會在什么時候發(fā)起連接,正因為如此,需要使用java.net.ServerSocket類。這是服務(wù)器套接字的實現(xiàn)。
ServerSocket類和Socket類并不相同,服務(wù)器套接字要等待來自客戶端的連接請求,當服務(wù)器套接字收到了連接請求后,它會創(chuàng)建一個Socket實例來處理與客戶端的通信。
要創(chuàng)建一個服務(wù)器套接字,可以使用ServerSocket類提供的4個構(gòu)造函數(shù)中的任意一個,需要指明IP地址和服務(wù)器套接字偵聽的端口號,典型情況下,IP地址可以為127.0.0.1,
即服務(wù)器套接字會偵聽本地機器接收到的連接請求,服務(wù)器套接字偵聽的IP地址稱為綁定地址。服務(wù)器套接字的另一個重要屬性是backlog,后者表示在服務(wù)器拒絕接收傳入的
請求之前,傳入的連接請求的最大隊列長度。
ServerSocket類的其中一個構(gòu)造函數(shù)的簽名如下:
public ServerSocket (int port, int backLog, InetAddress bindingAddress);
值得注意的是,在這個構(gòu)造函數(shù)中,參數(shù)綁定地址必須是java.net.InetAddress類的實例。創(chuàng)建InetAddress對象的一種簡單方法是調(diào)用其靜態(tài)方法getByName(),
傳入包含主機名的字符串,代碼如下所示:
InetAddress.getByName("127.0.0.1");
下面的一行代碼創(chuàng)建了一個ServerSocket對象,ServerSocket對象偵聽本地主機的8080端口,其backlog值為1;
new ServerSocket(8080, 1, InetAddress.getByName("127.0.01"));
創(chuàng)建了ServerSocket實例后,可以使其等待傳入的連接請求,該連接請求會通過服務(wù)器套接字偵聽的端口上綁定地址傳入,這些工作可以通過調(diào)通ServerSocket類的accept方法
完成。只有當接收到連接請求后,該方法才會返回,其返回值是一個Socket實例,然后,就可以如上所述使用該Socket對象與客戶端應(yīng)用程序進行字節(jié)流的發(fā)送/接收。
以上這篇基于Socket類以及ServerSocket類的實例講解就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringCloud使用Feign實現(xiàn)遠程調(diào)用流程詳細介紹
OpenFeign源于Netflix的Feign,是http通信的客戶端。屏蔽了網(wǎng)絡(luò)通信的細節(jié),直接面向接口的方式開發(fā),讓開發(fā)者感知不到網(wǎng)絡(luò)通信細節(jié)。所有遠程調(diào)用,都像調(diào)用本地方法一樣完成2023-02-02java并發(fā)編程專題(九)----(JUC)淺析CyclicBarrier
這篇文章主要介紹了java CyclicBarrier的相關(guān)資料,文中示例代碼非常詳細,幫助大家更好的理解和學習,感興趣的朋友可以了解下2020-07-07Java?spring?MVC環(huán)境中實現(xiàn)WebSocket的示例代碼
這篇文章主要介紹了Java?spring?MVC環(huán)境中實現(xiàn)WebSocket,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-09-09