Java原生Socket API
类列表
类名 | 描述 |
java.net.Socket | 客户端套接字 |
java.net.ServerSocket | 服务器套接字 |
java.net.InetAddress | 用来表示IP地址的高级表示 |
java.net.InetSocketAddress | 实现 IP 套接字地址(IP 地址 + 端口号) |
java.net.DatagramSocket | 用于发送和接收数据报包的套接字。 |
java.net.DatagramPacket | 表示数据报包 |
相关API说明
java.net.Socket
构造方法摘要 | |
public |
Socket() 通过系统默认类型的SocketImpl创建未连接套接字 |
public |
Socket(Proxy proxy) 创建一个未连接的套接字并指定代理类型(如果有),该代理不管其他设置如何都应被使用。 示例: Socket s = new Socket(Proxy.NO_PROXY); 将创建忽略任何其他代理配置的普通套接字。 |
protected |
Socket(SocketImpl impl) 使用用户指定的 SocketImpl 创建一个未连接 Socket。 |
public |
Socket(String host,int port) 创建一个流套接字并将其连接到指定主机上的指定端口号。 如果指定的主机为 null,则等效于指定与 InetAddress.getByName(null) 相同的地址。换句话话,等效于指定回送接口的地址。 |
public |
Socket(InetAddress address,int port) 创建一个流套接字并将其连接到指定 IP 地址的指定端口号。 |
public |
Socket(String host,int port,InetAddress localAddr,int localPort) 创建一个套接字并将其连接到指定远程主机上的指定远程端口。socket 会通过调用 bind() 函数来绑定提供的本地地址及端口。 如果指定的主机为 null,则等效于指定与 InetAddress.getByName(null) 相同的地址。换句话话,等效于指定回送接口的地址。 |
public |
Socket(InetAddress address,int port,InetAddress localAddr,int localPort) 创建一个套接字并将其连接到指定远程地址上的指定远程端口。socket 会通过调用 bind() 函数来绑定提供的本地地址及端口。 |
public |
Socket(String host,int port,boolean stream) 已过时。 使用 DatagramSocket 取代 UDP 传输。 |
方法摘要 | |
void |
connect(SocketAddress endpoint) 将此套接字连接到服务器。 |
void |
connect(SocketAddress endpoint, int timeout) 将此套接字连接到服务器,并指定一个超时值(单位毫秒)。超时值零被解释为无限超时。在建立连接或者发生错误之前,连接一直处于阻塞状态。 |
void |
bind(SocketAddress bindpoint) 将套接字绑定到本地地址。 如果地址为 |
InetAddress |
getInetAddress() 返回套接字连接的地址。此套接字连接到的远程 IP 地址;如果套接字是未连接的,则返回 |
InetAddress |
getLocalAddress() 获取套接字绑定的本地地址。 将套接字绑定到的本地地址;如果尚未绑定套接字,则返回 |
int |
getPort() 返回此套接字连接到的远程端口。 此套接字连接到的远程端口号;如果尚未连接套接字,则返回 0。 |
int |
getLocalPort() 返回此套接字绑定到的本地端口。 此套接字绑定到的本地端口号;如果尚未绑定套接字,则返回 -1。 |
SocketAddress |
getRemoteSocketAddress() 返回此套接字连接的端点的地址,如果未连接则返回 |
SocketAddress |
getLocalSocketAddress() 返回此套接字绑定的端点的地址,如果尚未绑定则返回 |
SocketChannel |
getChannel() 返回与此数据报套接字关联的唯一 SocketChannel 对象(如果有)。 当且仅当通过 SocketChannel.open 或 ServerSocketChannel.accept 方法创建了通道本身时,套接字才具有一个通道。如果没有为通道创建套接字,则返回 null。 |
InputStream |
getInputStream() 返回此套接字的输入流。 如果此套接字具有关联的通道,则所得的输入流会将其所有操作委托给通道。如果通道为非阻塞模式,则输入流的 read 操作将抛出 IllegalBlockingModeException。 在非正常条件下,底层连接可能被远程主机或网络软件中断(例如,TCP 连接情况下的连接重置)。当网络软件检测到中断的连接时,将对返回的输入流应用以下操作:
关闭返回的 InputStream 将关闭关联套接字。 |
OutputStream |
getOutputStream() 返回此套接字的输出流。 如果此套接字具有关联的通道,则得到的输出流会将其所有操作委托给通道。如果通道为非阻塞模式,则输出流的 write 操作将抛出 IllegalBlockingModeException。 关闭返回的 OutputStream 将关闭关联套接字。 |
void |
setTcpNoDelay(boolean on) 启用/禁用 TCP_NODELAY(启用/禁用 Nagle 算法)。 |
void |
setSoLinger(boolean on, int linger) 启用/禁用具有指定逗留时间(以秒为单位)的 SO_LINGER。最大超时值是特定于平台的。 该设置仅影响套接字关闭。 |
void |
sendUrgentData(int data) 在套接字上发送一个紧急数据字节。要发送的字节是数据参数的八个最低位。紧急字节在对套接字 OutputStream 的所有预先写入之后但在任何以后写入之前发送。 |
void |
setOOBInline(boolean on) 用/禁用 OOBINLINE(TCP 紧急数据的接收者) 默认情况下,此选项是禁用的,即在套接字上接收的 TCP 紧急数据被静默丢弃。如果用户希望接收到紧急数据,则必须启用此选项。启用时,可以将紧急数据内嵌在普通数据中接收 注意,仅为处理传入紧急数据提供有限支持。特别要指出的是,不提供传入紧急数据的任何通知并且不存在区分普通数据和紧急数据的功能(除非更高级别的协议提供)。 |
void |
setSoTimeout(int timeout) 启用/禁用带有指定超时值的 SO_TIMEOUT,以毫秒为单位。将此选项设为非零的超时值时,在与此 Socket 关联的 InputStream 上调用 read() 将只阻塞此时间长度。如果超过超时值,将引发 java.net.SocketTimeoutException,虽然 Socket 仍旧有效。选项必须在进入阻塞操作前被启用才能生效。超时值必须是 > 0 的数。超时值为 0 被解释为无穷大超时值。 |
void |
setSendBufferSize(int size) 将此 Socket 的 SO_SNDBUF 选项设置为指定的值。平台的网络连接代码将 SO_SNDBUF 选项用作设置底层网络 I/O 缓存的大小的提示。 |
void |
setReceiveBufferSize(int size) 将此 Socket 的 SO_RCVBUF 选项设置为指定的值。平台的网络连接代码将 SO_RCVBUF 选项用作设置底层网络 I/O 缓存的大小的提示。 由于 SO_RCVBUF 是一种提示,想要验证缓冲区设置大小的应用程序应该调用 getReceiveBufferSize()。 SO_RCVBUF 的值还用于设置公布到远程同位体的 TCP 接收窗口。一般情况下,当连接套接字时,可以在任意时间更改窗口大小。然而,如果需要的接收窗口大于 64K,则必须在将套接字连接到远程同位体之前请求。下面是需要知道的两种情况:
|
void |
setKeepAlive(boolean on) 启用/禁用 SO_KEEPALIVE。 |
void |
setTrafficClass(int tc) 为从此 Socket 上发送的包在 IP 头中设置流量类别 (traffic class) 或服务类型八位组 (type-of-service octet)。由于底层网络实现可能忽略此值,应用程序应该将其视为一种提示。 |
void |
setReuseAddress(boolean on) 启用/禁用 SO_REUSEADDR 套接字选项。 使用 bind(SocketAddress) 绑定套接字前启用 SO_REUSEADDR 允许在上一个连接处于超时状态时绑定套接字。 当创建 Socket 时,禁用 SO_REUSEADDR 的初始设置。 在绑定套接字(请参阅 isBound())后启用或禁用 SO_REUSEADDR 时的行为是不确定的。 |
void |
close() 关闭此套接字。 所有当前阻塞于此套接字上的 I/O 操作中的线程都将抛出 SocketException。 套接字被关闭后,便不可在以后的网络连接中使用(即无法重新连接或重新绑定)。需要创建新的套接字。 关闭此套接字也将会关闭该套接字的 InputStream 和 OutputStream。 如果此套接字有一个与之关联的通道,则关闭该通道。 |
void |
shutdownInput() 此套接字的输入流置于“流的末尾”。发送到套接字的输入流端的任何数据都将被确认然后被静默丢弃。 如果在套接字上调用 shutdownInput() 后从套接字输入流读取内容,则流将返回 EOF(文件结束符)。 |
void |
shutdownOutput() 禁用此套接字的输出流。对于 TCP 套接字,任何以前写入的数据都将被发送,并且后跟 TCP 的正常连接终止序列。 如果在套接字上调用 shutdownOutput() 后写入套接字输出流,则该流将抛出 IOException。 |
boolean |
isConnected() 返回套接字的连接状态。 |
boolean |
isBound() 返回套接字的绑定状态。 |
boolean |
isClosed() 返回套接字的关闭状态。 |
void |
setPerformancePreferences(int connectionTime,int latency,int bandwidth) 设置此套接字的性能偏好。 默认情况下套接字使用 TCP/IP 协议。有些实现可能提供与 TCP/IP 具有不同性能特征的替换协议。此方法允许应用程序在实现从可用协议中作出选择时表达它自己关于应该如何进行折衷的偏好。 性能偏好由三个整数描述,它们的值分别指示短连接时间、低延迟和高带宽的相对重要性。这些整数的绝对值没有意义;为了选择协议,需要简单比较它们的值,较大的值指示更强的偏好。负值表示的优先级低于正值。例如,如果应用程序相对于低延迟和高带宽更偏好短连接时间,则其可以使用值 (1, 0, 0) 调用此方法。如果应用程序相对于低延迟更偏好高带宽,而相对于短连接时间更偏好低延迟,则其可以使用值 (0, 1, 2) 调用此方法。 在连接套接字后调用此方法无效。 |
java.net.ServerSocket
此类实现服务器套接字。服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可能向请求者返回结果。
服务器套接字的实际工作由 SocketImpl 类的实例执行。应用程序可以更改创建套接字实现的套接字工厂来配置它自身,从而创建适合本地防火墙的套接字。
构造方法摘要 | |
public |
ServerSocket() throws IOException 创建非绑定服务器套接字。 |
public |
ServerSocket(int port) throws IOException 创建绑定到特定端口的服务器套接字。端口 0 在所有空闲端口上创建套接字。 传入连接指示(对连接的请求)的最大队列长度被设置为 50。如果队列满时收到连接指示,则拒绝该连接。 |
public |
ServerSocket(int port, int backlog) throws IOException 利用指定的 backlog 创建服务器套接字并将其绑定到指定的本地端口号。端口号 0 在所有空闲端口上创建套接字。 |
public |
ServerSocket(int port, int backlog, InetAddress bindAddr) throws IOException 使用指定的端口、侦听 backlog 和要绑定到的本地 IP 地址创建服务器。bindAddr 参数可以在 ServerSocket 的多宿主主机 (multi-homed host) 上使用,ServerSocket 仅接受对其地址之一的连接请求。如果 bindAddr 为 null,则默认接受任何/所有本地地址上的连接。端口必须在 0 到 65535 之间(包括两者)。 |
方法概要 | |
Socket |
accept() 侦听并接受到此套接字的连接。此方法在连接传入之前一直阻塞。 |
void |
bind(SocketAddress endpoint) 将 ServerSocket 绑定到特定地址(IP 地址和端口号)。 |
void |
bind(SocketAddress endpoint, int backlog) 将 ServerSocket 绑定到特定地址(IP 地址和端口号)。 backlog 参数必须是大于 0 的正值。如果传递的值等于或小于 0,则使用默认值。 |
void |
close() 关闭此套接字。 在 #accept() 中所有当前阻塞的线程都将会抛出 SocketException。 |
boolean |
isBound() 返回 ServerSocket 的绑定状态。 |
ServerSocketChannel |
getChannel() 返回与此套接字关联的唯一 java.nio.channels.ServerSocketChannel 对象(如果有)。 |
InetAddress |
getInetAddress() 返回此服务器套接字的本地地址。 |
int |
getLocalPort() 返回此套接字在其上侦听的端口 |
void |
setPerformancePreferences(int connectionTime, int latency, int bandwidth) 设置此 ServerSocket 的性能首选项。 默认情况下套接字使用 TCP/IP 协议。有些实现可能提供与 TCP/IP 具有不同性能特征的替代协议。此方法允许应用程序在实现从可用协议中作出选择时表明它自己关于应该如何进行折衷的首选项。 性能首选项由三个整数描述,它们的值分别指示短连接时间、低延迟和高带宽的相对重要性。这些整数的绝对值没有意义;为了选择协议,需要简单地比较它们的值,较大的值指示更强的首选项。例如,如果应用程序相对于低延迟和高带宽更希望短连接时间,则其可以使用值 (1, 0, 0) 调用此方法。如果应用程序相对于低延迟更希望高带宽,且相对于短连接时间更希望低延迟,则其可以使用值 (0, 1, 2) 调用此方法。 在绑定套接字后调用此方法无效。这意味着,需要利用无参数构造方法创建套接字才能使用此功能。 |
void |
setReceiveBufferSize(int size) 为从此 ServerSocket 接受的套接字的 SO_RCVBUF 选项设置默认建议值。在接受的套接字中实际设置的值必须在 #accept() 返回套接字后通过调用 Socket#getReceiveBufferSize() 确定。 随后可以通过调用 Socket#setReceiveBufferSize(int) 更改该值。但是,如果应用程序希望允许大于 RFC1323 中定义的 64K 字节的接收窗口,则在将 ServerSocket 绑定到本地地址之前必须在其中设置建议值。这意味着,必须用无参数构造方法创建 ServerSocket,然后必须调用 setReceiveBufferSize(),最后通过调用 bind() 将 ServerSocket 绑定到地址。 未能执行此操作不会导致错误,缓冲区大小可能被设置为所请求的值,但是从此 ServerSocket 中接受的套接字中的 TCP 接收窗口将不再大于 64K 字节。 |
void |
setReuseAddress(boolean on) 启用/禁用 SO_REUSEADDR 套接字选项。 在使用 #bind(SocketAddress) 绑定套接字前启用 SO_REUSEADDR 可允许上一个连接处于超时状态时绑定套接字。 当创建 ServerSocket 时,SO_REUSEADDR 的初始设置是不确定的。应用程序可以使用 #getReuseAddress() 来确定 SO_REUSEADDR 的初始设置。 在绑定套接字(请参阅 #isBound())后启用或禁用 SO_REUSEADDR 时的行为是不确定的。 |
void |
setSoTimeout(int timeout) 通过指定超时值启用/禁用 SO_TIMEOUT,以毫秒为单位。将此选项设为非零的超时值时,对此 ServerSocket 调用 accept() 将只阻塞此时间长度。如果超过超时值,将引发 java.net.SocketTimeoutException,虽然 ServerSocket 仍旧有效。选项必须在进入阻塞操作前被启用才能生效。超时值必须是 > 0 的数。超时值为 0 被解释为无穷大超时值。 |
java.net.InetAddress
InetAddress是Java对IP地址的封装,在java.net中有许多类都使用到了InetAddress,包括ServerSocket,Socket,DatagramSocket等等。
InetAddress的构造函数不是公开的(public),所以需要通过它提供的静态方法来获取,有以下的方法:
static InetAddress[] getAllByName(String host) static InetAddress getByAddress(byte[] addr) static InetAddress getByAddress(String host,byte[] addr) static InetAddress getByName(String host) static InetAddress getLocalHost()
// 使用getLocalHost方法为InetAddress创建对象; InetAddress add=InetAddress.getLocalHost();//获得本机的InetAddress对象 System.out.println(add.getHostAddress());//返回本机IP地址 System.out.println(add.getHostName());//输出计算机名 //根据域名得到InetAddress对象 add=InetAddress.getByName("www.baidu.com"); System.out.println(add.getHostAddress());//返回百度服务器的IP地址 System.out.println(add.getHostName());//输出www.baidu.com; //根据ip得到InetAddress对象; add=InetAddress.getByName("111.13.100.91"); System.out.println(add.getHostAddress()); System.out.println(add.getHostName());//如果ip地址存在,并且DNS给你解析就会输出 //www.baidu.com,不给你解析就会返回这个IP本身;
java.net.InetSocketAddress
InetSocketAddress类主要作用是封装端口,它是在在InetAddress基础上加端口,但它是有构造器的。具体的一些方法可以去帮助文档查看。
InetSocketAddress add=new InetSocketAddress("100.95.227.210",9999); System.out.println(add.getHostName()); System.out.println(add.getPort()); InetAddress addr=add.getAddress();//获得端口的ip; System.out.println(addr.getHostAddress());//返回ip; System.out.println(addr.getHostName());//输出端口名;
java.net.DatagramSocket
此类表示用于发送和接收数据报包的套接字。
数据报套接字是分组传送服务的发送或接收点。在数据报套接字上发送或接收的每个数据包都是单独寻址和路由的。从一台机器发送到另一台机器的多个分组可以被不同地路由,并且可以以任何顺序到达。
在可能的情况下,新构造DatagramSocket的 SO_BROADCAST插座选项已启用,以便允许广播数据报的传输。为了接收广播数据包,应将DatagramSocket绑定到通配符地址。在一些实现中,当DatagramSocket绑定到更具体的地址时,也可以接收广播分组。
示例: DatagramSocket s = new DatagramSocket(null); s.bind(new InetSocketAddress(8888)); 相当于: DatagramSocket s = new DatagramSocket(8888); 两种情况都将创建一个能够在UDP端口8888上接收广播的DatagramSocket。
构造方法摘要 | |
public |
DatagramSocket() 构造数据报套接字并将其绑定到本地主机上的任何可用端口。 |
public |
DatagramSocket(DatagramSocketImpl impl) 使用指定的DatagramSocketImpl创建未绑定的数据报套接字。 |
public |
DatagramSocket(int port) 构造数据报套接字并将其绑定到本地主机上的指定端口。 |
public |
DatagramSocket(int port, InetAddress laddr) 创建绑定到指定本地地址的数据报套接字。 |
public |
DatagramSocket(SocketAddress bindaddr) 创建绑定到指定本地套接字地址的数据报套接字。 |
方法摘要 | |
void |
bind(SocketAddress addr) 将此DatagramSocket绑定到特定的地址和端口。 |
void |
connect(InetAddress address, int port) 将套接字连接到此套接字的远程地址。 |
void |
connect(SocketAddress addr) 将此套接字连接到远程套接字地址(IP地址+端口号)。 |
void |
close() 关闭此数据报套接字。 |
void |
disconnect() 断开插座。 |
DatagramChannel |
getChannel() 返回DatagramChannel与此数据报套接字关联的唯一对象(如果有)。 |
boolean |
isBound() 返回套接字的绑定状态。 |
boolean |
isClosed() 返回套接字是否关闭。 |
boolean |
isConnected() 返回套接字的连接状态。 |
void |
receive(DatagramPacket p) 从此套接字接收数据报包。 |
void |
send(DatagramPacket p) 从此套接字发送数据报包。 |
void |
setBroadcast(boolean on) 启用/禁用SO_BROADCAST。 |
void |
setReceiveBufferSize(int size) 将SO_RCVBUF选项设置为此指定的值 DatagramSocket。 |
void |
setReuseAddress(boolean on) 启用/禁用SO_REUSEADDR套接字选项。 |
void |
setSendBufferSize(int size) 将SO_SNDBUF选项设置为此指定的值 DatagramSocket。 |
void |
setSoTimeout(int timeout) 使用指定的超时启用/禁用SO_TIMEOUT,以毫秒为单位。 |
void |
setTrafficClass(int tc) 在IP数据报头中为从此DatagramSocket发送的数据报设置流量类或服务类型八位字节。 |
java.net.DatagramPacket
DatagramPacket(byte[]buf, intlength)构造函数创建DatagramPacket对象,指定了数据包的内存空间和大小。
DatagramPacket(byte[]buf, intlength , InetAddressaddress , intport)构造函数不仅指定了数据包的内存空间和大小,而且指定了数据包的目标地址和端口。
在发送数据时,必须指定接收方的Socket地址和端口号,因此使用第2个构造函数可创建发送数据的DatagramPacket对象。