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); 将创建忽略任何其他代理配置的普通套接字。
Socket s = new Socket(new Proxy(Proxy.Type.SOCKS, new InetSocketAddress("socks.mydom.com", 1080))); 将创建通过指定的 SOCKS 代理服务器进行连接的套接字。

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 传输。
创建一个流套接字并将其连接到指定主机上的指定端口号。
如果指定的主机为 null,则等效于指定与 InetAddress.getByName(null) 相同的地址。换句话话,等效于指定回送接口的地址。
如果流参数为 true,则创建流套接字。如果流参数为 false,则创建数据报套接字。
如果使用 UDP 套接字,则不应用与 TCP/IP 相关的套接字选项。

 

方法摘要
void 

connect(SocketAddress endpoint)

将此套接字连接到服务器。 

void

connect(SocketAddress endpoint, int timeout)

将此套接字连接到服务器,并指定一个超时值(单位毫秒)。超时值零被解释为无限超时。在建立连接或者发生错误之前,连接一直处于阻塞状态。

void 

bind(SocketAddress bindpoint)

将套接字绑定到本地地址。

如果地址为 null,则系统将挑选一个临时端口和一个有效本地地址来绑定套接字。

InetAddress 

getInetAddress()

返回套接字连接的地址。此套接字连接到的远程 IP 地址;如果套接字是未连接的,则返回 null

InetAddress

getLocalAddress()

获取套接字绑定的本地地址。

将套接字绑定到的本地地址;如果尚未绑定套接字,则返回 InetAddress.anyLocalAddress()

int

getPort()

返回此套接字连接到的远程端口。

此套接字连接到的远程端口号;如果尚未连接套接字,则返回 0。

int

getLocalPort()

返回此套接字绑定到的本地端口。

此套接字绑定到的本地端口号;如果尚未绑定套接字,则返回 -1。

SocketAddress

getRemoteSocketAddress()

返回此套接字连接的端点的地址,如果未连接则返回 null

SocketAddress

getLocalSocketAddress()

返回此套接字绑定的端点的地址,如果尚未绑定则返回 null

SocketChannel

getChannel()

返回与此数据报套接字关联的唯一 SocketChannel 对象(如果有)。

当且仅当通过 SocketChannel.open 或 ServerSocketChannel.accept 方法创建了通道本身时,套接字才具有一个通道。如果没有为通道创建套接字,则返回 null

InputStream

getInputStream()

返回此套接字的输入流。

如果此套接字具有关联的通道,则所得的输入流会将其所有操作委托给通道。如果通道为非阻塞模式,则输入流的 read 操作将抛出 IllegalBlockingModeException。

在非正常条件下,底层连接可能被远程主机或网络软件中断(例如,TCP 连接情况下的连接重置)。当网络软件检测到中断的连接时,将对返回的输入流应用以下操作:

  • 网络软件可能丢弃经过套接字缓冲的字节。网络软件没有丢弃的字节可以使用 read 读取。
  • 如果没有任何字节在套接字上缓冲,或者 read 已经消耗了所有缓冲的字节,则对 read 的所有后续调用都将抛出 IOException。
  • 如果没有任何字节在套接字上缓冲,并且没有使用 close 关闭套接字,则 available 将返回 0。

关闭返回的 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 缓存的大小的提示。
由于 SO_SNDBUF 是一种提示,想要验证缓冲区设置大小的应用程序应该调用 getSendBufferSize()。

 void

setReceiveBufferSize(int size)

将此 Socket 的 SO_RCVBUF 选项设置为指定的值。平台的网络连接代码将 SO_RCVBUF 选项用作设置底层网络 I/O 缓存的大小的提示。
增大接收缓存大小可以增大大量连接的网络 I/O 的性能,而减小它有助于减少传入数据的 backlog。

由于 SO_RCVBUF 是一种提示,想要验证缓冲区设置大小的应用程序应该调用 getReceiveBufferSize()。

SO_RCVBUF 的值还用于设置公布到远程同位体的 TCP 接收窗口。一般情况下,当连接套接字时,可以在任意时间更改窗口大小。然而,如果需要的接收窗口大于 64K,则必须在将套接字连接到远程同位体之前请求。下面是需要知道的两种情况:

  • 对于从 ServerSocket 接受的套接字,必须在将 ServerSocket 绑定到本地地址前通过调用 ServerSocket.setReceiveBufferSize(int) 执行此操作。
  • 对于客户端套接字,则必须在将套接字连接到其远程同位体前调用 setReceiveBufferSize()。
void 

setKeepAlive(boolean on)

启用/禁用 SO_KEEPALIVE。 

void 

setTrafficClass(int tc)

为从此 Socket 上发送的包在 IP 头中设置流量类别 (traffic class) 或服务类型八位组 (type-of-service octet)。由于底层网络实现可能忽略此值,应用程序应该将其视为一种提示。
tc 的值必须在 0 <= tc <= 255 范围内,否则将抛出 IllegalArgumentException。

 void

setReuseAddress(boolean on)

启用/禁用 SO_REUSEADDR 套接字选项。
关闭 TCP 连接时,该连接可能在关闭后的一段时间内保持超时状态(通常称为 TIME_WAIT 状态或 2MSL 等待状态)。对于使用已知套接字地址或端口的应用程序而言,如果存在处于超时状态的连接(包括地址和端口),可能不能将套接字绑定到所需的 SocketAddress 上。

使用 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。如果队列满时收到连接指示,则拒绝该连接。
如果应用程序已指定服务器套接字工厂,则调用该工厂的 createSocketImpl 方法来创建实际套接字实现。否则创建“普通”套接字。

public 

ServerSocket(int port, int backlog) throws IOException

利用指定的 backlog 创建服务器套接字并将其绑定到指定的本地端口号。端口号 0 在所有空闲端口上创建套接字。
传入连接指示(对连接的请求)的最大队列长度被设置为 backlog 参数。如果队列满时收到连接指示,则拒绝该连接。
backlog 参数必须是大于 0 的正值。如果传递的值等于或小于 0,则使用默认值。

public 

ServerSocket(int port, int backlog, InetAddress bindAddr) throws IOException

使用指定的端口、侦听 backlog 和要绑定到的本地 IP 地址创建服务器。bindAddr 参数可以在 ServerSocket 的多宿主主机 (multi-homed host) 上使用,ServerSocket 仅接受对其地址之一的连接请求。如果 bindAddr 为 null,则默认接受任何/所有本地地址上的连接。端口必须在 0 到 65535 之间(包括两者)。
backlog 参数必须是大于 0 的正值。如果传递的值等于或小于 0,则使用默认值。

 

方法概要
Socket

accept()

侦听并接受到此套接字的连接。此方法在连接传入之前一直阻塞。

void

bind(SocketAddress endpoint)

将 ServerSocket 绑定到特定地址(IP 地址和端口号)。
如果地址为 null,则系统将挑选一个临时端口和一个有效本地地址来绑定套接字。

void 

bind(SocketAddress endpoint, int backlog)

将 ServerSocket 绑定到特定地址(IP 地址和端口号)。
如果地址为 null,则系统将挑选一个临时端口和一个有效本地地址来绑定套接字。

backlog 参数必须是大于 0 的正值。如果传递的值等于或小于 0,则使用默认值。

void 

close() 

关闭此套接字。 在 #accept() 中所有当前阻塞的线程都将会抛出 SocketException。
如果此套接字有一个与之关联的通道,则关闭该通道。 

boolean 

isBound()

返回 ServerSocket 的绑定状态。 

ServerSocketChannel

getChannel()

返回与此套接字关联的唯一 java.nio.channels.ServerSocketChannel 对象(如果有)。
当且仅当通过 ServerSocketChannel.open 方法创建了通道本身时,服务器套接字才具有一个通道。

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() 确定。
SO_RCVBUF 的值用于设置内部套接字接收缓冲区的大小和设置公布到远程同位体的 TCP 接收窗口的大小。

随后可以通过调用 Socket#setReceiveBufferSize(int) 更改该值。但是,如果应用程序希望允许大于 RFC1323 中定义的 64K 字节的接收窗口,则在将 ServerSocket 绑定到本地地址之前必须在其中设置建议值。这意味着,必须用无参数构造方法创建 ServerSocket,然后必须调用 setReceiveBufferSize(),最后通过调用 bind() 将 ServerSocket 绑定到地址。

未能执行此操作不会导致错误,缓冲区大小可能被设置为所请求的值,但是从此 ServerSocket 中接受的套接字中的 TCP 接收窗口将不再大于 64K 字节。

void 

setReuseAddress(boolean on) 

启用/禁用 SO_REUSEADDR 套接字选项。
关闭 TCP 连接时,该连接可能在关闭后的一段时间内保持超时状态(通常称为 TIME_WAIT 状态或 2MSL 等待状态)。对于使用已知套接字地址或端口的应用程序而言,如果存在处于超时状态的连接(包括地址和端口),可能不能将套接字绑定到所需的 SocketAddress。

在使用 #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对象。

 

posted @ 2020-10-10 11:22  codedot  阅读(480)  评论(0编辑  收藏  举报