“嗨,阿米戈!”

“你好,瑞希!”

“今天课程的主题是套接字。”

“您已经知道网络上的每台计算机都有自己唯一的 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 服务器,您可以简单地从浏览器访问它。”

“哇!一个网络服务器?酷!我会好好研究的。”

“谢谢你,瑞希。”

“就这样,阿米戈。去放松吧!”