java.lang.Object java.net.Socket
public class Socket
此类实现客户端套接字(也可以就叫“套接字”)。套接字是两台机器间通信的端点。
套接字的实际工作由 SocketImpl
类的实例执行。应用程序通过更改创建套接字实现的套接字工厂可以配置它自身,以创建适合本地防火墙的套接字。
setSocketImplFactory(java.net.SocketImplFactory)
,
SocketImpl
,
SocketChannel
构造方法摘要 | |
---|---|
|
Socket() 通过系统默认类型的 SocketImpl 创建未连接套接字 |
|
Socket(InetAddress address, int port) 创建一个流套接字并将其连接到指定 IP 地址的指定端口号。 |
|
Socket(InetAddress host, int port, boolean stream) 已过时。 Use DatagramSocket instead for UDP transport. |
|
Socket(InetAddress address, int port, InetAddress localAddr, int localPort) 创建一个套接字并将其连接到指定远程地址上的指定远程端口。 |
|
Socket(Proxy proxy) 创建一个未连接的套接字并指定代理类型(如果有),该代理不管其他设置如何都应被使用。 |
protected |
Socket(SocketImpl impl) 使用用户指定的 SocketImpl 创建一个未连接 Socket。 |
|
Socket(String host, int port) 创建一个流套接字并将其连接到指定主机上的指定端口号。 |
|
Socket(String host, int port, boolean stream) 已过时。 使用 DatagramSocket 取代 UDP 传输。 |
|
Socket(String host, int port, InetAddress localAddr, int localPort) 创建一个套接字并将其连接到指定远程主机上的指定远程端口。 |
方法摘要 | |
---|---|
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() 返回此套接字绑定的端点的地址,如果尚未绑定则返回 null 。 |
boolean |
getOOBInline() 测试是否启用 OOBINLINE。 |
OutputStream |
getOutputStream() 返回此套接字的输出流。 |
int |
getPort() 返回此套接字连接到的远程端口。 |
int |
getReceiveBufferSize() 获取此 Socket 的 SO_RCVBUF 选项的值,该值是平台在 Socket 上输入时使用的缓冲区大小。 |
SocketAddress |
getRemoteSocketAddress() 返回此套接字连接的端点的地址,如果未连接则返回 null 。 |
boolean |
getReuseAddress() 测试是否启用 SO_REUSEADDR。 |
int |
getSendBufferSize() 获取此 Socket 的 SO_SNDBUF 选项的值,该值是平台在 Socket 上输出时使用的缓冲区大小。 |
int |
getSoLinger() 返回 SO_LINGER 的设置。 |
int |
getSoTimeout() 返回 SO_TIMEOUT 的设置。 |
boolean |
getTcpNoDelay() 测试是否启用 TCP_NODELAY。 |
int |
getTrafficClass() 为从此 Socket 上发送的包获取 IP 头中的流量类别或服务类型。 |
boolean |
isBound() 返回套接字的绑定状态。 |
boolean |
isClosed() 返回套接字的关闭状态。 |
boolean |
isConnected() 返回套接字的连接状态。 |
boolean |
isInputShutdown() 返回是否关闭套接字连接的半读状态 (read-half)。 |
boolean |
isOutputShutdown() 返回是否关闭套接字连接的半写状态 (write-half)。 |
void |
sendUrgentData(int data) 在套接字上发送一个紧急数据字节。 |
void |
setKeepAlive(boolean on) 启用/禁用 SO_KEEPALIVE。 |
void |
setOOBInline(boolean on) 启用/禁用 OOBINLINE(TCP 紧急数据的接收者) 默认情况下,此选项是禁用的,即在套接字上接收的 TCP 紧急数据被静默丢弃。 |
void |
setPerformancePreferences(int connectionTime, int latency, int bandwidth) 设置此套接字的性能偏好。 |
void |
setReceiveBufferSize(int size) 将此 Socket 的 SO_RCVBUF 选项设置为指定的值。 |
void |
setReuseAddress(boolean on) 启用/禁用 SO_REUSEADDR 套接字选项。 |
void |
setSendBufferSize(int size) 将此 Socket 的 SO_SNDBUF 选项设置为指定的值。 |
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 头中设置流量类别 (traffic class) 或服务类型八位组 (type-of-service octet)。 |
void |
shutdownInput() 此套接字的输入流置于“流的末尾”。 |
void |
shutdownOutput() 禁用此套接字的输出流。 |
String |
toString() 将此套接字转换为 String 。 |
从类 java.lang.Object 继承的方法 |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait |
构造方法详细信息 |
---|
public 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
- 如果存在安全管理器,但拒绝连接到代理的权限。
ProxySelector
,
Proxy
protected Socket(SocketImpl impl) throws SocketException
impl
- 子类希望在 Socket 上使用的
SocketImpl 的实例。
SocketException
- 如果底层协议出现错误,例如 TCP 错误。
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
方法不允许进行该操作。
setSocketImplFactory(java.net.SocketImplFactory)
,
SocketImpl
,
SocketImplFactory.createSocketImpl()
,
SecurityManager.checkConnect(java.lang.String, int)
public Socket(InetAddress address, int port) throws IOException
如果应用程序已指定套接字工厂,则调用该工厂的 createSocketImpl
方法来创建实际套接字实现。否则创建“普通”套接字。
如果有安全管理器,则使用主机地址和 port
作为参数调用其 checkConnect
方法。这可能会导致 SecurityException 异常。
address
- IP 地址。
port
- 端口号。
IOException
- 如果创建套接字时发生 I/O 错误。
SecurityException
- 如果安全管理器存在并且其
checkConnect
方法不允许进行该操作。
setSocketImplFactory(java.net.SocketImplFactory)
,
SocketImpl
,
SocketImplFactory.createSocketImpl()
,
SecurityManager.checkConnect(java.lang.String, int)
public Socket(String host, int port, InetAddress localAddr, int localPort) throws IOException
如果指定的主机为 null,则等效于指定与 InetAddress.getByName
(null) 相同的地址。换句话话,等效于指定回送接口的地址。
如果有安全管理器,则使用主机地址和 port
作为参数调用其 checkConnect
方法。这可能会导致 SecurityException 异常。
host
- 远程主机名,或者为
null
,表示回送地址。
port
- 远程端口
localAddr
- 要将套接字绑定到的本地地址
localPort
- 要将套接字绑定到的本地端口
IOException
- 如果在创建套接字时发生 I/O 错误。
SecurityException
- 如果安全管理器存在并且其
checkConnect
方法不允许进行该操作。
SecurityManager.checkConnect(java.lang.String, int)
public Socket(InetAddress address, int port, InetAddress localAddr, int localPort) throws IOException
如果有安全管理器,则使用主机地址和 port
作为参数调用其 checkConnect
方法。这可能会导致 SecurityException 异常。
address
- 远程地址
port
- 远程端口
localAddr
- 要将套接字绑定到的本地地址
localPort
- 要将套接字绑定到的本地端口
IOException
- 如果在创建套接字时发生 I/O 错误。
SecurityException
- 如果安全管理器存在并且其
checkConnect
方法不允许进行该操作。
SecurityManager.checkConnect(java.lang.String, int)
@Deprecated public Socket(String host, int port, boolean stream) throws IOException
如果指定的主机为 null,则等效于指定与 InetAddress.getByName
(null) 相同的地址。换句话话,等效于指定回送接口的地址。
如果流参数为 true
,则创建流套接字。如果流参数为 false
,则创建数据报套接字。
如果应用程序已指定服务器套接字工厂,则调用该工厂的 createSocketImpl
方法来创建实际套接字实现。否则创建“普通”套接字。
如果有安全管理器,则使用主机地址和 port
作为参数调用其 checkConnect
方法。这可能会导致 SecurityException 异常。
如果使用 UDP 套接字,则不应用与 TCP/IP 相关的套接字选项。
host
- 主机名,或者为
null
,表示回送地址。
port
- 端口号。
stream
- 指示此为流套接字还是数据报套接字的
boolean
。
IOException
- 如果创建套接字时发生 I/O 错误。
SecurityException
- 如果安全管理器存在并且其
checkConnect
方法不允许进行该操作。
setSocketImplFactory(java.net.SocketImplFactory)
,
SocketImpl
,
SocketImplFactory.createSocketImpl()
,
SecurityManager.checkConnect(java.lang.String, int)
@Deprecated public Socket(InetAddress host, int port, boolean stream) throws IOException
如果流参数为 true
,则创建流套接字。如果流参数为 false
,则创建数据报套接字。
如果应用程序已指定服务器套接字工厂,则调用该工厂的 createSocketImpl
方法来创建实际套接字实现。否则创建“普通”套接字。
如果有安全管理器,则使用 host.getHostAddress()
和 port
作为参数调用其 checkConnect
方法。这可能会导致 SecurityException 异常。
如果使用 UDP 套接字,则不应用与 TCP/IP 相关的套接字选项。
host
- IP 地址。
port
- 端口号。
stream
- 如果为
true
,则创建流套接字;否则创建数据报套接字。
IOException
- 如果创建套接字时发生 I/O 错误。
SecurityException
- 如果安全管理器存在并且其
checkConnect
方法不允许进行该操作。
setSocketImplFactory(java.net.SocketImplFactory)
,
SocketImpl
,
SocketImplFactory.createSocketImpl()
,
SecurityManager.checkConnect(java.lang.String, int)
方法详细信息 |
---|
public void connect(SocketAddress endpoint) throws IOException
endpoint
-
SocketAddress
IOException
- 如果在连接期间发生错误
IllegalBlockingModeException
- 如果此套接字具有关联的通道并且该通道处于非阻塞模式
IllegalArgumentException
- 如果端点为 null 或者此套接字不支持 SocketAddress 子类
public void connect(SocketAddress endpoint, int timeout) throws IOException
endpoint
-
SocketAddress
timeout
- 要使用的超时值(以毫秒为单位)。
IOException
- 如果在连接期间发生错误
SocketTimeoutException
- 如果在连接之前超时期满
IllegalBlockingModeException
- 如果此套接字具有关联的通道并且该通道处于非阻塞模式
IllegalArgumentException
- 如果端点为 null 或者此套接字不支持 SocketAddress 子类
public void bind(SocketAddress bindpoint) throws IOException
如果地址为 null
,则系统将挑选一个临时端口和一个有效本地地址来绑定套接字。
bindpoint
- 要绑定到的
SocketAddress
IOException
- 如果绑定操作失败或者已经绑定了套接字。
IllegalArgumentException
- 如果 bindpoint 是不受此套接字支持的 SocketAddress 子类。
isBound()
public InetAddress getInetAddress()
null
。
public InetAddress getLocalAddress()
InetAddress.anyLocalAddress()
。
public int getPort()
public int getLocalPort()
public SocketAddress getRemoteSocketAddress()
null
。
SocketAddress
,如果尚未连接则返回
null
。
getInetAddress()
,
getPort()
,
connect(SocketAddress, int)
,
connect(SocketAddress)
public SocketAddress getLocalSocketAddress()
null
。
SocketAddress
,如果尚未绑定则返回
null
。
getLocalAddress()
,
getLocalPort()
,
bind(SocketAddress)
public SocketChannel getChannel()
SocketChannel
对象(如果有)。
当且仅当通过 SocketChannel.open
或 ServerSocketChannel.accept
方法创建了通道本身时,套接字才具有一个通道。
public InputStream getInputStream() throws IOException
如果此套接字具有关联的通道,则所得的输入流会将其所有操作委托给通道。如果通道为非阻塞模式,则输入流的 read 操作将抛出 IllegalBlockingModeException
。
在非正常条件下,底层连接可能被远程主机或网络软件中断(例如,TCP 连接情况下的连接重置)。当网络软件检测到中断的连接时,将对返回的输入流应用以下操作:
网络软件可能丢弃经过套接字缓冲的字节。网络软件没有丢弃的字节可以使用 read
读取。
如果没有任何字节在套接字上缓冲,或者 read
已经消耗了所有缓冲的字节,则对 read
的所有后续调用都将抛出 IOException
。
关闭返回的 InputStream
将关闭关联套接字。
IOException
- 如果在创建输入流时发生 I/O 错误、没有关闭套接字、没有连接套接字或者使用
shutdownInput()
关闭了套接字输入
public OutputStream getOutputStream() throws IOException
如果此套接字具有关联的通道,则得到的输出流会将其所有操作委托给通道。如果通道为非阻塞模式,则输出流的 write 操作将抛出 IllegalBlockingModeException
。
关闭返回的 OutputStream
将关闭关联套接字。
IOException
- 如果创建输出流时发生 I/O 错误或者没有连接套接字。
public void setTcpNoDelay(boolean on) throws SocketException
on
- 为
true
表示启用 TCP_NODELAY;为
false
表示禁用。
SocketException
- 如果底层协议出现错误,例如 TCP 错误。
getTcpNoDelay()
public boolean getTcpNoDelay() throws SocketException
boolean
值。
SocketException
- 如果底层协议出现错误,例如 TCP 错误。
setTcpNoDelay(boolean)
public void setSoLinger(boolean on, int linger) throws SocketException
on
- 是否逗留。
linger
- 逗留时间,如果 on 为 true。
SocketException
- 如果底层协议出现错误,例如 TCP 错误。
IllegalArgumentException
- 如果逗留值为负。
getSoLinger()
public int getSoLinger() throws SocketException
SocketException
- 如果底层协议出现错误,例如 TCP 错误。
setSoLinger(boolean, int)
public void sendUrgentData(int data) throws IOException
data
- 要发送的数据字节
IOException
- 如果发送数据时发生错误。