- java.lang.Object
-
- java.net.Socket
-
- 实现的所有接口
-
Closeable
,AutoCloseable
- 已知直接子类:
-
SSLSocket
public class Socket extends Object implements Closeable
该类实现客户端套接字(也称为“套接字”)。 套接字是两台机器之间通信的端点。套接字的实际工作由
SocketImpl
类的实例执行。 通过更改创建套接字实现的套接字工厂,应用程序可以将自身配置为创建适合本地防火墙的套接字。- 从以下版本开始:
- 1.0
- 另请参见:
-
setSocketImplFactory(java.net.SocketImplFactory)
,SocketImpl
,SocketChannel
-
-
构造方法摘要
构造方法 变量 构造器 描述 Socket()
创建一个未连接的套接字,系统默认类型为SocketImpl。Socket(String host, int port)
创建流套接字并将其连接到指定主机上的指定端口号。Socket(String host, int port, boolean stream)
已过时。使用DatagramSocket代替UDP传输。Socket(String host, int port, InetAddress localAddr, int localPort)
创建套接字并将其连接到指定远程端口上的指定远程主机。Socket(InetAddress address, int port)
创建流套接字并将其连接到指定IP地址处的指定端口号。Socket(InetAddress host, int port, boolean stream)
已过时。使用DatagramSocket代替UDP传输。Socket(InetAddress address, int port, InetAddress localAddr, int localPort)
创建套接字并将其连接到指定远程端口上的指定远程地址。Socket(Proxy proxy)
创建一个未连接的套接字,指定应该使用的代理类型(如果有),而不管其他任何设置。protected
Socket(SocketImpl impl)
使用用户指定的SocketImpl创建未连接的Socket。
-
方法摘要
所有方法 静态方法 实例方法 具体的方法 变量和类型 方法 描述 void
bind(SocketAddress bindpoint)
将套接字绑定到本地地址。void
close()
关闭此套接字。void
connect(SocketAddress endpoint)
将此套接字连接到服务器。void
connect(SocketAddress endpoint, int timeout)
使用指定的超时值将此套接字连接到服务器。SocketChannel
getChannel()
返回与此套接字关联的唯一SocketChannel
对象(如果有)。InetAddress
getInetAddress()
返回套接字连接的地址。InputStream
getInputStream()
返回此套接字的输入流。boolean
getKeepAlive()
测试是否启用了SO_KEEPALIVE
。InetAddress
getLocalAddress()
获取套接字绑定的本地地址。int
getLocalPort()
返回此套接字绑定的本地端口号。SocketAddress
getLocalSocketAddress()
返回此套接字绑定的端点的地址。boolean
getOOBInline()
测试是否启用了SO_OOBINLINE
。<T> T
getOption(SocketOption<T> name)
返回套接字选项的值。OutputStream
getOutputStream()
返回此套接字的输出流。int
getPort()
返回此套接字连接的远程端口号。int
getReceiveBufferSize()
SocketAddress
getRemoteSocketAddress()
返回此套接字连接到的端点的地址,如果未连接则返回null
。boolean
getReuseAddress()
测试是否启用了SO_REUSEADDR
。int
getSendBufferSize()
int
getSoLinger()
返回SO_LINGER
的设置。int
getSoTimeout()
返回SO_TIMEOUT
的设置。 0返回意味着该选项被禁用(即无穷大的超时)。boolean
getTcpNoDelay()
测试是否启用了TCP_NODELAY
。int
getTrafficClass()
获取从此Socket发送的数据包的IP头中的流量类或服务类型boolean
isBound()
返回套接字的绑定状态。boolean
isClosed()
返回套接字的关闭状态。boolean
isConnected()
返回套接字的连接状态。boolean
isInputShutdown()
返回套接字连接的读半部分是否已关闭。boolean
isOutputShutdown()
返回套接字连接的写半部分是否已关闭。void
sendUrgentData(int data)
在套接字上发送一个字节的紧急数据。void
setKeepAlive(boolean on)
启用/禁用SO_KEEPALIVE
。void
setOOBInline(boolean on)
启用/禁用SO_OOBINLINE
(接收TCP紧急数据)默认情况下,此选项被禁用,并且套接字上收到的TCP紧急数据将被静默丢弃。<T> Socket
setOption(SocketOption<T> name, T value)
设置套接字选项的值。void
setPerformancePreferences(int connectionTime, int latency, int bandwidth)
设置此套接字的性能首选项。void
setReceiveBufferSize(int size)
设置SO_RCVBUF
选项,此规定值Socket
。void
setReuseAddress(boolean on)
启用/禁用SO_REUSEADDR
套接字选项。void
setSendBufferSize(int size)
设置SO_SNDBUF
选项,此规定值Socket
。static void
setSocketImplFactory(SocketImplFactory fac)
设置应用程序的客户端套接字实现工厂。void
setSoLinger(boolean on, int linger)
使用指定的延迟时间(以秒为单位)启用/禁用SO_LINGER
。void
setSoTimeout(int timeout)
使用指定的超时启用/禁用SO_TIMEOUT
,以毫秒为单位。void
setTcpNoDelay(boolean on)
启用/禁用TCP_NODELAY
(禁用/启用Nagle的算法)。void
setTrafficClass(int tc)
为从此Socket发送的数据包的IP标头设置流量类或服务类型八位字节。void
shutdownInput()
将此套接字的输入流放在“流结束”。void
shutdownOutput()
禁用此套接字的输出流。Set<SocketOption<?>>
supportedOptions()
返回此套接字支持的一组套接字选项。String
toString()
将此套接字转换为String
。
-
-
-
构造方法详细信息
-
Socket
public Socket()
创建一个未连接的套接字,系统默认类型为SocketImpl。- 从以下版本开始:
- 1.1
-
Socket
public Socket(Proxy proxy)
创建一个未连接的套接字,指定应该使用的代理类型(如果有),而不管其他任何设置。如果有安全管理器,则使用代理主机地址和端口号作为其参数调用其
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
- 另请参见:
-
ProxySelector
,Proxy
-
-
Socket
protected Socket(SocketImpl impl) throws SocketException
使用用户指定的SocketImpl创建未连接的Socket。- 参数
-
impl
- 子类希望在Socket上使用的 SocketImpl实例。 - 异常
-
SocketException
- 如果底层协议中存在错误,例如TCP错误。 - 从以下版本开始:
- 1.1
-
Socket
public Socket(String host, int port) throws UnknownHostException, IOException
创建流套接字并将其连接到指定主机上的指定端口号。如果指定的主机是
null
,则相当于将地址指定为InetAddress.getByName
(null)
。 换句话说,它等同于指定环回接口的地址。如果应用程序已指定服务器套接字工厂,则调用该工厂的
createSocketImpl
方法以创建实际的套接字实现。 否则会创建一个“普通”套接字。如果有安全管理器,则使用主机地址和
port
作为其参数调用其checkConnect
方法。 这可能会导致SecurityException。- 参数
-
host
- 主机名,或环回地址的null
。 -
port
- 端口号。 - 异常
-
UnknownHostException
- 如果无法确定主机的IP地址。 -
IOException
- 如果在创建套接字时发生I / O错误。 -
SecurityException
- 如果存在安全管理器且其checkConnect
方法不允许该操作。 -
IllegalArgumentException
- 如果port参数超出指定的有效端口值范围,则介于0和65535之间(包括0和65535)。 - 另请参见:
-
setSocketImplFactory(java.net.SocketImplFactory)
,SocketImpl
,SocketImplFactory.createSocketImpl()
,SecurityManager.checkConnect(java.lang.String, int)
-
Socket
public Socket(InetAddress address, int port) throws IOException
创建流套接字并将其连接到指定IP地址处的指定端口号。如果应用程序已指定套接字工厂,则调用该工厂的
createSocketImpl
方法以创建实际的套接字实现。 否则会创建一个“普通”套接字。如果有安全管理器,则使用主机地址和
port
作为其参数调用其checkConnect
方法。 这可能会导致SecurityException。- 参数
-
address
- IP地址。 -
port
- 端口号。 - 异常
-
IOException
- 如果在创建套接字时发生I / O错误。 -
SecurityException
- 如果存在安全管理器且其checkConnect
方法不允许该操作。 -
IllegalArgumentException
- 如果port参数超出指定的有效端口值范围,则介于0和65535之间(包括0和65535)。 -
NullPointerException
- 如果address
为空。 - 另请参见:
-
setSocketImplFactory(java.net.SocketImplFactory)
,SocketImpl
,SocketImplFactory.createSocketImpl()
,SecurityManager.checkConnect(java.lang.String, int)
-
Socket
public Socket(String host, int port, InetAddress localAddr, int localPort) throws IOException
创建套接字并将其连接到指定远程端口上的指定远程主机。 Socket还将bind()绑定到提供的本地地址和端口。如果指定的主机是
null
,则相当于将地址指定为InetAddress.getByName
(null)
。 换句话说,它等同于指定环回接口的地址。本地端口号
zero
将让系统在bind
操作中bind
空闲端口。如果有安全管理器,则使用主机地址和
port
作为其参数调用其checkConnect
方法。 这可能会导致SecurityException。- 参数
-
host
- 远程主机的名称,或环回地址的null
。 -
port
- 远程端口 -
localAddr
- 套接字绑定的本地地址,或null
为anyLocal
地址。 -
localPort
- 套接字绑定的本地端口,或zero
用于系统选定的空闲端口。 - 异常
-
IOException
- 如果在创建套接字时发生I / O错误。 -
SecurityException
- 如果存在安全管理器且其checkConnect
方法不允许连接到目标,或者其checkListen
方法不允许绑定到本地端口。 -
IllegalArgumentException
- 如果port参数或localPort参数超出指定的有效端口值范围,则介于0和65535之间(包括0和65535)。 - 从以下版本开始:
- 1.1
- 另请参见:
-
SecurityManager.checkConnect(java.lang.String, int)
-
Socket
public Socket(InetAddress address, int port, InetAddress localAddr, int localPort) throws IOException
创建套接字并将其连接到指定远程端口上的指定远程地址。 Socket还将bind()绑定到提供的本地地址和端口。如果指定的本地地址是
null
,则相当于将地址指定为AnyLocal地址(请参阅InetAddress.isAnyLocalAddress
()
)。本地端口号
zero
将让系统在bind
操作中bind
空闲端口。如果有安全管理器,则使用主机地址和
port
作为其参数调用其checkConnect
方法。 这可能会导致SecurityException。- 参数
-
address
- 远程地址 -
port
- 远程端口 -
localAddr
-本地地址的套接字绑定到,或null
为anyLocal
地址。 -
localPort
- 套接字绑定的本地端口或zero
用于系统选定的空闲端口。 - 异常
-
IOException
- 如果在创建套接字时发生I / O错误。 -
SecurityException
- 如果存在安全管理器且其checkConnect
方法不允许连接到目标,或者其checkListen
方法不允许绑定到本地端口。 -
IllegalArgumentException
- 如果port参数或localPort参数超出指定的有效端口值范围(介于0和65535之间,包括0和65535)。 -
NullPointerException
- 如果address
为空。 - 从以下版本开始:
- 1.1
- 另请参见:
-
SecurityManager.checkConnect(java.lang.String, int)
-
Socket
@Deprecated public Socket(String host, int port, boolean stream) throws IOException
Deprecated.Use DatagramSocket instead for UDP transport.创建流套接字并将其连接到指定主机上的指定端口号。如果指定的主机是
null
,则相当于将地址指定为InetAddress.getByName
(null)
。 换句话说,它等同于指定环回接口的地址。如果stream参数为
true
,则会创建一个流套接字。 如果stream参数为false
,则会创建数据报套接字。如果应用程序指定了服务器套接字工厂,则调用该工厂的
createSocketImpl
方法以创建实际的套接字实现。 否则会创建一个“普通”套接字。如果有安全管理器,则使用主机地址和
port
作为其参数调用其checkConnect
方法。 这可能会导致SecurityException。如果使用UDP套接字,则不适用与TCP / IP相关的套接字选项。
- 参数
-
host
- 主机名,或环回地址的null
。 -
port
- 端口号。 -
stream
-boolean
指示这是流套接字还是数据报套接字。 - 异常
-
IOException
- 如果在创建套接字时发生I / O错误。 -
SecurityException
- 如果存在安全管理器且其checkConnect
方法不允许该操作。 -
IllegalArgumentException
- 如果port参数超出指定的有效端口值范围,则介于0和65535之间(包括0和65535)。 - 另请参见:
-
setSocketImplFactory(java.net.SocketImplFactory)
,SocketImpl
,SocketImplFactory.createSocketImpl()
,SecurityManager.checkConnect(java.lang.String, int)
-
Socket
@Deprecated public Socket(InetAddress host, int port, boolean stream) throws IOException
Deprecated.Use DatagramSocket instead for UDP transport.创建套接字并将其连接到指定IP地址处的指定端口号。如果stream参数为
true
,则会创建一个流套接字。 如果stream参数为false
,则会创建数据报套接字。如果应用程序已指定服务器套接字工厂,则调用该工厂的
createSocketImpl
方法以创建实际的套接字实现。 否则会创建一个“普通”套接字。如果有安全管理器,则使用
host.getHostAddress()
和port
作为其参数调用其checkConnect
方法。 这可能会导致SecurityException。如果使用UDP套接字,则不适用与TCP / IP相关的套接字选项。
- 参数
-
host
- IP地址。 -
port
- 端口号。 -
stream
- 如果是true
,则创建一个流套接字; 否则,创建一个数据报套接字。 - 异常
-
IOException
- 如果在创建套接字时发生I / O错误。 -
SecurityException
- 如果存在安全管理器且其checkConnect
方法不允许该操作。 -
IllegalArgumentException
- 如果port参数超出指定的有效端口值范围,则介于0和65535之间(包括0和65535)。 -
NullPointerException
- 如果host
为空。 - 另请参见:
-
setSocketImplFactory(java.net.SocketImplFactory)
,SocketImpl
,SocketImplFactory.createSocketImpl()
,SecurityManager.checkConnect(java.lang.String, int)
-
-
方法详细信息
-
connect
public void connect(SocketAddress endpoint) throws IOException
将此套接字连接到服务器。- 参数
-
endpoint
-SocketAddress
- 异常
-
IOException
- 如果连接期间发生错误 -
IllegalBlockingModeException
- 如果此套接字具有关联的通道,并且该通道处于非阻塞模式 -
IllegalArgumentException
- 如果endpoint为null或者是此套接字不支持的SocketAddress子类 - 从以下版本开始:
- 1.4
-
connect
public void connect(SocketAddress endpoint, int timeout) throws IOException
使用指定的超时值将此套接字连接到服务器。 超时为零被解释为无限超时。 然后,连接将阻塞,直到建立或发生错误。- 参数
-
endpoint
-SocketAddress
-
timeout
- 要使用的超时值,以毫秒为单位。 - 异常
-
IOException
- 如果连接期间发生错误 -
SocketTimeoutException
- 如果超时在连接之前到期 -
IllegalBlockingModeException
- 如果此套接字具有关联的通道,并且该通道处于非阻塞模式 -
IllegalArgumentException
- 如果endpoint为null或者是此套接字不支持的SocketAddress子类 - 从以下版本开始:
- 1.4
-
bind
public void bind(SocketAddress bindpoint) throws IOException
将套接字绑定到本地地址。如果地址是
null
,则系统将获取临时端口和有效的本地地址以绑定套接字。- 参数
-
bindpoint
- 要绑定到的SocketAddress
- 异常
-
IOException
- 如果绑定操作失败,或者套接字已绑定。 -
IllegalArgumentException
- 如果bindpoint是此套接字不支持的SocketAddress子类 -
SecurityException
- 如果存在安全管理器且其checkListen
方法不允许绑定到本地端口。 - 从以下版本开始:
- 1.4
- 另请参见:
-
isBound()
-
getInetAddress
public InetAddress getInetAddress()
返回套接字连接的地址。如果套接字在
closed
之前已连接,则此方法将在套接字关闭后继续返回连接的地址。- 结果
-
此套接字连接的远程IP地址,如果未连接套接字,
null
。
-
getLocalAddress
public InetAddress getLocalAddress()
获取套接字绑定的本地地址。如果存在安全管理器集,则使用本地地址和
-1
作为其参数调用其checkConnect
方法,以查看是否允许该操作。 如果不允许该操作,则返回loopback
地址。- 结果
- 套接字绑定的本地地址,安全管理器拒绝的环回地址,如果套接字已关闭或尚未绑定,则为通配符地址。
- 从以下版本开始:
- 1.1
- 另请参见:
-
SecurityManager.checkConnect(java.lang.String, int)
-
getPort
public int getPort()
返回此套接字连接的远程端口号。如果套接字在
closed
之前已连接,则此方法将在套接字关闭后继续返回连接的端口号。- 结果
- 此套接字连接到的远程端口号,如果尚未连接套接字,则为0。
-
getLocalPort
public int getLocalPort()
- 结果
- 此套接字绑定到的本地端口号,如果尚未绑定套接字,则返回-1。
-
getRemoteSocketAddress
public SocketAddress getRemoteSocketAddress()
返回此套接字连接到的端点的地址,如果未连接,则null
。如果套接字在
closed
之前已连接,则此方法将在套接字关闭后继续返回连接的地址。- 结果
-
SocketAddress
表示此套接字的远程端点,如果尚未连接,null
。 - 从以下版本开始:
- 1.4
- 另请参见:
-
getInetAddress()
,getPort()
,connect(SocketAddress, int)
,connect(SocketAddress)
-
getLocalSocketAddress
public SocketAddress getLocalSocketAddress()
返回此套接字绑定的端点的地址。如果绑定到
InetSocketAddress
表示的端点的InetSocketAddress
为closed
,则此方法将在套接字关闭后继续返回InetSocketAddress
。 在这种情况下,返回的InetSocketAddress
的地址是wildcard
地址,其端口是它绑定的本地端口。如果存在安全管理器集,则使用本地地址和
-1
作为其参数调用其checkConnect
方法,以查看是否允许该操作。 如果不允许该操作,则SocketAddress
表示loopback
地址的SocketAddress以及该套接字绑定到的本地端口。- 结果
-
一个
SocketAddress
表示此套接字的本地端点或SocketAddress
代表的环回地址,如果安全管理器拒绝,或null
如果套接字尚未绑定。 - 从以下版本开始:
- 1.4
- 另请参见:
-
getLocalAddress()
,getLocalPort()
,bind(SocketAddress)
,SecurityManager.checkConnect(java.lang.String, int)
-
getChannel
public SocketChannel getChannel()
返回与此套接字关联的唯一SocketChannel
对象(如果有)。当且仅当通道本身是通过
SocketChannel.open
或ServerSocketChannel.accept
方法创建时,套接字才会有通道。- 结果
-
与此套接字关联的套接字通道,如果未为通道创建此套接字,
null
- 从以下版本开始:
- 1.4
-
getInputStream
public InputStream getInputStream() throws IOException
返回此套接字的输入流。如果此套接字具有关联的通道,则生成的输入流将其所有操作委托给通道。 如果通道处于非阻塞模式,则输入流的
read
操作将抛出IllegalBlockingModeException
。在异常情况下,远程主机或网络软件可能会破坏底层连接(例如TCP连接时的连接重置)。 当网络软件检测到断开连接时,以下内容适用于返回的输入流: -
如果套接字上没有缓冲的字节,或者
read
消耗了所有缓冲的字节,则对read
的所有后续调用将抛出IOException
。
关闭返回的
InputStream
将关闭关联的套接字。- 结果
- 用于从此套接字读取字节的输入流。
- 异常
-
IOException
- 如果在创建输入流时发生I / O错误,则套接字关闭,套接字未连接,或套接字输入已使用shutdownInput()
关闭
-
getOutputStream
public OutputStream getOutputStream() throws IOException
返回此套接字的输出流。如果此套接字具有关联的通道,则生成的输出流将其所有操作委托给通道。 如果通道处于非阻塞模式,则输出流的
write
操作将抛出IllegalBlockingModeException
。关闭返回的
OutputStream
将关闭关联的套接字。- 结果
- 用于将字节写入此套接字的输出流。
- 异常
-
IOException
- 如果在创建输出流时发生I / O错误或未连接套接字。
-
setTcpNoDelay
public void setTcpNoDelay(boolean on) throws SocketException
启用/禁用TCP_NODELAY
(禁用/启用Nagle的算法)。- 参数
-
on
-true
启用TCP_NODELAY,false
禁用。 - 异常
-
SocketException
- 如果底层协议中存在错误,例如TCP错误。 - 从以下版本开始:
- 1.1
- 另请参见:
-
getTcpNoDelay()
-
getTcpNoDelay
public boolean getTcpNoDelay() throws SocketException
测试是否启用了TCP_NODELAY
。- 结果
-
boolean
指示是否已启用TCP_NODELAY
。 - 异常
-
SocketException
- 如果底层协议中存在错误,例如TCP错误。 - 从以下版本开始:
- 1.1
- 另请参见:
-
setTcpNoDelay(boolean)
-
setSoLinger
public void setSoLinger(boolean on, int linger) throws SocketException
- 参数
-
on
- 是否留在上面。 -
linger
- 如果是真的,可以徘徊多长时间。 - 异常
-
SocketException
- 如果底层协议中存在错误,例如TCP错误。 -
IllegalArgumentException
- 如果值为负值。 - 从以下版本开始:
- 1.1
- 另请参见:
-
getSoLinger()
-
getSoLinger
public int getSoLinger() throws SocketException
- 结果
-
SO_LINGER
的设置。 - 异常
-
SocketException
- 如果底层协议中存在错误,例如TCP错误。 - 从以下版本开始:
- 1.1
- 另请参见:
-
setSoLinger(boolean, int)
-
sendUrgentData
public void sendUrgentData(int data) throws IOException
在套接字上发送一个字节的紧急数据。 要发送的字节是数据参数的最低8位。 紧接字节在任何先前写入套接字OutputStream之后以及将来写入OutputStream之前发送。- 参数
-
data
- 要发送的数据字节 - 异常
-
IOException
- 如果发送数据时出错。 - 从以下版本开始:
- 1.4
-
setOOBInline
public void setOOBInline(boolean on) throws SocketException
启用/禁用SO_OOBINLINE
(接收TCP紧急数据)默认情况下,禁用此选项并静默丢弃在套接字上接收的TCP紧急数据。 如果用户希望接收紧急数据,则必须启用此选项。 启用后,紧急数据将与正常数据一起接收。请注意,仅提供有限的支持来处理传入的紧急数据。 特别是,没有提供传入紧急数据的通知,除非由更高级别的协议提供,否则无法区分正常数据和紧急数据。
- 参数
-
on
-true
使SO_OOBINLINE
,false
禁用。 - 异常
-
SocketException
- 如果底层协议中存在错误,例如TCP错误。 - 从以下版本开始:
- 1.4
- 另请参见:
-
getOOBInline()
-
getOOBInline
public boolean getOOBInline() throws SocketException
测试是否启用了SO_OOBINLINE
。- 结果
-
a
boolean
指示是否已启用SO_OOBINLINE
。 - 异常
-
SocketException
- 如果底层协议中存在错误,例如TCP错误。 - 从以下版本开始:
- 1.4
- 另请参见:
-
setOOBInline(boolean)
-
setSoTimeout
public void setSoTimeout(int timeout) throws SocketException
使用指定的超时启用/禁用SO_TIMEOUT
,以毫秒为单位。 如果将此选项设置为非零超时,则与此Socket关联的InputStream上的read()调用将仅阻止这段时间。 如果超时到期,则引发java.net.SocketTimeoutException ,尽管Socket仍然有效。 必须在进入阻止操作之前启用该选项才能生效。 超时时间必须为> 0
。 超时为零被解释为无限超时。- 参数
-
timeout
- 指定的超时,以毫秒为单位。 - 异常
-
SocketException
- 如果底层协议中存在错误,例如TCP错误。 - 从以下版本开始:
- 1.1
- 另请参见:
-
getSoTimeout()
-
getSoTimeout
public int getSoTimeout() throws SocketException
返回SO_TIMEOUT
的设置。 0返回意味着该选项被禁用(即无穷大的超时)。- 结果
-
SO_TIMEOUT
的设置 - 异常
-
SocketException
- 如果底层协议中存在错误,例如TCP错误。 - 从以下版本开始:
- 1.1
- 另请参见:
-
setSoTimeout(int)
-
setSendBufferSize
public void setSendBufferSize(int size) throws SocketException
设置SO_SNDBUF
选项,此规定值Socket
。 平台的网络代码使用SO_SNDBUF
选项作为设置底层网络I / O缓冲区大小的提示。因为
SO_SNDBUF
是一个提示,想要验证缓冲区设置大小的应用程序应该调用getSendBufferSize()
。- 参数
-
size
- 设置发送缓冲区大小的大小。 该值必须大于0。 - 异常
-
SocketException
- 如果底层协议中存在错误,例如TCP错误。 -
IllegalArgumentException
- 如果值为0或为负数。 - 从以下版本开始:
- 1.2
- 另请参见:
-
getSendBufferSize()
-
getSendBufferSize
public int getSendBufferSize() throws SocketException
- 结果
-
此
Socket
的SO_SNDBUF
选项的值。 - 异常
-
SocketException
- 如果底层协议中存在错误,例如TCP错误。 - 从以下版本开始:
- 1.2
- 另请参见:
-
setSendBufferSize(int)
-
setReceiveBufferSize
public void setReceiveBufferSize(int size) throws SocketException
设置SO_RCVBUF
选项,此规定值Socket
。 平台的网络代码使用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
- 另请参见:
-
getReceiveBufferSize()
,ServerSocket.setReceiveBufferSize(int)
- 对于从ServerSocket接受的套接字,必须在ServerSocket绑定到本地地址之前调用
-
getReceiveBufferSize
public int getReceiveBufferSize() throws SocketException
- 结果
-
此
Socket
的SO_RCVBUF
选项的值。 - 异常
-
SocketException
- 如果底层协议中存在错误,例如TCP错误。 - 从以下版本开始:
- 1.2
- 另请参见:
-
setReceiveBufferSize(int)
-
setKeepAlive
public void setKeepAlive(boolean on) throws SocketException
启用/禁用SO_KEEPALIVE
。- 参数
-
on
- 是否打开套接字保持活动状态。 - 异常
-
SocketException
- 如果底层协议中存在错误,例如TCP错误。 - 从以下版本开始:
- 1.3
- 另请参见:
-
getKeepAlive()
-
getKeepAlive
public boolean getKeepAlive() throws SocketException
测试是否启用了SO_KEEPALIVE
。- 结果
-
boolean
指示是否已启用SO_KEEPALIVE
。 - 异常
-
SocketException
- 如果底层协议中存在错误,例如TCP错误。 - 从以下版本开始:
- 1.3
- 另请参见:
-
setKeepAlive(boolean)
-
setTrafficClass
public void setTrafficClass(int tc) throws SocketException
为从此Socket发送的数据包的IP标头设置流量类或服务类型八位字节。 由于底层网络实现可能会忽略此值,因此应用程序应将其视为提示。tc 必须在
0 <= tc <= 255
范围内,0 <= tc <= 255
将抛出IllegalArgumentException。笔记:
对于Internet协议v4,该值由
integer
组成,其中最低有效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字段。 因此,在建立TCP连接之后是否可以更改服务类型字段取决于底层平台中的实现。 应用程序不应假设它们可以在连接后更改TOS字段。
对于Internet协议v6
tc
是将放入IP头的sin6_flowinfo字段的值。- 参数
-
tc
- bitset的值为int
。 - 异常
-
SocketException
- 如果设置流量类别或服务类型时出错 - 从以下版本开始:
- 1.4
- 另请参见:
-
getTrafficClass()
,SocketOptions.IP_TOS
-
-
getTrafficClass
public int getTrafficClass() throws SocketException
获取从此Socket发送的数据包的IP头中的流量类或服务类型由于底层网络实现可能会忽略使用
setTrafficClass(int)
的流量类或服务类型集, 因此此方法可能返回与先前在此Socket上使用setTrafficClass(int)
方法设置的值不同的值。- 结果
- 已设置的流量类别或服务类型
- 异常
-
SocketException
- 如果获取流量类或服务类型值时出错。 - 从以下版本开始:
- 1.4
- 另请参见:
-
setTrafficClass(int)
,SocketOptions.IP_TOS
-
setReuseAddress
public void setReuseAddress(boolean on) throws SocketException
启用/禁用SO_REUSEADDR
套接字选项。当TCP连接关闭时,连接可能会在连接关闭后的一段时间内保持超时状态(通常称为
TIME_WAIT
状态或2MSL
等待状态)。 对于使用众所周知的套接字地址或端口的应用程序,如果在涉及套接字地址或端口的超时状态中存在连接,则可能无法将套接字绑定到所需的SocketAddress
。在使用
bind(SocketAddress)
绑定套接字之前启用SO_REUSEADDR
允许套接字绑定,即使先前的连接处于超时状态。当
Socket
被创建的初始设定SO_REUSEADDR
被禁用。未定义绑定套接字后启用或禁用
SO_REUSEADDR
时的行为(请参阅isBound()
)。- 参数
-
on
- 是否启用或禁用套接字选项 - 异常
-
SocketException
- 如果在启用或禁用SO_REUSEADDR
套接字选项时发生错误,或者套接字已关闭。 - 从以下版本开始:
- 1.4
- 另请参见:
-
getReuseAddress()
,bind(SocketAddress)
,isClosed()
,isBound()
-
getReuseAddress
public boolean getReuseAddress() throws SocketException
测试是否启用了SO_REUSEADDR
。- 结果
-
boolean
指示是否已启用SO_REUSEADDR
。 - 异常
-
SocketException
- 如果底层协议中存在错误,例如TCP错误。 - 从以下版本开始:
- 1.4
- 另请参见:
-
setReuseAddress(boolean)
-
close
public void close() throws IOException
关闭此套接字。当前在此套接字上的I / O操作中阻塞的任何线程将抛出
SocketException
。一旦套接字关闭,它就无法用于进一步的网络连接(即无法重新连接或反弹)。 需要创建一个新的套接字。
关闭此套接字也将关闭套接字
InputStream
和OutputStream
。如果此套接字具有关联的通道,则通道也将关闭。
- Specified by:
-
close
在界面AutoCloseable
- Specified by:
-
close
在界面Closeable
- 异常
-
IOException
- 如果关闭此套接字时发生I / O错误。 - 另请参见:
-
isClosed()
-
shutdownInput
public void shutdownInput() throws IOException
将此套接字的输入流放在“流结束”。 发送到套接字输入流端的任何数据都会被确认,然后以静默方式丢弃。如果在套接字上调用此方法后从套接字输入流中读取,则流的
available
方法将返回0,其read
方法将返回-1
(流结束)。- 异常
-
IOException
- 如果在关闭此套接字时发生I / O错误。 - 从以下版本开始:
- 1.3
- 另请参见:
-
shutdownOutput()
,close()
,setSoLinger(boolean, int)
,isInputShutdown()
-
shutdownOutput
public void shutdownOutput() throws IOException
禁用此套接字的输出流。 对于TCP套接字,将发送任何先前写入的数据,然后发送TCP的正常连接终止序列。 如果在套接字上调用shutdownOutput()之后写入套接字输出流,则流将抛出IOException。- 异常
-
IOException
- 如果在关闭此套接字时发生I / O错误。 - 从以下版本开始:
- 1.3
- 另请参见:
-
shutdownInput()
,close()
,setSoLinger(boolean, int)
,isOutputShutdown()
-
isConnected
public boolean isConnected()
返回套接字的连接状态。注意:关闭套接字不会清除其连接状态,这意味着如果在关闭之前成功连接,则此方法将为已关闭的套接字返回
true
(请参阅isClosed()
)。- 结果
- 如果套接字已成功连接到服务器,则为true
- 从以下版本开始:
- 1.4
-
isBound
public boolean isBound()
返回套接字的绑定状态。注意:关闭套接字不会清除其绑定状态,这意味着如果关闭套接字在关闭之前成功绑定,则此方法将返回
true
(请参阅isClosed()
)。- 结果
- 如果套接字已成功绑定到某个地址,则为true
- 从以下版本开始:
- 1.4
- 另请参见:
-
bind(java.net.SocketAddress)
-
isClosed
public boolean isClosed()
返回套接字的关闭状态。- 结果
- 如果套接字已关闭,则为true
- 从以下版本开始:
- 1.4
- 另请参见:
-
close()
-
isInputShutdown
public boolean isInputShutdown()
返回套接字连接的读半部分是否已关闭。- 结果
- 如果套接字的输入已关闭,则为true
- 从以下版本开始:
- 1.4
- 另请参见:
-
shutdownInput()
-
isOutputShutdown
public boolean isOutputShutdown()
返回套接字连接的写半部分是否已关闭。- 结果
- 如果套接字的输出已关闭,则为true
- 从以下版本开始:
- 1.4
- 另请参见:
-
shutdownOutput()
-
setSocketImplFactory
public static void setSocketImplFactory(SocketImplFactory fac) throws IOException
设置应用程序的客户端套接字实现工厂。 工厂只能指定一次。当应用程序创建新的客户端套接字时,将调用套接字实现工厂的
createSocketImpl
方法来创建实际的套接字实现。除非工厂已经设置,否则将
null
传递给该方法是无操作的。如果有安全管理器,则此方法首先调用安全管理器的
checkSetFactory
方法以确保允许操作。 这可能会导致SecurityException。- 参数
-
fac
- 所需的工厂。 - 异常
-
IOException
- 如果在设置套接字工厂时发生I / O错误。 -
SocketException
- 如果已定义工厂。 -
SecurityException
- 如果存在安全管理器且其checkSetFactory
方法不允许该操作。 - 另请参见:
-
SocketImplFactory.createSocketImpl()
,SecurityManager.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
public <T> Socket setOption(SocketOption<T> name, T value) throws IOException
设置套接字选项的值。- 参数类型
-
T
- 套接字选项值的类型 - 参数
-
name
- 套接字选项 -
value
- 套接字选项的值。 值null
可能对某些选项有效。 - 结果
- 这个Socket
- 异常
-
UnsupportedOperationException
- 如果套接字不支持该选项。 -
IllegalArgumentException
- 如果该值对选项无效。 -
IOException
- 如果发生I / O错误,或者套接字已关闭。 -
NullPointerException
- 如果名称是null
-
SecurityException
- 如果设置了安全管理器,并且套接字选项需要安全权限,并且调用者没有所需的权限。StandardSocketOptions
不需要任何安全权限。 - 从以下版本开始:
- 9
-
getOption
public <T> T getOption(SocketOption<T> name) throws IOException
返回套接字选项的值。- 参数类型
-
T
- 套接字选项值的类型 - 参数
-
name
- 套接字选项 - 结果
- 套接字选项的值。
- 异常
-
UnsupportedOperationException
- 如果套接字不支持该选项。 -
IOException
- 如果发生I / O错误,或者套接字已关闭。 -
NullPointerException
- 如果名称是null
-
SecurityException
- 如果设置了安全管理器,并且套接字选项需要安全权限,并且调用者没有所需的权限。StandardSocketOptions
不需要任何安全权限。 - 从以下版本开始:
- 9
-
supportedOptions
public Set<SocketOption<?>> supportedOptions()
返回此套接字支持的一组套接字选项。 即使在套接字关闭后,此方法仍将继续返回选项集。- 结果
- 此套接字支持的一组套接字选项。 如果无法创建套接字的SocketImpl,则此set可能为空。
- 从以下版本开始:
- 9
-
-