“嗨,阿米戈!”

“你好,瑞希!”

“今天課程的主題是套接字。”

“您已經知道網絡上的每台計算機都有自己唯一的 IP 地址。”

“是的。”

“現在假設你有幾台電腦,每台電腦都運行著十幾個訪問互聯網的程序:Skype、ICQ 等。”

“而這些程序想要相互交流。”

“我們需要阻止他們相互干擾。我們需要讓 Skype 與 Skype 連接,Slack 與 Slack 連接,等等。”

“還記得這個問題是如何通過 URL 和網絡服務器解決的嗎?”

“是的,我們添加了端口。”

“確切地。”

“這就像在房子裡做了一堆小房間,說房子是公寓樓。每個端口就像一個獨立的公寓。

“如果說 IP 地址是一台計算機的唯一標識符,那麼IP 地址和端口就是計算機中某個‘公寓’的唯一標識符,程序可以駐留在其中。

“這個獨特的位置叫做插座。”

“套接字有自己的唯一編號,由 IP 地址和端口號組成。

“啊。換句話說,套接字是某個程序可以駐留的虛擬計算機位置的標識符?另一個程序將消息發送到該位置,從而使兩個程序能夠通信?”

“我不知道你是怎麼理解的,但這是完全正確的。”

“我的機器人意識告訴我的。”

“太好了,那我給你詳細說說吧。”

“套接字其實是程序通信最基本、最原始的方式。”

“Java 有兩個用於處理套接字的類。它們是SocketServerSocket。”

ServerSocket是一個特殊的類,其對象代表服務器,即它們讓我為到達特定套接字的請求提供服務。”

Socket類實際上是一個客戶端套接字。我們使用它向另一個套接字發送消息並接收響應。”

“這是向套接字發送消息的方法:”

例子
// Create a socket
Socket clientSocket = new Socket("localhost", 4444);

// Get an OutputStream
OutputStream outputStream = clientSocket.getOutputStream();
PrintWriter out = new PrintWriter(outputStream, true);
out.println("Kiss my shiny metal ass!");
out.flush();

// Read the response
InputStream inputStream = clientSocket.getInputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(inputStream));
String answer = in.readLine();

“這與從 Internet 下載文件非常相似。”

“那,我的孩子,是因為那裡也使用了插座。”

“套接字位於與網絡相關的一切事物的核心——好吧,幾乎是一切事物。”

“您可以在此處閱讀更多信息”

“謝謝你的教訓,Rishi。”

“我還沒有完成。那是一廂情願的想法。”

“現在我們將探索服務器套接字的工作原理。”

“這有點複雜。”

例子
// Create a server socket object
ServerSocket serverSocket = new ServerSocket(4444); // Port

// Process incoming connections in a loop
while (true)
{
 // The accept method waits for someone to connect
 Socket socket = serverSocket.accept();

 // Read the response
 InputStream inputStream = socket.getInputStream();
 BufferedReader in = new BufferedReader(new InputStreamReader(inputStream));
 String message = in.readLine();

 // Create a response - we'll just reverse the string
 String reverseMessage = new StringBuilder(message).reverse().toString();

 // Send the response
 OutputStream outputStream = socket.getOutputStream();
 PrintWriter out = new PrintWriter(outputStream, true);
 out.println(reverseMessage);
 out.flush();
}

“我想提請你注意兩點。”

》要點1:創建(客戶端)套接字,需要指定IP地址(或域名)和端口。創建服務器套接字,只需要指定端口即可。服務器套接字只存在於所在的計算機上它被創造了。”

“要點 2:ServerSocket 類有一個等待傳入連接的 accept() 方法。換句話說,該方法將永遠運行,直到某個客戶端套接字嘗試連接。然後 accept() 方法接受連接,創建一個套接字允許通信的對象,然後返回此對象。”

“從 Java 程序員的角度來看,套接字是兩個流:一個是您從中讀取消息/數據的 InputStream,另一個是您向其寫入消息/數據的 OutputStream。”

“當你創建一個服務器套接字時,你實際上是在創建一個其他計算機上的客戶端套接字可以連接到的端口。但是要做到這一點,他們必須正確指定我們套接字的端口號和我們計算機的 IP 地址。嗯,或其域名。”

“這是一個有趣的例子。你可以嘗試深入研究並運行它:”

https://www.logicbig.com/tutorials/core-java-tutorial/http-server/http-server-basic.html

“這裡的重點是使用服務器套接字編寫一個超級原始的 Web 服務器,您可以簡單地從瀏覽器訪問它。”

“哇!一個網絡服務器?酷!我會好好研究的。”

“謝謝你,瑞希。”

“就這樣,阿米戈。去放鬆吧!”