- 所有已实现的接口:
-
Closeable,AutoCloseable
- 直接已知的子类:
-
SSLSocket
套接字的实际工作由SocketImpl类的实例执行。
Socket类定义了方便的方法来设置和获取几个套接字选项。此类还定义了setOption和getOption方法来设置和查询套接字选项。一个Socket支持以下选项:
还可以支持其他(特定于实现的)选项。
选项名称 描述 SO_SNDBUF套接字发送缓冲区的大小 SO_RCVBUF套接字接收缓冲区的大小 SO_KEEPALIVE保持连接活动 SO_REUSEADDR重新使用地址 SO_LINGER在关闭时保持悬而未决(仅在阻塞模式下配置时存在数据时) TCP_NODELAY禁用Nagle算法
- 自版本:
- 1.0
- 参见:
-
Constructor Summary
ConstructorsModifierConstructorDescriptionSocket()创建一个未连接的套接字。创建一个流套接字,并将其连接到指定主机上的指定端口号。已弃用。为UDP传输使用DatagramSocket代替。Socket(String host, int port, InetAddress localAddr, int localPort) 创建一个套接字,并将其连接到指定的远程主机上的指定远程端口。Socket(InetAddress address, int port) 创建一个流套接字,并将其连接到指定IP地址上的指定端口号。Socket(InetAddress host, int port, boolean stream) 已弃用。为UDP传输使用DatagramSocket代替。Socket(InetAddress address, int port, InetAddress localAddr, int localPort) 创建一个套接字,并将其连接到指定远程地址上的指定远程端口。创建一个未连接的套接字,指定应使用的代理类型(如果有),而不考虑任何其他设置。protectedSocket(SocketImpl impl) 创建一个具有用户指定的SocketImpl的未连接的套接字。 -
Method Summary
Modifier and TypeMethodDescriptionvoidbind(SocketAddress bindpoint) 将套接字绑定到本地地址。voidclose()关闭此套接字。voidconnect(SocketAddress endpoint) 将此套接字连接到服务器。voidconnect(SocketAddress endpoint, int timeout) 将此套接字连接到具有指定超时值的服务器。返回与此套接字关联的唯一SocketChannel对象,如果有的话。返回套接字连接的地址。返回此套接字的输入流。boolean测试是否启用SO_KEEPALIVE。获取套接字绑定的本地地址。int返回此套接字绑定的本地端口号。返回此套接字绑定到的端点的地址。boolean测试是否启用SO_OOBINLINE。<T> TgetOption(SocketOption<T> name) 返回套接字选项的值。返回此套接字的输出流。intgetPort()返回此套接字连接的远程端口号。int返回此套接字连接到的端点的地址,如果未连接则返回null。boolean测试是否启用SO_REUSEADDR。intint返回SO_LINGER的设置。int返回SO_TIMEOUT的设置。0表示该选项已禁用(即超时为无限)。boolean测试是否启用TCP_NODELAY。int获取从此套接字发送的数据包的IP头部中的流量类别或服务类型。booleanisBound()返回套接字的绑定状态。booleanisClosed()返回套接字的关闭状态。boolean返回套接字的连接状态。boolean返回套接字连接的读半部分是否关闭。boolean返回套接字连接的写半部分是否关闭。voidsendUrgentData(int data) 在套接字上发送一个字节的紧急数据。voidsetKeepAlive(boolean on) 启用/禁用SO_KEEPALIVE。voidsetOOBInline(boolean on) 启用/禁用SO_OOBINLINE(接收TCP紧急数据)。默认情况下,此选项已禁用,并且在套接字上接收到TCP紧急数据时会被静默丢弃。<T> SocketsetOption(SocketOption<T> name, T value) 设置套接字选项的值。voidsetPerformancePreferences(int connectionTime, int latency, int bandwidth) 为此套接字设置性能首选项。voidsetReceiveBufferSize(int size) 为此Socket设置SO_RCVBUF选项的值。voidsetReuseAddress(boolean on) 启用/禁用SO_REUSEADDR套接字选项。voidsetSendBufferSize(int size) 为此Socket设置SO_SNDBUF选项的值。static void已弃用。使用SocketFactory并直接子类化Socket。voidsetSoLinger(boolean on, int linger) 使用指定的逗留时间(以秒为单位)启用/禁用SO_LINGER。voidsetSoTimeout(int timeout) 使用指定的超时时间(以毫秒为单位)启用/禁用SO_TIMEOUT。voidsetTcpNoDelay(boolean on) 启用/禁用TCP_NODELAY(禁用/启用Nagle算法)。voidsetTrafficClass(int tc) 为从此套接字发送的数据包设置IP头部中的流量类别或服务类型。void将此套接字的输入流置于“流的末尾”。void禁用此套接字的输出流。Set<SocketOption<?>> 返回此套接字支持的套接字选项集。toString()将此套接字转换为String。
-
Constructor Details
-
Socket
public Socket()创建一个未连接的套接字。如果应用程序指定了客户端套接字实现工厂,则将调用该工厂的
createSocketImpl方法来创建实际的套接字实现。否则将创建系统默认的套接字实现。- 自版本:
- 1.1
-
Socket
创建一个未连接的套接字,指定应使用的代理类型(如果有),而不考虑任何其他设置。如果存在安全管理器,则将使用代理主机地址和端口号作为参数调用其
checkConnect方法。这可能导致SecurityException。示例:
Socket s = new Socket(Proxy.NO_PROXY);将创建一个忽略任何其他代理配置的普通套接字。Socket s = new Socket(new Proxy(Proxy.Type.SOCKS, new InetSocketAddress("socks.mydom.com", 1080)));将创建一个通过指定的SOCKS代理服务器连接的套接字。
- 参数:
-
proxy- 指定应使用何种代理的Proxy对象。 - 抛出:
-
IllegalArgumentException- 如果代理类型无效或为null。 -
SecurityException- 如果存在安全管理器并且拒绝连接到代理的权限。 - 自版本:
- 1.5
- 参见:
-
Socket
创建一个具有用户指定的SocketImpl的未连接的套接字。- 参数:
-
impl- 一个SocketImpl的实例,子类希望在Socket上使用。 - 抛出:
-
SocketException- 如果底层协议中存在错误,比如TCP错误。 -
SecurityException- 如果impl不为null,并且设置了安全管理器,其checkPermission方法不允许NetPermission("setSocketImpl")。 - 自从:
- 1.1
-
Socket
创建一个流套接字并将其连接到指定主机上的指定端口号。如果指定的主机为
null,则相当于将地址指定为InetAddress.getByName(null)。换句话说,相当于指定回环接口的地址。如果应用程序指定了客户端套接字实现工厂,则将调用该工厂的
createSocketImpl方法来创建实际的套接字实现。否则将创建系统默认的套接字实现。如果存在安全管理器,则将使用主机地址和
port作为参数调用其checkConnect方法。这可能导致SecurityException。- 参数:
-
host- 主机名,或者null表示回环地址。 -
port- 端口号。 - 抛出:
-
UnknownHostException- 如果无法确定主机的IP地址。 -
IOException- 创建套接字时发生I/O错误。 -
SecurityException- 如果存在安全管理器,并且其checkConnect方法不允许该操作。 -
IllegalArgumentException- 如果端口参数超出有效端口值范围,即0到65535之间(包括边界值)。 - 参见:
-
Socket
创建一个流套接字并将其连接到指定IP地址上的指定端口号。如果应用程序指定了客户端套接字实现工厂,则将调用该工厂的
createSocketImpl方法来创建实际的套接字实现。否则将创建系统默认的套接字实现。如果存在安全管理器,则将使用主机地址和
port作为参数调用其checkConnect方法。这可能导致SecurityException。- 参数:
-
address- IP地址。 -
port- 端口号。 - 抛出:
-
IOException- 创建套接字时发生I/O错误。 -
SecurityException- 如果存在安全管理器,并且其checkConnect方法不允许该操作。 -
IllegalArgumentException- 如果端口参数超出有效端口值范围,即0到65535之间(包括边界值)。 -
NullPointerException- 如果address为null。 - 参见:
-
Socket
创建一个套接字并将其连接到指定远程主机的指定远程端口。套接字还将绑定到提供的本地地址和端口。如果指定的主机为
null,则相当于将地址指定为InetAddress.getByName(null)。换句话说,相当于指定回环接口的地址。本地端口号为
zero将允许系统在bind操作中选择一个空闲端口。如果存在安全管理器,则将使用主机地址和
port作为参数调用其checkConnect方法。这可能导致SecurityException。- 参数:
-
host- 远程主机的名称,或者null表示回环地址。 -
port- 远程端口 -
localAddr- 套接字绑定到的本地地址,或者null表示anyLocal地址。 -
localPort- 套接字绑定到的本地端口,或者zero表示系统选择的空闲端口。 - 抛出:
-
IOException- 创建套接字时发生I/O错误。 -
SecurityException- 如果存在安全管理器,并且其checkConnect方法不允许连接到目的地,或者其checkListen方法不允许绑定到本地端口。 -
IllegalArgumentException- 如果端口参数或localPort参数超出有效端口值范围,即0到65535之间(包括边界值)。 - 自从:
- 1.1
- 参见:
-
Socket
public Socket(InetAddress address, int port, InetAddress localAddr, int localPort) throws IOException 创建一个套接字并将其连接到指定远程地址的指定远程端口。套接字还将绑定到提供的本地地址和端口。如果指定的本地地址为
null,则相当于指定地址为AnyLocal地址(参见InetAddress.isAnyLocalAddress())。本地端口号为
zero将允许系统在bind操作中选择一个空闲端口。如果存在安全管理器,则将使用主机地址和
port作为参数调用其checkConnect方法。这可能导致SecurityException。- 参数:
-
address- 远程地址 -
port- 远程端口 -
localAddr- 套接字绑定到的本地地址,或者null表示anyLocal地址。 -
localPort- 套接字绑定到的本地端口,或者zero表示系统选择的空闲端口。 - 抛出:
-
IOException- 创建套接字时发生I/O错误。 -
SecurityException- 如果存在安全管理器,并且其checkConnect方法不允许连接到目的地,或者其checkListen方法不允许绑定到本地端口。 -
IllegalArgumentException- 如果端口参数或localPort参数超出有效端口值范围,即0到65535之间(包括边界值)。 -
NullPointerException- 如果address为null。 - 自从:
- 1.1
- 参见:
-
Socket
Deprecated.Use DatagramSocket instead for UDP transport.创建一个流套接字并将其连接到指定主机上的指定端口号。如果指定的主机为
null,则相当于将地址指定为InetAddress.getByName(null)。换句话说,相当于指定回环接口的地址。如果流参数为
true,则创建流套接字。如果流参数为false,则创建数据报套接字。如果应用程序指定了客户端套接字实现工厂,则将调用该工厂的
createSocketImpl方法来创建实际的套接字实现。否则将创建系统默认的套接字实现。如果存在安全管理器,则将使用主机地址和
port作为参数调用其checkConnect方法。这可能导致SecurityException。如果使用UDP套接字,则TCP/IP相关的套接字选项将不适用。
- 参数:
-
host- 主机名,或者null表示回环地址。 -
port- 端口号。 -
stream- 一个表示是否为流套接字或数据报套接字的boolean。 - 抛出:
-
IOException- 创建套接字时发生I/O错误。 -
SecurityException- 如果存在安全管理器,并且其checkConnect方法不允许该操作。 -
IllegalArgumentException- 如果端口参数超出有效端口值范围,即0到65535之间(包括边界值)。 - 参见:
-
Socket
Deprecated.Use DatagramSocket instead for UDP transport.创建一个套接字并将其连接到指定IP地址的指定端口号。如果流参数为
true,则创建一个流套接字。如果流参数为false,则创建一个数据报套接字。如果应用程序指定了客户端套接字实现工厂,则调用该工厂的
createSocketImpl方法来创建实际的套接字实现。否则将创建一个系统默认的套接字实现。如果存在安全管理器,则将使用
host.getHostAddress()和port作为参数调用其checkConnect方法。这可能导致SecurityException。如果使用UDP套接字,则不会应用TCP/IP相关的套接字选项。
- 参数:
-
host- IP地址。 -
port- 端口号。 -
stream- 如果为true,则创建流套接字;否则创建数据报套接字。 - 抛出:
-
IOException- 创建套接字时发生I/O错误。 -
SecurityException- 如果存在安全管理器且其checkConnect方法不允许该操作。 -
IllegalArgumentException- 如果端口参数超出有效端口值范围,即0到65535(包括边界值)之间。 -
NullPointerException- 如果host为null。 - 参见:
-
-
Method Details
-
connect
将此套接字连接到服务器。在以下情况下,此方法是可中断的:
- 套接字关联到一个
SocketChannel。在这种情况下,中断正在建立连接的线程将关闭底层通道,并导致此方法抛出带有中断状态的ClosedByInterruptException。 - 套接字使用系统默认的套接字实现,并且虚拟线程正在建立连接。在这种情况下,中断虚拟线程将导致其唤醒并关闭套接字。然后此方法将抛出带有中断状态的
SocketException。
- 参数:
-
endpoint-SocketAddress - 抛出:
-
IOException- 在连接过程中发生错误时 -
IllegalBlockingModeException- 如果此套接字具有关联通道,并且通道处于非阻塞模式 -
IllegalArgumentException- 如果endpoint为null或是此套接字不支持的SocketAddress子类 - 自版本:
- 1.4
- 套接字关联到一个
-
connect
使用指定的超时值将此套接字连接到服务器。超时值为零被解释为无限超时。连接将阻塞直到建立或发生错误。在以下情况下,此方法是可中断的:
- 套接字关联到一个
SocketChannel。在这种情况下,中断正在建立连接的线程将关闭底层通道,并导致此方法抛出带有中断状态的ClosedByInterruptException。 - 套接字使用系统默认的套接字实现,并且虚拟线程正在建立连接。在这种情况下,中断虚拟线程将导致其唤醒并关闭套接字。然后此方法将抛出带有中断状态的
SocketException。
- 参数:
-
endpoint-SocketAddress -
timeout- 要在毫秒中使用的超时值。 - 抛出:
-
IOException- 在连接过程中发生错误时 -
SocketTimeoutException- 如果在连接之前超时 -
IllegalBlockingModeException- 如果此套接字具有关联通道,并且通道处于非阻塞模式 -
IllegalArgumentException- 如果endpoint为null或是此套接字不支持的SocketAddress子类,或者timeout为负值 - 自版本:
- 1.4
- 套接字关联到一个
-
bind
将套接字绑定到本地地址。如果地址为
null,则系统将选择一个临时端口和一个有效的本地地址来绑定套接字。- 参数:
-
bindpoint- 要绑定到的SocketAddress - 抛出:
-
IOException- 如果绑定操作失败,或者套接字已经绑定。 -
IllegalArgumentException- 如果bindpoint是此套接字不支持的SocketAddress子类 -
SecurityException- 如果存在安全管理器且其checkListen方法不允许绑定到本地端口。 - 自版本:
- 1.4
- 参见:
-
getInetAddress
返回套接字连接的地址。如果套接字在被
关闭之前已连接,则此方法在套接字关闭后仍将继续返回连接的地址。- 返回:
-
此套接字连接的远程IP地址,如果套接字未连接则返回
null。
-
getLocalAddress
获取套接字绑定的本地地址。如果设置了安全管理器,则将使用本地地址和
-1作为其参数调用其checkConnect方法,以查看是否允许该操作。如果不允许该操作,则返回loopback地址。- 返回:
- 此套接字绑定的本地地址,如果被安全管理器拒绝,则返回回环地址,如果套接字已关闭或尚未绑定,则返回通配符地址。
- 自版本:
- 1.1
- 参见:
-
getPort
public int getPort()返回此套接字连接的远程端口号。如果套接字在被
关闭之前已连接,则此方法在套接字关闭后仍将继续返回连接的端口号。- 返回:
- 此套接字连接的远程端口号,如果套接字尚未连接则返回0。
-
getLocalPort
public int getLocalPort()返回此套接字绑定的本地端口号。如果套接字在被
关闭之前已绑定,则此方法在套接字关闭后仍将继续返回本地端口号。- 返回:
- 此套接字绑定的本地端口号,如果套接字尚未绑定则返回-1。
-
getRemoteSocketAddress
返回此套接字连接的端点地址,如果未连接则返回null。如果套接字在被
关闭之前已连接,则此方法在套接字关闭后仍将继续返回连接的地址。- 返回:
-
表示此套接字远程端点的
SocketAddress,如果尚未连接则返回null。 - 自版本:
- 1.4
- 参见:
-
getLocalSocketAddress
返回此套接字绑定的端点地址。如果套接字绑定到由
InetSocketAddress表示的端点,并且关闭套接字,则此方法在套接字关闭后仍将继续返回InetSocketAddress。在这种情况下,返回的InetSocketAddress的地址是通配符地址,其端口是绑定到的本地端口。如果设置了安全管理器,则将使用本地地址和
-1作为其参数调用其checkConnect方法,以查看是否允许该操作。如果不允许该操作,则返回表示回环地址和套接字绑定到的本地端口的SocketAddress。- 返回:
-
一个代表此套接字本地端点的
SocketAddress,或者如果被安全管理器拒绝,则代表回环地址的SocketAddress,或者如果套接字尚未绑定,则返回null。 - 自:
- 1.4
- 参见:
-
getChannel
返回与此套接字关联的唯一SocketChannel对象(如果有)。如果套接字具有通道,则仅当通道本身是通过
SocketChannel.open或ServerSocketChannel.accept方法创建时,套接字才会有一个通道。- 返回:
-
与此套接字关联的套接字通道,如果此套接字未为通道创建,则返回
null。 - 自:
- 1.4
-
getInputStream
返回此套接字的输入流。如果此套接字具有关联的通道,则生成的输入流将把其所有操作委托给通道。如果通道处于非阻塞模式,则输入流的
read操作将抛出IllegalBlockingModeException。从输入流读取在以下情况下是可中断的:
- 套接字与SocketChannel关联。在这种情况下,中断从输入流读取的线程将关闭底层通道,并导致读取方法抛出带有中断状态的
ClosedByInterruptException。 - 套接字使用系统默认的套接字实现,并且虚拟线程正在从输入流读取。在这种情况下,中断虚拟线程将导致其唤醒并关闭套接字。然后读取方法将抛出带有中断状态的
SocketException。
在异常情况下,底层连接可能会被远程主机或网络软件中断(例如,在TCP连接的情况下发生连接重置)。当网络软件检测到断开的连接时,以下内容适用于返回的输入流:
-
网络软件可能会丢弃套接字缓冲的字节。网络软件未丢弃的字节可以使用
read读取。 -
如果套接字上没有缓冲的字节,或者所有缓冲的字节都已被
read消耗,则所有后续调用read将抛出IOException。
关闭返回的
InputStream将关闭关联的套接字。- 返回:
- 用于从此套接字读取字节的输入流。
- 抛出:
-
IOException- 如果创建输入流时发生I/O错误,套接字已关闭,套接字未连接,或使用shutdownInput()关闭了套接字输入。
- 套接字与SocketChannel关联。在这种情况下,中断从输入流读取的线程将关闭底层通道,并导致读取方法抛出带有中断状态的
-
getOutputStream
返回此套接字的输出流。如果此套接字具有关联的通道,则生成的输出流将把其所有操作委托给通道。如果通道处于非阻塞模式,则输出流的
write操作将抛出IllegalBlockingModeException。写入输出流在以下情况下是可中断的:
- 套接字与SocketChannel关联。在这种情况下,中断从输出流写入的线程将关闭底层通道,并导致写入方法抛出带有中断状态的
ClosedByInterruptException。 - 套接字使用系统默认的套接字实现,并且虚拟线程正在向输出流写入。在这种情况下,中断虚拟线程将导致其唤醒并关闭套接字。然后写入方法将抛出
SocketException,并设置中断状态。
关闭返回的
OutputStream将关闭关联的套接字。- 返回:
- 用于向此套接字写入字节的输出流。
- 抛出:
-
IOException- 如果创建输出流时发生I/O错误,或套接字未连接。
- 套接字与SocketChannel关联。在这种情况下,中断从输出流写入的线程将关闭底层通道,并导致写入方法抛出带有中断状态的
-
setTcpNoDelay
启用/禁用TCP_NODELAY(禁用/启用Nagle算法)。- 参数:
-
on-true表示启用TCP_NODELAY,false表示禁用。 - 抛出:
-
SocketException- 如果底层协议中存在错误,例如TCP错误。 - 自:
- 1.1
- 参见:
-
getTcpNoDelay
测试TCP_NODELAY是否已启用。- 返回:
-
一个表示
TCP_NODELAY是否已启用的boolean。 - 抛出:
-
SocketException- 如果底层协议中存在错误,例如TCP错误。 - 自:
- 1.1
- 参见:
-
setSoLinger
启用/禁用使用指定的逗留时间(以秒为单位)的SO_LINGER。最大超时值是特定于平台的。该设置仅影响套接字关闭。- 参数:
-
on- 是否逗留。 -
linger- 如果on为true,则逗留多长时间。 - 抛出:
-
SocketException- 如果底层协议中存在错误,例如TCP错误。 -
IllegalArgumentException- 如果逗留值为负。 - 自:
- 1.1
- 参见:
-
getSoLinger
返回SO_LINGER的设置。-1表示选项已禁用。该设置仅影响套接字关闭。- 返回:
-
SO_LINGER的设置。 - 抛出:
-
SocketException- 如果底层协议中存在错误,例如TCP错误。 - 自:
- 1.1
- 参见:
-
sendUrgentData
在套接字上发送一个字节的紧急数据。要发送的字节是数据参数的最低八位。紧急字节将在套接字OutputStream的任何先前写入之后和将来写入之前发送。- 参数:
-
data- 要发送的数据字节 - 抛出:
-
IOException- 如果发送数据时发生错误。 - 自:
- 1.4
-
setOOBInline
启用/禁用SO_OOBINLINE(接收TCP紧急数据)。默认情况下,此选项已禁用,并且在套接字上接收到TCP紧急数据时会被静默丢弃。如果用户希望接收紧急数据,则必须启用此选项。启用后,紧急数据将与普通数据一起接收。请注意,仅提供有限的支持来处理传入的紧急数据。特别地,不提供传入紧急数据的通知,并且除非由更高级别的协议提供,否则无法区分普通数据和紧急数据。
- 参数:
-
on-true表示启用SO_OOBINLINE,false表示禁用。 - 抛出:
-
SocketException- 如果底层协议中存在错误,例如TCP错误。 - 自:
- 1.4
- 参见:
-
getOOBInline
测试SO_OOBINLINE是否已启用。- 返回值:
-
一个
boolean,指示是否启用了SO_OOBINLINE。 - 抛出:
-
SocketException- 如果底层协议出现错误,如TCP错误。 - 自版本:
- 1.4
- 参见:
-
setSoTimeout
使用指定的超时(以毫秒为单位)启用/禁用SO_TIMEOUT。将此选项设置为正超时值后,与此Socket关联的InputStream上的read()调用将仅阻塞这段时间。如果超时到期,将引发一个java.net.SocketTimeoutException,尽管Socket仍然有效。超时值为零被解释为无限超时。必须在进入阻塞操作之前启用该选项才能生效。- 参数:
-
timeout- 指定的超时时间,以毫秒为单位。 - 抛出:
-
SocketException- 如果底层协议出现错误,如TCP错误 -
IllegalArgumentException- 如果timeout为负数 - 自版本:
- 1.1
- 参见:
-
getSoTimeout
返回SO_TIMEOUT的设置。0表示该选项已禁用(即无限超时)。- 返回值:
-
此
Socket的SO_TIMEOUT选项的设置。 - 抛出:
-
SocketException- 如果底层协议出现错误,如TCP错误。 - 自版本:
- 1.1
- 参见:
-
setSendBufferSize
将Socket的SO_SNDBUF选项设置为指定值。SO_SNDBUF选项由平台的网络代码用作设置底层网络I/O缓冲区大小的提示。因为
SO_SNDBUF是一个提示,想要验证缓冲区设置大小的应用程序应调用getSendBufferSize()。- 参数:
-
size- 要设置的发送缓冲区大小。该值必须大于0。 - 抛出:
-
SocketException- 如果底层协议出现错误,如TCP错误。 -
IllegalArgumentException- 如果值为0或为负数。 - 自版本:
- 1.2
- 参见:
-
getSendBufferSize
- 返回值:
-
此
Socket的SO_SNDBUF选项的值。 - 抛出:
-
SocketException- 如果底层协议出现错误,如TCP错误。 - 自版本:
- 1.2
- 参见:
-
setReceiveBufferSize
将Socket的SO_RCVBUF选项设置为指定值。SO_RCVBUF选项由平台的网络代码用作设置底层网络I/O缓冲区大小的提示。增加接收缓冲区大小可以提高高容量连接的网络I/O性能,而减少它可以帮助减少传入数据的积压。
因为
SO_RCVBUF是一个提示,想要验证缓冲区设置大小的应用程序应调用getReceiveBufferSize()。SO_RCVBUF的值还用于设置广告给远程对等体的TCP接收窗口。通常,当套接字连接时,窗口大小可以随时修改。但是,如果需要大于64K的接收窗口,则必须在套接字连接到远程对等体之前请求此操作。需要注意两种情况:- 对于从ServerSocket接受的套接字,必须在ServerSocket绑定到本地地址之前通过调用
ServerSocket.setReceiveBufferSize(int)来执行此操作。 - 对于客户端套接字,必须在将套接字连接到其远程对等体之前调用setReceiveBufferSize()。
- 参数:
-
size- 要设置的接收缓冲区大小。该值必须大于0。 - 抛出:
-
IllegalArgumentException- 如果值为0或为负数。 -
SocketException- 如果底层协议出现错误,如TCP错误。 - 自版本:
- 1.2
- 参见:
- 对于从ServerSocket接受的套接字,必须在ServerSocket绑定到本地地址之前通过调用
-
getReceiveBufferSize
- 返回值:
-
此
Socket的SO_RCVBUF选项的值。 - 抛出:
-
SocketException- 如果底层协议出现错误,如TCP错误。 - 自版本:
- 1.2
- 参见:
-
setKeepAlive
启用/禁用SO_KEEPALIVE。- 参数:
-
on- 是否打开套接字保持活动。 - 抛出:
-
SocketException- 如果底层协议出现错误,如TCP错误。 - 自版本:
- 1.3
- 参见:
-
getKeepAlive
测试SO_KEEPALIVE是否已启用。- 返回值:
-
一个
boolean,指示是否启用了SO_KEEPALIVE。 - 抛出:
-
SocketException- 如果底层协议出现错误,如TCP错误。 - 自版本:
- 1.3
- 参见:
-
setTrafficClass
在从此Socket发送的数据包的IP头中设置流量类别或服务类型字节。由于底层网络实现可能会忽略此值,应用程序应将其视为提示。tc必须在范围
0 <= tc <= 255内,否则将抛出IllegalArgumentException。注:
对于Internet Protocol v4,该值由一个
整数组成,其中最低有效的8位表示套接字发送的IP数据包中TOS字节的值。RFC 1349定义了TOS值如下:IPTOS_LOWCOST (0x02)IPTOS_RELIABILITY (0x04)IPTOS_THROUGHPUT (0x08)IPTOS_LOWDELAY (0x10)
设置优先级字段中的位可能导致SocketException,指示不允许该操作。
正如RFC 1122第4.2.4.2节所示,符合标准的TCP实现应该允许应用程序在连接的生命周期内更改TOS字段,但不是必须的。因此,连接建立后是否可以更改TOS字段取决于底层平台中的实现。应用程序不应假设它们可以在连接后更改TOS字段。
对于Internet Protocol v6,
tc是将放入IP头的sin6_flowinfo字段的值。- 参数:
-
tc- 位集的int值。 - 抛出:
-
SocketException- 如果设置流量类别或服务类型时出现错误 - 自版本:
- 1.4
- 参见:
-
getTrafficClass
获取从此Socket发送的数据包的IP头中的流量类别或服务类型。由于底层网络实现可能会忽略使用
setTrafficClass(int)设置的流量类别或服务类型,因此此方法可能返回与之前使用setTrafficClass(int)方法在此Socket上设置的值不同的值。- 返回:
- 已设置的流量类别或服务类型
- 抛出:
-
SocketException- 如果获取流量类别或服务类型值时出现错误。 - 自版本:
- 1.4
- 另请参阅:
-
setReuseAddress
启用/禁用SO_REUSEADDR套接字选项。当TCP连接关闭后,连接可能会在关闭后的一段时间内保持超时状态(通常称为
TIME_WAIT状态或2MSL等待状态)。对于使用已知套接字地址或端口的应用程序,如果存在涉及套接字地址或端口的超时状态的连接,则可能无法将套接字绑定到所需的SocketAddress。在使用
SO_REUSEADDR绑定套接字之前启用,允许即使先前的连接处于超时状态,也可以绑定套接字。创建
Socket时,SO_REUSEADDR的初始设置为禁用。在套接字绑定后启用或禁用
SO_REUSEADDR的行为(请参见isBound())未定义。- 参数:
-
on- 是否启用或禁用套接字选项 - 抛出:
-
SocketException- 如果启用或禁用SO_REUSEADDR套接字选项时发生错误,或套接字已关闭。 - 自版本:
- 1.4
- 另请参阅:
-
getReuseAddress
检查SO_REUSEADDR是否已启用。- 返回:
-
一个指示
SO_REUSEADDR是否已启用的boolean值。 - 抛出:
-
SocketException- 如果底层协议中出现错误,如 TCP 错误。 - 自版本:
- 1.4
- 另请参阅:
-
close
关闭此套接字。当前在此套接字上阻塞的任何线程在此套接字上执行 I/O 操作时将抛出
SocketException。一旦套接字被关闭,它将不再可用于进一步的网络使用(即无法重新连接或重新绑定)。需要创建新的套接字。
关闭此套接字还将关闭套接字的
InputStream和OutputStream。如果此套接字有关联的通道,则通道也将被关闭。
- 指定者:
-
close在接口AutoCloseable中 - 指定者:
-
close在接口Closeable中 - 抛出:
-
IOException- 如果关闭此套接字时发生 I/O 错误。 - 另请参阅:
-
shutdownInput
将此套接字的输入流置于“流的末尾”。发送到套接字输入流端的任何数据都将被确认,然后被静默丢弃。如果在套接字上调用此方法后从套接字输入流中读取数据,则流的
available方法将返回 0,其read方法将返回-1(流的末尾)。- 抛出:
-
IOException- 如果关闭此套接字时发生 I/O 错误。 - 自版本:
- 1.3
- 另请参阅:
-
shutdownOutput
禁用此套接字的输出流。对于 TCP 套接字,先前写入的任何数据将被发送,然后是 TCP 的正常连接终止序列。如果在套接字上调用 shutdownOutput() 后向套接字输出流写入数据,则该流将抛出 IOException。- 抛出:
-
IOException- 如果关闭此套接字时发生 I/O 错误。 - 自版本:
- 1.3
- 另请参阅:
-
toString
将此套接字转换为String。 -
isConnected
public boolean isConnected()返回套接字的连接状态。注意:关闭套接字不会清除其连接状态,这意味着如果成功连接后关闭套接字(请参见
isClosed()),此方法将返回true。- 返回:
- 如果套接字成功连接到服务器,则返回 true
- 自版本:
- 1.4
-
isBound
public boolean isBound()返回套接字的绑定状态。注意:关闭套接字不会清除其绑定状态,这意味着如果成功绑定后关闭套接字(请参见
isClosed()),此方法将返回true。- 返回:
- 如果套接字成功绑定到地址,则返回 true
- 自版本:
- 1.4
- 另请参阅:
-
isClosed
public boolean isClosed()返回套接字的关闭状态。- 返回:
- 如果套接字已关闭,则返回 true
- 自版本:
- 1.4
- 另请参阅:
-
isInputShutdown
public boolean isInputShutdown()返回套接字连接的读半部分是否关闭。- 返回:
- 如果套接字的输入已关闭,则返回 true
- 自版本:
- 1.4
- 另请参阅:
-
isOutputShutdown
public boolean isOutputShutdown()返回套接字连接的写半部分是否关闭。- 返回:
- 如果套接字的输出已关闭,则返回 true
- 自版本:
- 1.4
- 另请参阅:
-
setSocketImplFactory
@Deprecated(since="17") public static void setSocketImplFactory(SocketImplFactory fac) throws IOException Deprecated.Use aSocketFactoryand subclassSocketdirectly.
This method provided a way in early JDK releases to replace the system wide implementation ofSocket. It has been mostly obsolete since Java 1.4. If required, aSocketcan be created to use a custom implementation by extendingSocketand using the protected constructor that takes an implementation as a parameter.为应用程序设置客户端套接字实现工厂。工厂只能指定一次。当应用程序创建新的客户端套接字时,将调用套接字实现工厂的
createSocketImpl方法来创建实际的套接字实现。将
null传递给该方法是一个空操作,除非已经设置了工厂。如果存在安全管理器,则此方法首先调用安全管理器的
checkSetFactory方法以确保允许该操作。这可能导致 SecurityException。- 参数:
-
fac- 所需的工厂 - 抛出:
-
IOException- 设置套接字工厂时发生 I/O 错误。 -
SocketException- 如果工厂已经定义。 -
SecurityException- 如果存在安全管理器且其checkSetFactory方法不允许该操作。 - 另请参阅:
-
setPerformancePreferences
public void setPerformancePreferences(int connectionTime, int latency, int bandwidth) 设置此套接字的性能偏好。套接字默认使用TCP/IP协议。一些实现可能提供具有不同性能特征的替代协议,与TCP/IP不同。此方法允许应用表达其对实现从可用协议中选择时如何进行权衡的偏好。
性能偏好由三个整数描述,其值表示短连接时间、低延迟和高带宽的相对重要性。整数的绝对值无关紧要;为了选择协议,只需比较这些值,较大的值表示更强的偏好。负值表示比正值优先级较低。例如,如果应用程序更喜欢短连接时间而不是低延迟和高带宽,那么可以使用值
(1, 0, 0)调用此方法。如果应用程序更喜欢高带宽而不是低延迟,低延迟而不是短连接时间,那么可以使用值(0, 1, 2)调用此方法。在此套接字连接后调用此方法将不起作用。
- 参数:
-
connectionTime- 表达短连接时间相对重要性的int -
latency- 表达低延迟相对重要性的int -
bandwidth- 表达高带宽相对重要性的int - 自版本:
- 1.5
-
setOption
设置套接字选项的值。- 类型参数:
-
T- 套接字选项值的类型 - 参数:
-
name- 套接字选项 -
value- 套接字选项的值。对于某些选项,null值可能有效。 - 返回:
- 此套接字
- 抛出:
-
UnsupportedOperationException- 如果套接字不支持该选项。 -
IllegalArgumentException- 如果值对该选项无效。 -
IOException- 如果发生I/O错误,或者套接字已关闭。 -
NullPointerException- 如果name为null -
SecurityException- 如果设置了安全管理器,如果套接字选项需要安全权限,且调用者没有所需权限。StandardSocketOptions不需要任何安全权限。 - 自版本:
- 9
-
getOption
返回套接字选项的值。- 类型参数:
-
T- 套接字选项值的类型 - 参数:
-
name- 套接字选项 - 返回:
- 套接字选项的值。
- 抛出:
-
UnsupportedOperationException- 如果套接字不支持该选项。 -
IOException- 如果发生I/O错误,或者套接字已关闭。 -
NullPointerException- 如果name为null -
SecurityException- 如果设置了安全管理器,如果套接字选项需要安全权限,且调用者没有所需权限。StandardSocketOptions不需要任何安全权限。 - 自版本:
- 9
-
supportedOptions
返回此套接字支持的套接字选项集。即使套接字已关闭,此方法仍将继续返回选项集。- 返回:
- 此套接字支持的套接字选项集。如果套接字的SocketImpl无法创建,则此集合可能为空。
- 自版本:
- 9
-