# 什么是插座？

> 原文： [https://docs.oracle.com/javase/tutorial/networking/sockets/definition.html](https://docs.oracle.com/javase/tutorial/networking/sockets/definition.html)

通常，服务器在特定计算机上运行，​​并且具有绑定到特定端口号的套接字。服务器只是等待，监听套接字以便客户端发出连接请求。

在客户端：客户端知道运行服务器的计算机的主机名以及服务器正在侦听的端口号。要发出连接请求，客户端会尝试与服务器的计算机和端口上的服务器会合。客户端还需要向服务器标识自己，以便绑定到在此连接期间将使用的本地端口号。这通常由系统分配。

![A client's connection request](img/e99613319760e96e1ec0579ce179bb1b.jpg)

如果一切顺利，服务器将接受连接。接受后，服务器获取绑定到同一本地端口的新套接字，并将其远程端点设置为客户端的地址和端口。它需要一个新的套接字，以便它可以继续监听原始套接字以获得连接请求，同时满足连接客户端的需求。

![The connection is made](img/ed36d613974edf463f81ceca157310de.jpg)

在客户端，如果接受连接，则成功创建套接字，客户端可以使用套接字与服务器通信。

客户端和服务器现在可以通过写入或读取其套接字进行通信。

* * *

**Definition:** 

_ 套接字 _ 是网络上运行的两个程序之间的双向通信链路的一个端点。套接字绑定到端口号，以便 TCP 层可以标识要发送到的数据的应用程序。

* * *

端点是 IP 地址和端口号的组合。每个 TCP 连接都可以由其两个端点唯一标识。这样，您可以在主机和服务器之间建立多个连接。

Java 平台中的`java.net`包提供了一个类`Socket`，它实现了 Java 程序与网络上另一个程序之间的双向连接的一面。 `Socket`类位于依赖于平台的实现之上，隐藏了 Java 程序中任何特定系统的细节。通过使用`java.net.Socket`类而不是依赖本机代码，您的 Java 程序可以通过网络以独立于平台的方式进行通信。

此外，`java.net`包括`ServerSocket`类，它实现了一个服务器可用于侦听和接受客户端连接的套接字。本课程向您介绍如何使用`Socket`和`ServerSocket`类。

如果您尝试连接到 Web，`URL`类和相关类（`URLConnection`，`URLEncoder`）可能比套接字类更合适。实际上，URL 是与 Web 的相对高级别的连接，并使用套接字作为底层实现的一部分。有关通过 URL 连接到 Web 的信息，请参阅[使用 URL](../urls/index.html) 。