socket 包
介绍
用于进行网络通信,提供启动 Socket
服务器、连接 Socket
服务器、发送数据、接收数据等功能。
我们支持 UDP/TCP/UDS 三种 Socket
类型,用户可按需选用。
如下为本库提供 Socket
的类继承关系:
Hierarchy
Resource
├StreamingSocket
│ ├TcpSocket
│ └UnixSocket
│
├DatagramSocket
│ ├UdpSocket
│ └UnixDatagramSocket
│
└ServerSocket
├TcpServerSocket
└UnixServerSocket
主要接口
IPV4_BROADCAST
public let IPV4_BROADCAST: Array<UInt8>
功能:IPV4 广播地址。
IPV4_ALL_SYSTEM
public let IPV4_ALL_SYSTEM: Array<UInt8>
功能:IPV4 多播地址,用于向同一局域网中的所有主机发送多播数据包。
IPV4_ALL_ROUTER
public let IPV4_ALL_ROUTER: Array<UInt8>
功能:IPV4 预留的组播地址,用于向所有本地网络上的所有路由器发送路由信息。
IPV4_ZERO
public let IPV4_ZERO: Array<UInt8>
功能:IPV4 通用地址。
IPV4_LOCAL_HOST
public let IPV4_LOCAL_HOST: Array<UInt8>
功能:IPV4 本地地址。
IPV6_ZERO
public let IPV6_ZERO: Array<UInt8>
功能:IPV6 通用地址。
IPV6_LOOPBACK
public let IPV6_LOOPBACK: Array<UInt8>
功能:IPV6 环回地址(本地地址)。
IPV6_INTERFACE_LOCAL_ALL_NODES
public let IPV6_INTERFACE_LOCAL_ALL_NODES: Array<UInt8>
功能:IPv6 在节点本地范围的所有节点多播地址。
IPV6_LINK_LOCAL_ALL_NODES
public let IPV6_LINK_LOCAL_ALL_NODES: Array<UInt8>
功能:IPv6 在链路本地范围的所有节点多播地址。
IPV6_LINK_LOCAL_ALL_ROUTERS
public let IPV6_LINK_LOCAL_ALL_ROUTERS: Array<UInt8>
功能:IPv6 链路本地范围的所有路由器多播地址。
interface StreamingSocket
public interface StreamingSocket <: IOStream & Resource & ToString {
prop localAddress: SocketAddress
prop remoteAddress: SocketAddress
mut prop readTimeout: ?Duration
mut prop writeTimeout: ?Duration
}
双工流模式下的运行的 Socket
,可被读写。
StreamingSocket
可以被绑定 (bind
) 和连接 (connect
), 用户可以通过属性设置绑定和连接的远端和本地地址。
StreamingSocket 可以有序分包传输字节流。我们会使用一段缓存空间存储读写的字节流。读取接口 (read()
) 默认在无数据到来时阻塞式等待,直到下一次数据到达,或超时。写操作 (write()
) 会写入缓存中的数据并在后续被发出,如果缓存不足,或者写入速度快于转发速度,写操作将会阻塞等待缓存空闲,或超时。
读写字符始终保持有序, 但不保证传输过程中的分包策略及大小与发包时一致。例如:一端发送 10 字节报文后,又发送了 15 字节报文,对端可能分别收到 10 字节 和 15 字节报文,也可能一次性收到 25 字节的一个报文。
当收到一段异常报文时,将返回报文长度为 -1 。
prop localAddress
prop localAddress: SocketAddress
功能:Socket
将要或已经被绑定的本地地址
异常:
SocketException
:当Socket
已经被关闭或无可用的本地地址(本地地址未配置并且套接字未连接)时抛出异常
prop remoteAddress
prop remoteAddress: SocketAddress
功能:Socket
将要或已经连接的远端地址。
异常:
SocketException
:当Socket
已经被关闭时抛出异常
prop readTimeout
mut prop readTimeout: ?Duration
功能:设置和读取读超时时间。
返回值:超时时间或 None
,如果设置的时间过小将会设置为最小时钟周期值;过大时将设置为最大超时时间((263-1) 纳秒);默认值为 None
异常:
IllegalArgumentException
:当超时时间小于 0 时,抛出异常
prop writeTimeout
mut prop writeTimeout: ?Duration
功能:设置和读取写超时时间。
返回值:超时时间或 None
,如果设置的时间过小将会设置为最小时钟周期值;过大时将设置为最大超时时间((263-1) 纳秒);默认值为 None
异常:
IllegalArgumentException
:当超时时间小于 0 时,抛出异常
interface DatagramSocket
public interface DatagramSocket <: Resource & ToString {
prop localAddress: SocketAddress
prop remoteAddress: ?SocketAddress
mut prop receiveTimeout: ?Duration
mut prop sendTimeout: ?Duration
func receiveFrom(buffer: Array<Byte>): (SocketAddress, Int64)
func sendTo(address: SocketAddress, payload: Array<Byte>): Unit
}
DatagramSocket
是一种接受和读取数据包的套接字,一个数据包通常有有限的大小,可能为空。不同的数据包套接字类型有不同的数据包最大值。例如 UDP
套接字一次可以处理最大 64KB 的数据包。
数据包传输不是一种可靠的传输,不保证传输顺序。数据包大小在发送端决定,例如:一端发送了 10 字节和 15 字节的报文,对端将收到相同大小的对应报文,10 字节和 15 字节。
prop localAddress
prop localAddress: SocketAddress
功能:Socket
将要或已经被绑定的本地地址。
异常:
SocketException
:当Socket
已经被关闭或无可用的本地地址(本地地址未配置并且套接字未连接)时抛出异常
prop remoteAddress
prop remoteAddress: ?SocketAddress
功能:Socket
已经连接的远端地址,当 Socket
未连接时返回 None。
异常:
SocketException
:当Socket
已经被关闭时抛出异常
prop receiveTimeout
mut prop receiveTimeout: ?Duration
功能:设置和读取 receiveFrom
超时时间, 无超时时间设置为 None
。
返回值:超时时间或 None
,如果设置的时间过小将会设置为最小时钟周期值;过大时将设置为最大超时时间(263-1 纳秒);默认值为 None
异常:
IllegalArgumentException
:当超时时间小于 0 时,抛出异常
prop sendTimeout
mut prop sendTimeout: ?Duration
功能:设置和读取 sendTo
超时时间, 默认设置为 None
。
返回值:超时时间或 None
,如果设置的时间过小将会设置为最小时钟周期值;过大时将设置为最大超时时间((263-1) 纳秒);默认值为 None
异常:
IllegalArgumentException
:当超时时间小于 0 时,抛出异常
func receiveFrom
func receiveFrom(buffer: Array<Byte>): (SocketAddress, Int64)
功能:阻塞式等待收取报文到 buffer
中。
参数:
buffer
:存储报文内容的缓存空间,buffer
应当有一个合适的大小,否则可能导致收取报文时报文被截断,并且返回的报文大小值大于buffer
的大小
返回值:报文发送地址和收取到的报文大小(可能为 0,或大于参数 buffer
大小)。
异常:
SocketException
:本机缓存过小无法读取报文时,抛出异常SocketTimeoutException
:读取超时时抛出异常
func sendTo
func sendTo(address: SocketAddress, payload: Array<Byte>): Unit
功能:发送报文到指定的远端地址,当对端无足够缓存时此操作可能被阻塞,报文可能被丢弃。
参数:
address
:需要发送的远端地址payload
:需要发送的报文内容
interface ServerSocket
public interface ServerSocket <: Resource & ToString {
prop localAddress: SocketAddress
func bind(): Unit
func accept(timeout!: ?Duration): StreamingSocket
func accept(): StreamingSocket
}
prop localAddress
prop localAddress: SocketAddress
功能:Socket
将要或已经被绑定的本地地址。
异常:
SocketException
:当Socket
已经被关闭时抛出异常
func bind
func bind(): Unit
功能:绑定套接字,当没有设置 reuse
属性,本地端口、地址、文件路径已被占用时,或还有上次绑定套接字的连接将绑定失败失败后需要 close
套接字,不支持多次重试此操作后可执行 accept()
操作。
异常:
SocketException
:当因系统原因绑定失败时抛出异常
func accept
func accept(timeout!: ?Duration): StreamingSocket
功能:接受一个客户端套接字的连接请求,阻塞式等待连接请求。
参数:
timeout
:等待连接超时的时间
返回值:连接成功的客户端套接字
异常:
SocketTimeoutException
:等待连接请求超时IllegalArgumentException
:当超时时间小于 0 时,抛出异常
func accept
func accept(): StreamingSocket
功能:接受一个客户端套接字的连接请求,阻塞式等待连接请求。
返回值:连接成功的客户端套接字
class TcpSocket
public class TcpSocket <: StreamingSocket & Equatable<TcpSocket> & Hashable {
public init(address: String, port: UInt16)
public init(address: SocketAddress)
public init(address: SocketAddress, localAddress!: ?SocketAddress)
}
TCP
套接字,当实例对象被创建后,可使用 connect
函数创建连接,并在结束时显式执行 close
操作。
该类型继承自 StreamingSocket
, 可参阅 StreamingSocket
章节获取更多信息。
init
public init(address: String, port: UInt16)
功能:创建一个未连接的套接字。
参数:
address
:即将要连接的地址,当前仅支持 IPv4 地址port
:即将要连接的端口。
异常:
SocketException
:当address
参数不合法时抛出异常,规格同SocketAddress
实例创建时的要求SocketException
:Windows 平台下地址为全零地址时将抛出异常
init
public init(address: SocketAddress)
功能:创建一个未连接的套接字。
参数:
address
:即将要连接的地址,当前仅支持 IPv4 地址
异常:
SocketException
:当address
参数不合法时抛出异常,规格同SocketAddress
实例创建时的要求SocketException
:Windows 平台下地址为全零地址时将抛出异常
init
public init(address: SocketAddress, localAddress!: ?SocketAddress)
功能:创建一个未连接的套接字,并且绑定到指定本地地址,本地地址为 None
时,将随机选定地址去绑定。此接口当 localAddress
不为 None
时,将默认设置 SO_REUSEADDR
为 true
,否则可能导致 "address already in use" 的错误。如果需要变更此配置,可以通过调用 setSocketOptionBool(SocketOptions.SOL_SOCKET, SocketOptions.SO_REUSEADDR, false)
。另外,本地地址和远端地址需要均为 IPv4。
参数:
address
:即将要连接的地址localAddress
:绑定的本地地址
异常:
SocketException
:当address
参数不合法时抛出异常,规格同SocketAddress
实例创建时的要求SocketException
:Windows 平台下地址为全零地址时将抛出异常
prop remoteAddress
public override prop remoteAddress: SocketAddress
功能:Socket
已经或将要连接的远端地址。
异常:
SocketException
:当Socket
已经被关闭时抛出异常
prop localAddress
public override prop localAddress: SocketAddress
功能:Socket
将要或已经被绑定的本地地址。
异常:
SocketException
:当Socket
已经被关闭或无可用的本地地址(本地地址未配置并且套接字未连接)时抛出异常
prop bindToDevice
public mut prop bindToDevice: ?String
功能:设置和读取绑定网卡。
prop readTimeout
public override mut prop readTimeout: ?Duration
功能:设置和读取读操作超时时间。
返回值:超时时间或 None
,如果设置的时间过小将会设置为最小时钟周期值;过大时将设置为最大超时时间((263-1) 纳秒);默认值为 None
异常:
IllegalArgumentException
:当超时时间小于 0 时,抛出异常
prop writeTimeout
public override mut prop writeTimeout: ?Duration
功能:设置和读取写操作超时时间。
返回值:超时时间或 None
,如果设置的时间过小将会设置为最小时钟周期值;过大时将设置为最大超时时间((263-1) 纳秒);默认值为 None
异常:
IllegalArgumentException
:当超时时间小于 0 时,抛出异常
prop keepAlive
public mut prop keepAlive: ?SocketKeepAliveConfig
功能:设置和读取保活属性,None
表示关闭保活。用户未设置时将使用系统默认配置。设置此配置可能会被延迟或被系统忽略,取决于系统的处理能力。
prop noDelay
public mut prop noDelay: Bool
功能:设置和读取 TCP_NODELAY
属性,默认为 true
。这个选项将禁用 Nagel 算法,所有写入字节被无延迟得转发。当属性设置为 false
时,Nagel 算法将在发包前引入延时时间
prop quickAcknowledge
public mut prop quickAcknowledge: Bool
功能:设置和读取 TCP_QUICKACK
属性,默认为 false
。这个选项类似于 noDelay
,但仅影响 TCP ACK 和第一次响应。不支持 Windows 和 macOS 系统。
prop linger
public mut prop linger: ?Duration
功能:设置和读取 SO_LINGER
属性,默认值取决于系统,None
表示禁用此选项 。
- 如果
SO_LINGER
被设置为Some(v)
,当套接字关闭时,如果还有等待的字节流,我们将在关闭连接前等待v
时间,如果超过时间,字节流还未被发送,连接将会被异常终止(通过 RST 报文关闭)。 - 如果
SO_LINGER
被设置为None
,当套接字关闭时,连接将被立即关闭,如果当前等待发送的字符,使用 FIN-ACK 关闭连接, 当还有剩余待发送的字符时,使用 RST 关闭连接。
异常:
IllegalArgumentException
:当超时时间小于 0 时,抛出异常
prop sendBufferSize
public mut prop sendBufferSize: Int64
功能:设置和读取 SO_SNDBUF
属性,提供一种方式指定发包缓存大小。选项的生效情况取决于系统。
异常:
IllegalArgumentException
:当size
小于等于 0 时,抛出异常SocketException
:当Socket
已关闭时,抛出异常
prop receiveBufferSize
public mut prop receiveBufferSize: Int64
功能:设置和读取 SO_RCVBUF
属性,提供一种方式指定收包缓存大小。选项的生效情况取决于系统。
异常:
IllegalArgumentException
:当size
小于等于 0 时,抛出异常SocketException
:当Socket
已关闭时,抛出异常
func read
public override func read(buffer: Array<Byte>): Int64
功能:读取报文。超时情况按 readTimeout
决定, 详见 readTimeout
。
参数:
buffer
:读取的数据存储变量
返回值:读取的数据长度
异常:
SocketException
:当buffer
大小为 0 时抛出异常,当因系统原因读取失败时,抛出异常
注:由于系统底层接口差异,如果连接被对端关闭,read
和 write
接口的行为也有相应的差异
- Windows 系统上,对端关闭连接后,如果本端调用一次
write
,会导致清空缓冲区内容,在此基础上再调用read
会抛出连接关闭异常 - Linux\macOS 系统上,对端关闭连接后,先调用
write
再调用read
函数仍会读出缓冲区中的内容
func write
public override func write(payload: Array<Byte>): Unit
功能:读取写入。超时情况按 writeTimeout
决定, 详见 writeTimeout
。
参数:
payload
:写入的数据存储变量
异常:
SocketException
:当buffer
大小为 0 时抛出异常,当因系统原因写入失败时,抛出异常
func connect
public func connect(timeout!: ?Duration = None): Unit
功能:连接远端套接字, 会自动绑定本地地址,因此不需要进行额外的绑定操作。
参数:
timeout
:连接超时时间,None
表示无超时时间,并且连接操作无重试,当服务端拒绝连接时,将返回连接失败。并且此操作包含了绑定操作,因此无需重复调用bind
接口
异常:
IllegalArgumentException
:当远端地址不合法时抛出异常IllegalArgumentException
:当连接超时时间小于 0 时,抛出异常SocketException
:当连接因系统原因(例如:套接字已关闭,没有访问权限,系统错误等)无法建立时抛出异常。再次调用可能成功SocketTimeoutException
:当连接超时时抛出异常IllegalArgumentException
:当超时时间小于 0 时,抛出异常
func getSocketOption
public func getSocketOption(
level: Int32,
option: Int32,
value: CPointer<Unit>,
valueLength: CPointer<UIntNative>
): Unit
功能:读取指定的套接字参数。
参数:
level
:层级,例如SOL_SOCKET
option
:参数,例如SO_KEEPALIVE
value
:参数值valueLength
:参数值长度
异常:
SocketException
:当getsockopt
返回失败时抛出异常
func setSocketOption
public func setSocketOption(
level: Int32,
option: Int32,
value: CPointer<Unit>,
valueLength: UIntNative
): Unit
功能:设置指定的套接字参数。
参数:
level
:层级,例如SOL_SOCKET
option
:参数,例如SO_KEEPALIVE
value
:参数值valueLength
:参数值长度
异常:
SocketException
:当setsockopt
返回失败时抛出异常
func getSocketOptionIntNative
public func getSocketOptionIntNative(
level: Int32,
option: Int32
): IntNative
功能:读取指定的套接字参数。
参数:
level
:层级,例如SOL_SOCKET
option
:参数,例如SO_KEEPALIVE
返回值:参数值
异常:
SocketException
:当getsockopt
返回失败时或参数大小超过IntNative
的阈值时抛出异常
func setSocketOptionIntNative
public func setSocketOptionIntNative(
level: Int32,
option: Int32,
value: IntNative
): Unit
功能:设置指定的套接字参数。
参数:
level
:层级,例如SOL_SOCKET
option
:参数,例如SO_KEEPALIVE
value
:参数值
异常:
SocketException
:当setsockopt
返回失败时抛出异常。
func getSocketOptionBool
public func getSocketOptionBool(
level: Int32,
option: Int32
): Bool
功能:读取指定的套接字参数。从 IntNative
强转而来。0 => false
,非 0 => true
。
参数:
level
:层级,例如SOL_SOCKET
option
:参数,例如SO_KEEPALIVE
返回值:读取到的参数值
异常:
SocketException
:当getsockopt
返回失败时或参数大小超过IntNative
的阈值时抛出异常。
func setSocketOptionBool
public func setSocketOptionBool(
level: Int32,
option: Int32,
value: Bool
): Unit
功能:设置指定的套接字参数。
参数:
level
:层级,例如SOL_SOCKET
option
:参数,例如SO_KEEPALIVE
value
:参数值
异常:
SocketException
:当setsockopt
返回失败时抛出异常
func close
public func close(): Unit
功能:关闭套接字,所有操作除了 close/isClosed
之外,均不允许再调用。接口允许多次调用。
func isClosed
public func isClosed(): Bool
功能:判断套接字是否通过调用 close
显式关闭。
返回值:返回套接字是否已经调用 close
显式关闭。是则返回 true
;否则返回 false
operator func ==
public override operator func ==(other: TcpSocket): Bool
功能:判断两个 TcpSocket
实例是否相等。
参数:
other
:参与比较的TcpSocket
实例。
返回值:如果相等,则返回 true
;否则,返回 false
operator func !=
public override operator func !=(other: TcpSocket): Bool
功能:判断两个 TcpSocket
实例是否不等。
参数:
other
:参与比较的TcpSocket
实例。
返回值:如果不等,则返回 true
;否则,返回 false
func hashCode
public override func hashCode(): Int64
功能:获取当前 TcpSocket
实例的哈希值。
返回值:返回当前 TcpSocket
实例的哈希值
func toString
public override func toString(): String
功能:返回当前 TcpSocket
的状态信息。
返回值:包含当前 TcpSocket
状态信息的字符串。
class TcpServerSocket
public class TcpServerSocket <: ServerSocket {
public init(bindAt!: UInt16)
public init(bindAt!: SocketAddress)
}
TcpServerSocket
将监听 TCP 连接。套接字被创建后,可通过属性和 setSocketOptionXX
接口配置属性。
启动监听需要调用 bind()
将套接字绑定到本地端口。accept()
接口将接受 TCP 连接,阻塞等待连接,若队列中已有连接,则可立即返回。
套接字需要通过 close 显式关闭。
当前仅支持 IPv4 协议。
init
public init(bindAt!: UInt16)
功能:创建一个 TcpServerSocket
对象,尚未绑定,因此客户端无法连接。
参数:
bindAt
:指定本地绑定端口,0 表示随机绑定空闲的本地端口
init
public init(bindAt!: SocketAddress)
功能:创建一个 TcpServerSocket
对象,尚未绑定,因此客户端无法连接。
参数:
bindAt
:指定本地绑定地址,0 表示随机绑定空闲的本地地址
prop localAddress
public override prop localAddress: SocketAddress
功能:Socket
将要或已经被绑定的本地地址。
异常:
SocketException
:当Socket
已经被关闭时抛出异常
prop reuseAddress
public mut prop reuseAddress: Bool
功能:设置和读取 SO_REUSEADDR
属性,默认设置为 true
。
属性生效后的行为取决于系统,使用前,请参阅不同系统针对此属性 SO_REUSEADDR/SOCK_REUSEADDR
的说明文档。
prop reusePort
public mut prop reusePort: Bool
功能:设置和读取 SO_REUSEPORT
属性。仅可在绑定前被修改。Windows 上可使用 SO_REUSEADDR
,无该属性,抛出异常。
属性默认及配置生效后的行为取决于系统,使用前,请参阅不同系统针对此属性 SO_REUSEPORT
的说明文档。
同时开启 SO_REUSEADDR/SO_REUSEPORT
会导致不可预知的系统错误,用户需谨慎配置次值。
异常:
SocketException
: Windows 上不支持此类型,抛出异常
prop sendBufferSize
public mut prop sendBufferSize: Int64
功能:设置和读取 SO_SNDBUF
属性。
异常:
IllegalArgumentException
:当size
小于等于 0 时,抛出异常SocketException
:当Socket
已关闭时,抛出异常
prop receiveBufferSize
public mut prop receiveBufferSize: Int64
功能:设置和读取 SO_RCVBUF
属性。
异常:
IllegalArgumentException
:当size
小于等于 0 时,抛出异常SocketException
:当Socket
已关闭时,抛出异常
prop bindToDevice
public mut prop bindToDevice: ?String
功能:设置和读取绑定网卡。
prop backlogSize
public mut prop backlogSize: Int64
功能:设置和读取 backlog
大小。仅可在调用 bind
前调用,否则将抛出异常。
变量是否生效取决于系统行为,可能不可预知得被忽略。
异常:
SocketException
:当在bind
后调用,将抛出异常
func bind
public override func bind(): Unit
功能:绑定本地端口失败后需要 close
套接字,不支持多次重试。
异常:
SocketException
:当因系统原因绑定失败时抛出异常
func accept
public override func accept(timeout!: ?Duration): TcpSocket
功能:监听或接受客户端连接。
参数:
timeout
:超时时间
返回值:客户端套接字
异常:
SocketTimeoutException
:连接超时SocketException
:当因系统原因监听失败时抛出异常IllegalArgumentException
:当超时时间小于 0 时,抛出异常
func accept
public override func accept(): TcpSocket
功能:监听或接受客户端连接。阻塞等待。
返回值:客户端套接字
异常:
SocketException
:当因系统原因监听失败时抛出异常
func close
public override func close(): Unit
功能:关闭套接字。接口允许多次调用。
func isClosed
public override func isClosed(): Bool
功能:检查套接字是否关闭。
返回值:如果已经关闭,返回 true
,否则返回 false
。
func getSocketOption
public func getSocketOption(
level: Int32,
option: Int32,
value: CPointer<Unit>,
valueLength: CPointer<UIntNative>
): Unit
功能:获取指定的套接字参数。
参数:
level
:层级,例如SOL_SOCKET
option
:参数,例如SO_KEEPALIVE
value
:参数值valueLength
:参数值长度
异常:
SocketException
:当getsockopt
返回失败时抛出异常
func setSocketOption
public func setSocketOption(
level: Int32,
option: Int32,
value: CPointer<Unit>,
valueLength: UIntNative
): Unit
功能:设置指定的套接字参数。
参数:
level
:层级,例如SOL_SOCKET
option
:参数,例如SO_KEEPALIVE
value
:参数值valueLength
:参数值长度
异常:
SocketException
:当setsockopt
返回失败时抛出异常
func getSocketOptionIntNative
public func getSocketOptionIntNative(
level: Int32,
option: Int32
): IntNative
功能:获取指定的套接字参数。
参数:
level
:层级,例如SOL_SOCKET
option
:参数,例如SO_KEEPALIVE
返回值:获取的套接字参数值
异常:
SocketException
:当getsockopt
返回失败时或参数大小超过IntNative
的阈值时抛出异常。
func setSocketOptionIntNative
public func setSocketOptionIntNative(
level: Int32,
option: Int32,
value: IntNative
): Unit
功能:设置指定的套接字参数。
参数:
level
:层级,例如SOL_SOCKET
option
:参数,例如SO_KEEPALIVE
value
:参数值
异常:
SocketException
:当setsockopt
返回失败时抛出异常
func getSocketOptionBool
public func getSocketOptionBool(
level: Int32,
option: Int32
): Bool
功能:获取指定的套接字参数。从 IntNative
强转而来。0 => false
, 非 0 => true
。
参数:
level
:层级,例如SOL_SOCKET
option
:参数,例如SO_KEEPALIVE
返回值:返回指定的套接字参数。从 IntNative
强转而来。0 => false
, 非 0 => true
异常:
SocketException
:当getsockopt
返回失败时或参数大小超过IntNative
的阈值时抛出异常
func setSocketOptionBool
public func setSocketOptionBool(
level: Int32,
option: Int32,
value: Bool
): Unit
功能:设置指定的套接字参数。
参数:
level
:层级,例如SOL_SOCKET
option
:参数,例如SO_KEEPALIVE
value
:参数值
异常:
SocketException
:当setsockopt
返回失败时抛出异常。
func toString
public override func toString(): String
功能:返回当前 TcpServerSocket
的状态信息。
返回值:包含当前 TcpServerSocket
状态信息的字符串。
class UdpSocket
public class UdpSocket <: DatagramSocket {
public init(bindAt!: UInt16)
public init(bindAt!: SocketAddress)
}
UDPSocket
创建实例后,需要调用 bind()
绑定,可在不与远端建连的前提下接受报文。不过,UDPSocket
也可以通过 connect()/disconnect()
接口进行建连。
UDP 协议要求传输报文大小不可超过 64KB 。
UDPSocket
需要被显式 close()
。可以参阅 DatagramSocket
获取更多信息。
init
public init(bindAt!: UInt16)
功能:创建一个未绑定的 UDPSocket
。
参数:
bindAt
:绑定端口
init
public init(bindAt!: SocketAddress)
功能:创建一个未绑定的 UDPSocket
。
参数:
bindAt
:绑定地址及端口
prop remoteAddress
public override prop remoteAddress: ?SocketAddress
功能:Socket
已经连接的远端地址,当 Socket
未连接时返回 None
。
异常:
SocketException
:当Socket
已经被关闭时抛出异常
prop localAddress
public override prop localAddress: SocketAddress
功能:Socket
将要或已经被绑定的本地地址。
异常:
SocketException
:当Socket
已经被关闭或无可用的本地地址(本地地址未配置并且套接字未连接)时抛出异常
prop receiveTimeout
public override mut prop receiveTimeout: ?Duration
功能:设置和读取 receive/receiveFrom
操作超时时间。
返回值:超时时间或 None
,如果设置的时间过小将会设置为最小时钟周期值;过大时将设置为最大超时时间((263-1) 纳秒);默认值为 None
异常:
IllegalArgumentException
:当超时时间小于 0 时,抛出异常
prop sendTimeout
public override mut prop sendTimeout: ?Duration
功能:设置和读取 send/sendTo
操作超时时间。
返回值:超时时间或 None
,如果设置的时间过小将会设置为最小时钟周期值;过大时将设置为最大超时时间((263-1) 纳秒);默认值为 None
异常:
IllegalArgumentException
:当超时时间小于 0 时,抛出异常
func close
public override func close(): Unit
功能:关闭套接字,所有操作除了 close/isClosed
之外,均不允许再调用。接口允许多次调用。
func isClosed
public override func isClosed(): Bool
功能:判断套接字是否通过调用 close
显式关闭。
返回值:如果该套接字已调用 close
显示关闭,则返回 true
;否则,返回 false
。
func bind
public func bind()
功能:绑定本地端口失败后需要 close
套接字,不支持多次重试。
异常:
SocketException
:当因系统原因绑定失败时抛出异常
func connect
public func connect(remote: SocketAddress): Unit
功能:连接特定远端地址,可通过 disconnect
撤销配置。仅接受该远端地址的报文。必须在调用 bind
后执行。此操作执行后,端口将开始接收 ICMP 报文,若收到异常报文后,可能导致 send/sendTo
执行失败。
参数:
remote
:远端地址,需要与本地地址都在 IPv4 协议下
异常:
IllegalArgumentException
:当远端地址不合法时抛出异常SocketException
:当端口未绑定时抛出异常SocketException
:当连接因系统原因无法建立时抛出异常SocketException
:Windows 平台下远端地址为全零地址时, 将抛出异常
func disconnect
public func disconnect(): Unit
功能:停止连接。取消仅收取特定对端报文。可在 connect
前调用,可多次调用。
func receiveFrom
public override func receiveFrom(buffer: Array<Byte>): (SocketAddress, Int64)
功能:收取报文。
参数:
buffer
:存储收取到报文的缓存地址
返回值:收取到的报文的发送端地址,及实际收取到的报文大小,可能为 0 或者大于参数 buffer
的大小
异常:
SocketException
:本机缓存过小无法读取报文时,抛出异常SocketTimeoutException
:读取超时时抛出异常
func sendTo
public override func sendTo(recipient: SocketAddress, payload: Array<Byte>): Unit
功能:发送报文。当没有足够的缓存地址时可能会被阻塞。
参数:
recipient
:发送的对端地址payload
:发送报文内容
异常:
SocketException
:当payload
的大小超出系统限制SocketException
:系统发送失败,例如:当connect
被调用,并且收到异常 ICMP 报文时,发送将失败SocketException
:Windows 平台下远端地址为全零地址时, 将抛出异常SocketException
:macOS 平台下当connect
被调用后调用sendTo
, 将抛出异常
func send
public func send(payload: Array<Byte>): Unit
功能:发送报文到 connect
连接到的地址。
参数:
payload
:发送报文内容
异常:
SocketException
:当payload
的大小超出系统限制SocketException
:系统发送失败,例如:当connect
被调用,并且收到异常 ICMP 报文时,发送将失败
func receive
public func receive(buffer: Array<Byte>): Int64
功能:从 connect
连接到的地址收取报文。
参数:
payload
:存储收取到的报文的地址
返回值:收取到的报文大小
prop reusePort
public mut prop reusePort: Bool
功能:设置和读取 SO_REUSEPORT
属性。Windows 上可使用 SO_REUSEADDR
,但无 SO_REUSEPORT
属性,因此会抛出异常。
属性默认以及配置生效后的行为取决于系统,使用前,请参阅不同系统针对此属性 SO_REUSEPORT
的说明文档。
异常:
SocketException
:Windows 上不支持此类型,抛出异常
prop reuseAddress
public mut prop reuseAddress: Bool
功能:设置和读取 SO_REUSEADDR
属性
属性默认以及生效后的行为取决于系统,使用前,请参阅不同系统针对此属性 SO_REUSEADDR/SOCK_REUSEADDR
的说明文档。
prop sendBufferSize
public mut prop sendBufferSize: Int64
功能:设置和读取 SO_SNDBUF
属性。
异常:
IllegalArgumentException
:当size
小于等于 0 时,抛出异常SocketException
:当Socket
已关闭时,抛出异常
prop receiveBufferSize
public mut prop receiveBufferSize: Int64
功能:设置和读取 SO_RCVBUF
属性。
异常:
IllegalArgumentException
:当size
小于等于 0 时,抛出异常SocketException
:当Socket
已关闭时,抛出异常
func getSocketOption
public func getSocketOption(
level: Int32,
option: Int32,
value: CPointer<Unit>,
valueLength: CPointer<UIntNative>
): Unit
功能:获取指定的套接字参数。
参数:
level
:层级,例如SOL_SOCKET
option
:参数,例如SO_KEEPALIVE
value
:参数值valueLength
:参数值长度
异常:
SocketException
:当getsockopt
返回失败时抛出异常
func setSocketOption
public func setSocketOption(
level: Int32,
option: Int32,
value: CPointer<Unit>,
valueLength: UIntNative
): Unit
功能:设置指定的套接字参数。
参数:
level
:层级,例如SOL_SOCKET
option
:参数,例如SO_KEEPALIVE
value
:参数值valueLength
:参数值长度
异常:
SocketException
:当setsockopt
返回失败时抛出异常
func getSocketOptionIntNative
public func getSocketOptionIntNative(
level: Int32,
option: Int32
): IntNative
功能:获取指定的套接字参数。
参数:
level
:层级,例如SOL_SOCKET
option
:参数,例如SO_KEEPALIVE
返回值:指定的套接字参数值
异常:
SocketException
:当getsockopt
返回失败时或参数大小超过IntNative
的阈值时抛出异常
func setSocketOptionIntNative
public func setSocketOptionIntNative(
level: Int32,
option: Int32,
value: IntNative
): Unit
功能:设置指定的套接字参数。
参数:
level
:层级,例如SOL_SOCKET
option
:参数,例如SO_KEEPALIVE
value
:参数值
异常:
SocketException
:当setsockopt
返回失败时抛出异常
func getSocketOptionBool
public func getSocketOptionBool(
level: Int32,
option: Int32
): Bool
功能:获取指定的套接字参数。从 IntNative
强转而来。0 => false
, 非 0 => true
。
参数:
level
:层级,例如SOL_SOCKET
option
:参数,例如SO_KEEPALIVE
返回值:返回指定的套接字参数。从 IntNative
强转而来。0 => false
, 非 0 => true
异常:
SocketException
:当getsockopt
返回失败时或参数大小超过IntNative
的阈值时抛出异常
func setSocketOptionBool
public func setSocketOptionBool(
level: Int32,
option: Int32,
value: Bool
): Unit
功能:设置指定的套接字参数。
参数:
level
:层级,例如SOL_SOCKET
option
:参数,例如SO_KEEPALIVE
value
:参数值
异常:
SocketException
:当setsockopt
返回失败时抛出异常
func toString
public override func toString(): String
功能:返回当前 UdpSocket
的状态信息。
返回值:包含当前 UdpSocket
状态信息的字符串。
class UnixSocket
public class UnixSocket <: StreamingSocket {
public init(path: String)
public init(address: SocketAddress)
}
UnixSocket
实例创建后应调用 connect()
接口创建连接,并且在结束时显式调用 close()
回收资源。可参阅 StreamingSocket
获取更多信息。
注:该类型不支持在 Windows 平台上运行。
init
public init(path: String)
功能:创建一个未连接的 UnixSocket
实例此文件类型可通过 isSock()
判断是否存在,可通过 unlink()
接口删除。
参数:
path
:连接的文件地址
init
public init(address: SocketAddress)
功能:创建一个未连接的 UnixSocket
实例。
参数:
address
:连接的套接字地址
prop remoteAddress
public override prop remoteAddress: SocketAddress
功能:Socket
已经或将要连接的远端地址。
异常:
SocketException
:当Socket
已经被关闭时抛出异常
prop localAddress
public override prop localAddress: SocketAddress
功能:Socket
将要或已经被绑定的本地地址。
异常:
SocketException
:当Socket
已经被关闭或无可用的本地地址(本地地址未配置并且套接字未连接)时抛出异常
prop readTimeout
public override mut prop readTimeout: ?Duration
功能:设置和读取读操作超时时间。
返回值:超时时间或 None
。如果设置的时间过小将会设置为最小时钟周期值,过大时将设置为None
,默认值为 None
异常:
IllegalArgumentException
:当超时时间小于 0 时,抛出异常
prop writeTimeout
public override mut prop writeTimeout: ?Duration
功能:设置和读取写操作超时时间。
返回值:超时时间或 None
。如果设置的时间过小将会设置为最小时钟周期值;过大时将设置为最大超时时间((263-1) 纳秒);默认值为 None
异常:
IllegalArgumentException
:当超时时间小于 0 时,抛出异常
prop sendBufferSize
public mut prop sendBufferSize: Int64
功能:设置和读取 SO_SNDBUF
属性。
异常:
IllegalArgumentException
:当size
小于等于 0 时,抛出异常SocketException
:当Socket
已关闭时,抛出异常
prop receiveBufferSize
public mut prop receiveBufferSize: Int64
功能:设置和读取 SO_RCVBUF
属性。
异常:
IllegalArgumentException
:当size
小于等于 0 时,抛出异常SocketException
:当Socket
已关闭时,抛出异常
func read
public override func read(buffer: Array<Byte>): Int64
功能:读取报文。超时情况按 readTimeout
决定, 详见 readTimeout
。
参数:
buffer
:读取的数据存储变量
返回值:读取的数据长度
异常:
SocketException
:当buffer
大小为 0 时抛出异常,当因系统原因读取失败时,抛出异常
func write
public override func write(buffer: Array<Byte>): Unit
功能:读取写入。超时情况按 writeTimeout
决定,详见 writeTimeout
。
参数:
buffer
:写入的数据存储变量
异常:
SocketException
:当buffer
大小为 0 时抛出异常,当因系统原因写入失败时,抛出异常
func connect
public func connect(timeout!: ?Duration = None)
功能:建立远端连接,对端拒绝时连接失败,会自动绑定本地地址,因此不需要进行额外的绑定操作。
参数:
timeout
:超时时间,None
表示无超时时间。Unix 与 Tcp 不同,队列已满时,调用将理解返回错误,而非重试阻塞等待
异常:
IllegalArgumentException
:当远端地址不合法时抛出异常SocketException
:当连接因系统原因无法建立时抛出异常SocketTimeoutException
:当连接超时时抛出异常IllegalArgumentException
:当超时时间小于 0 时,抛出异常
func getSocketOption
public func getSocketOption(
level: Int32,
option: Int32,
value: CPointer<Unit>,
valueLength: CPointer<UIntNative>
): Unit
功能:获取指定的套接字参数。
参数:
level
:层级,例如SOL_SOCKET
option
:参数,例如SO_KEEPALIVE
value
:参数值valueLength
:参数值长度
异常:
SocketException
:当getsockopt
返回失败时抛出异常
func setSocketOption
public func setSocketOption(
level: Int32,
option: Int32,
value: CPointer<Unit>,
valueLength: UIntNative
): Unit
功能:设置指定的套接字参数。
参数:
level
:层级,例如SOL_SOCKET
option
:参数,例如SO_KEEPALIVE
value
:参数值valueLength
:参数值长度
异常:
SocketException
:当setsockopt
返回失败时抛出异常
func getSocketOptionIntNative
public func getSocketOptionIntNative(
level: Int32,
option: Int32
): IntNative
功能:获取指定的套接字参数。
参数:
level
:层级,例如SOL_SOCKET
option
:参数,例如SO_KEEPALIVE
返回值:返回指定的套接字参数值
异常:
SocketException
:当getsockopt
返回失败时或参数大小超过IntNative
的阈值时抛出异常
func setSocketOptionIntNative
public func setSocketOptionIntNative(
level: Int32,
option: Int32,
value: IntNative
): Unit
功能:设置指定的套接字参数。
参数:
level
:层级,例如SOL_SOCKET
option
:参数,例如SO_KEEPALIVE
value
:参数值
异常:
SocketException
:当setsockopt
返回失败时抛出异常
func getSocketOptionBool
public func getSocketOptionBool(
level: Int32,
option: Int32
): Bool
功能:获取指定的套接字参数。从 IntNative
强转而来。0 => false
,非 0 => true
。
参数:
level
:层级,例如SOL_SOCKET
option
:参数,例如SO_KEEPALIVE
返回值:返回指定的套接字参数值。从 IntNative
强转而来。0 => false
,非 0 => true
异常:
SocketException
:当getsockopt
返回失败时或参数大小超过IntNative
的阈值时抛出异常
func setSocketOptionBool
public func setSocketOptionBool(
level: Int32,
option: Int32,
value: Bool
): Unit
功能:设置指定的套接字参数。
参数:
level
:层级,例如SOL_SOCKET
option
:参数,例如SO_KEEPALIVE
value
:参数值
异常:
SocketException
:当setsockopt
返回失败时抛出异常
func close
public func close(): Unit
功能:关闭套接字,所有操作除了 close/isClosed
之外,均不允许再调用。接口允许多次调用。
func isClosed
public func isClosed(): Bool
功能:判断套接字是否通过调用 close
显式关闭。
返回值:返回套接字是否已经调用 close
显示关闭。是则返回 true
;否则,返回 false
func toString
public override func toString(): String
功能:返回当前 UnixSocket
的状态信息。
返回值:包含当前 UnixSocket
状态信息的字符串。
class UnixServerSocket
public class UnixServerSocket <: ServerSocket
UnixServerSocket
监听连接,创建后可以通过属性和 setSocketOptionXX
接口配置属性值。需要调用 bind()
接口绑定本地地址开始监听连接。可以通过 accept()
接口接受连接。
注:该类型不支持在 Windows 平台上运行。
prop localAddress
public override prop localAddress: SocketAddress
功能:Socket
将要或已经被绑定的本地地址。
异常:
SocketException
:当Socket
已经被关闭时抛出异常
init
public init(bindAt!: String)
功能:创建一个未连接的 UnixServerSocket
实例此文件类型可通过 isSock()
判断是否存在,可通过 unlink()
接口删除。
参数:
path
:连接的文件地址
init
public init(bindAt!: SocketAddress)
功能:创建一个未连接的 UnixServerSocket
实例。
参数:
address
:连接的套接字地址
prop sendBufferSize
public mut prop sendBufferSize: Int64
功能:设置和读取 SO_SNDBUF
属性。
异常:
IllegalArgumentException
:当size
小于等于 0 时,抛出异常SocketException
:当Socket
已关闭时,抛出异常
prop receiveBufferSize
public mut prop receiveBufferSize: Int64
功能:设置和读取 SO_RCVBUF
属性。
异常:
IllegalArgumentException
:当size
小于等于 0 时,抛出异常SocketException
:当Socket
已关闭时,抛出异常
prop backlogSize
public mut prop backlogSize: Int64
功能:设置和读取 backlog
大小。仅可在调用 bind
前调用,否则将抛出异常。
变量是否生效取决于系统行为,可能不可预知得被忽略。
异常:
SocketException
:当在bind
后调用,将抛出异常
func bind
public override func bind(): Unit
功能:绑定一个 Unix domain
套接字,并创建监听队列此接口自动在本地地址中创建一个套接字文件,如该文件已存在则会绑定失败此文件类型可通过 isSock()
接口判断是否存在,可通过 unlink()
接口删除失败后需要 close
套接字,不支持多次重试。
异常:
SocketException
:当因系统原因绑定失败时抛出异常
func accept
public override func accept(timeout!: ?Duration): UnixSocket
功能:等待接受一个客户端的连接,或从队列中读取连接。
参数:
timeout
:超时时间
返回值:连接的客户端套接字
异常:
SocketTimeoutException
:连接超时IllegalArgumentException
:当超时时间小于 0 时,抛出异常
func accept
public override func accept(): UnixSocket
功能:等待接受一个客户端的连接,或从队列中读取连接。
返回值:连接的客户端套接字
func close
public override func close(): Unit
功能:关闭套接字,该套接字的所有操作除了 close/isClosed
之外,均不允许再调用。此接口允许多次调用。
func isClosed
public override func isClosed(): Bool
功能:判断套接字是否通过调用 close
显式关闭。
func getSocketOption
public func getSocketOption(
level: Int32,
option: Int32,
value: CPointer<Unit>,
valueLength: CPointer<UIntNative>
): Unit
功能:获取指定的套接字参数。
参数:
level
:层级,例如SOL_SOCKET
option
:参数,例如SO_KEEPALIVE
value
:参数值valueLength
:参数值长度
异常:
SocketException
:当getsockopt
返回失败时抛出异常
func setSocketOption
public func setSocketOption(
level: Int32,
option: Int32,
value: CPointer<Unit>,
valueLength: UIntNative
): Unit
功能:设置指定的套接字参数。
参数:
level
:层级,例如SOL_SOCKET
option
:参数,例如SO_KEEPALIVE
value
:参数值valueLength
:参数值长度
异常:
SocketException
:当setsockopt
返回失败时抛出异常
func getSocketOptionIntNative
public func getSocketOptionIntNative(
level: Int32,
option: Int32
): IntNative
功能:获取指定的套接字参数。
参数:
level
:层级,例如SOL_SOCKET
option
:参数,例如SO_KEEPALIVE
返回值:返回指定的套接字参数值
异常:
SocketException
:当getsockopt
返回失败时或参数大小超过IntNative
的阈值时抛出异常
func setSocketOptionIntNative
public func setSocketOptionIntNative(
level: Int32,
option: Int32,
value: IntNative
): Unit
功能:设置指定的套接字参数。
参数:
level
:层级,例如SOL_SOCKET
option
:参数,例如SO_KEEPALIVE
value
:参数值
异常:
SocketException
:当setsockopt
返回失败时抛出异常
func getSocketOptionBool
public func getSocketOptionBool(
level: Int32,
option: Int32
): Bool
功能:获取指定的套接字参数。从 IntNative
强转而来。0 => false, 非 0 => true
。
参数:
level
:层级,例如SOL_SOCKET
option
:参数,例如SO_KEEPALIVE
返回值:返回指定的套接字参数。从 IntNative
强转而来。0 => false, 非 0 => true
异常:
SocketException
:当getsockopt
返回失败时或参数大小超过IntNative
的阈值时抛出异常
func setSocketOptionBool
public func setSocketOptionBool(
level: Int32,
option: Int32,
value: Bool
): Unit
功能:设置指定的套接字参数。
参数:
level
:层级,例如SOL_SOCKET
option
:参数,例如SO_KEEPALIVE
value
:参数值
异常:
SocketException
:当setsockopt
返回失败时抛出异常
func toString
public override func toString(): String
功能:返回当前 UnixServerSocket
的状态信息。
返回值:包含当前 UnixServerSocket
状态信息的字符串。
class UnixDatagramSocket
public class UnixDatagramSocket <: DatagramSocket {
public init(bindAt!: String)
public init(bindAt!: SocketAddress)
}
UnixDatagramSocket
实例创建后,应当显式调用 bind()
接口绑定。Unix
数据包套接字不需要连接,不需要与远端握手多次。不过用户也可以通过 connect/disconnect
接口与远端建连和断连。
不同于 UDP, UDS 没有数据包大小限制,限制来源于操作系统和接口实现。
套接字资源需要用 close
接口显式回收。可参阅 DatagramSocket
获取更多信息。
注:该类型不支持在 Windows 平台上运行。
init
public init(bindAt!: String)
功能:创建一个未连接的 UnixDatagramSocket
实例此文件类型可通过 isSock()
判断是否存在,可通过 unlink()
接口删除。
参数:
bindAt
:连接的文件地址。文件地址应当不存在,在bind
时会创建
异常:
SocketException
:当路径为空或已存在时,抛出异常
init
public init(bindAt!: SocketAddress)
功能:创建一个未连接的 UnixDatagramSocket
实例。
参数:
bindAt
:连接的套接字地址。地址应当不存在,在bind
时会创建
异常:
SocketException
:当路径为空或已存在时,抛出异常
prop remoteAddress
public override prop remoteAddress: ?SocketAddress
功能:Socket
已经连接的远端地址,当 Socket
未连接时返回 None
。
异常:
SocketException
:当Socket
已经被关闭时抛出异常
prop localAddress
public override prop localAddress: SocketAddress
功能:socket
将要或已经绑定的本地地址。
异常:
SocketException
:当socket
已经关闭将抛出异常
prop receiveTimeout
public override mut prop receiveTimeout: ?Duration
功能:设置和读取 receive/receiveFrom
操作超时时间。
返回值:超时时间或 None
,如果设置的时间过小将会设置为最小时钟周期值;过大时将设置为最大超时时间((263-1) 纳秒);默认值为 None
异常:
IllegalArgumentException
:当超时时间小于 0 时,抛出异常
prop sendTimeout
public override mut prop sendTimeout: ?Duration
功能:设置和读取 send/sendTo
操作超时时间。
返回值:超时时间或 None
,如果设置的时间过小将会设置为最小时钟周期值;过大时将设置为最大超时时间((263-1) 纳秒);默认值为 None
异常:
IllegalArgumentException
:当超时时间小于 0 时,抛出异常
func close
public override func close(): Unit
功能:关闭套接字,所有操作除了 close/isClosed
之外,均不允许再调用。接口允许多次调用。
func isClosed
public override func isClosed(): Bool
功能:判断套接字是否通过调用 close
显式关闭。
返回值:返回套接字是否已经通过调用 close
显式关闭。是则返回 true
;否则,返回 false
func bind
public func bind(): Unit
功能:绑定一个 Unix datagram
套接字,并创建监听队列。此接口自动在本地地址中创建一个套接字文件,如该文件已存在则会绑定失败此文件类型可通过 isSock()
判断是否存在,可通过 unlink()
接口删除失败后需要 close
套接字,不支持多次重试。
异常:
SocketException
:当文件地址已存在,或文件创建失败将抛出异常
func connect
public func connect(remotePath: String): Unit
功能:连接特定远端地址,可通过 disconnect
撤销配置。仅接受该远端地址的报文。必须在 bind
后调用。此操作执行后,端口将开始接收 ICMP 报文,若收到异常报文后,可能导致 send/sendTo
执行失败。
参数:
remotePath
:远端文件地址
异常:
SocketException
:当地址未绑定时,将抛出异常
func connect
public func connect(remote: SocketAddress): Unit
功能:连接特定远端地址,可通过 disconnect
撤销配置。仅接受该远端地址的报文。默认执行 bind
,因此不需额外调用 bind
。此操作执行后,端口将开始接收 ICMP 报文,若收到异常报文后,可能导致 send/sendTo
执行失败。
参数:
remote
:远端套接字地址
异常:
SocketException
:当地址未绑定时,将抛出异常
func disconnect
public func disconnect(): Unit
功能:停止连接。取消仅收取特定对端报文。可在 connect
前调用,可多次调用。
异常:
SocketException
:当未绑定时抛出异常
func receiveFrom
public override func receiveFrom(buffer: Array<Byte>): (SocketAddress, Int64)
功能:收取报文。
参数:
buffer
:存储收取到报文的地址
返回值:收取到的报文的发送端地址,及实际收取到的报文大小,可能为 0 或者大于参数 buffer
的大小
异常:
SocketException
:本机缓存过小无法读取报文时,抛出异常SocketTimeoutException
:读取超时时抛出异常
func sendTo
public override func sendTo(recipient: SocketAddress, payload: Array<Byte>): Unit
功能:发送报文。当没有足够的缓存地址时可能会被阻塞。
参数:
recipient
:发送的对端地址payload
:发送报文内容
异常:
SocketException
:当payload
的大小超出系统限制SocketException
:系统发送失败,例如:当connect
被调用,并且收到异常 ICMP 报文时,发送将失败SocketException
:macOS 平台下当connect
被调用后调用sendTo
, 将抛出异常
func send
public func send(payload: Array<Byte>): Unit
功能:发送报文到 connect
连接到的地址。
参数:
payload
:发送报文内容
异常:
SocketException
:当payload
的大小超出系统限制SocketException
:系统发送失败,例如:当connect
被调用,并且收到异常 ICMP 报文时,发送将失败
func receive
public func receive(buffer: Array<Byte>): Int64
功能:从 connect
连接到的地址收取报文。
参数:
buffer
:存储收取到的报文的地址
返回值:收取到的报文大小
prop sendBufferSize
public mut prop sendBufferSize: Int64
功能:设置和读取 SO_SNDBUF
属性,提供一种方式指定发包缓存大小。选项的生效情况取决于系统。
异常:
IllegalArgumentException
:当size
小于等于 0 时,抛出异常SocketException
:当Socket
已关闭时,抛出异常
prop receiveBufferSize
public mut prop receiveBufferSize: Int64
功能:设置和读取 SO_RCVBUF
属性,提供一种方式指定发包缓存大小。选项的生效情况取决于系统。
异常:
IllegalArgumentException
:当size
小于等于 0 时,抛出异常SocketException
:当Socket
已关闭时,抛出异常
func getSocketOption
public func getSocketOption(
level: Int32,
option: Int32,
value: CPointer<Unit>,
valueLength: CPointer<UIntNative>
): Unit
功能:获取指定的套接字参数。
参数:
level
:层级,例如SOL_SOCKET
option
:参数,例如SO_KEEPALIVE
value
:参数值valueLength
:参数值长度
异常:
SocketException
:当getsockopt
返回失败时抛出异常
func setSocketOption
public func setSocketOption(
level: Int32,
option: Int32,
value: CPointer<Unit>,
valueLength: UIntNative
): Unit
功能:设置指定的套接字参数。
参数:
level
:层级,例如SOL_SOCKET
option
:参数,例如SO_KEEPALIVE
value
:参数值valueLength
:参数值长度
异常:
SocketException
:当setsockopt
返回失败时抛出异常
func getSocketOptionIntNative
public func getSocketOptionIntNative(
level: Int32,
option: Int32
): IntNative
功能:获取指定的套接字参数。
参数:
level
:层级,例如SOL_SOCKET
option
:参数,例如SO_KEEPALIVE
返回值:返回指定的套接字参数值
异常:
SocketException
:当getsockopt
返回失败时或参数大小超过IntNative
的阈值时抛出异常
func setSocketOptionIntNative
public func setSocketOptionIntNative(
level: Int32,
option: Int32,
value: IntNative
): Unit
功能:设置指定的套接字参数。
参数:
level
:层级,例如SOL_SOCKET
option
:参数,例如SO_KEEPALIVE
value
:参数值
异常:
SocketException
:当setsockopt
返回失败时抛出异常
func getSocketOptionBool
public func getSocketOptionBool(
level: Int32,
option: Int32
): Bool
功能:获取指定的套接字参数。从 IntNative
强转而来。0 => false, 非 0 => true
。
参数:
level
:层级,例如SOL_SOCKET
option
:参数,例如SO_KEEPALIVE
返回值:返回指定的套接字参数值。从 IntNative
强转而来。0 => false, 非 0 => true
异常:
SocketException
:当getsockopt
返回失败时抛出异常
func setSocketOptionBool
public func setSocketOptionBool(
level: Int32,
option: Int32,
value: Bool
): Unit
功能:设置指定的套接字参数。
参数:
level
:层级,例如SOL_SOCKET
option
:参数,例如SO_KEEPALIVE
value
:参数值
异常:
SocketException
:当setsockopt
返回失败抛出异常
func toString
public override func toString(): String
功能:返回当前 UDS
的状态信息。
返回值:包含当前 UDS
状态信息的字符串。
enum SocketNet
public enum SocketNet <: ToString & Equatable<SocketNet> {
| TCP
| UDP
| UNIX
}
传输层协议类型。
TCP
TCP
功能:TCP。
UDP
UDP
功能:UDP。
UNIX
UNIX
功能:UNIX。
func toString
public func toString(): String
功能:将枚举值转换为字符串。
返回值:返回转换后字符串
operator func ==
public operator func ==(that: SocketNet): Bool
功能:判断两个 SocketNet
是否相等。
参数:
that
:传入SocketNet
返回值:如果相等,则返回 true
;否则,返回 false
operator func !=
public operator func !=(that: SocketNet): Bool
功能:判断两个 SocketNet
是否不相等。
参数:
that
:传入SocketNet
返回值:如果不相等,则返回 true
;否则,返回 false
enum SocketAddressKind
public enum SocketAddressKind <: ToString & Equatable<SocketAddressKind> {
| IPv4
| IPv6
| Unix
}
互联网通信协议种类。
IPv4
IPv4
功能:IPv4。
IPv6
IPv6
功能:IPv6。
Unix
Unix
功能:Unix。
func toString
public func toString(): String
功能:将枚举值转换为字符串。
返回值:返回转换后字符串
operator func ==
public operator func ==(that: SocketAddressKind): Bool
功能:判断两个 SocketAddressKind
是否相等。
参数:
that
:传入SocketAddressKind
返回值:如果相等,则返回 true
;否则,返回 false
operator func !=
public operator func !=(that: SocketAddressKind): Bool
功能:判断两个 SocketAddressKind
是否不相等。
参数:
that
:传入SocketAddressKind
返回值:如果不相等,则返回 true
;否则,返回 false
struct SocketKeepAliveConfig
public struct SocketKeepAliveConfig <: ToString & Equatable<SocketKeepAliveConfig> {
public let idle: Duration
public let interval: Duration
public let count: UInt32
public init(
idle!: Duration = Duration.second * 45,
interval!: Duration = Duration.second * 5,
count!: UInt32 = 5
)
public init(
idleSeconds: UInt32,
intervalSeconds: UInt32,
count: UInt32
)
}
TCP KeepAlive 属性配置
init
public init(
idle!: Duration = Duration.second * 45,
interval!: Duration = Duration.second * 5,
count!: UInt32 = 5
)
功能:初始化 SocketKeepAliveConfig
实例对象。
参数:
idle
:允许空闲的时长,默认 45 秒interval
:保活报文发送周期,默认 45 秒count
:查询连接是否失效的报文个数, 默认 5 个
异常:
IllegalArgumentException
:当配置为空闲状态或设置间隔小于 0 时抛出异常
idle
public let idle: Duration
功能:允许连接空闲的时长,空闲超长将关闭连接。
interval
public let interval: Duration
功能:保活报文发送周期。
count
public let count: UInt32
功能:查询连接是否失效的报文个数。
func toString
public override func toString(): String
功能:将 TCP KeepAlive 属性配置转换为字符串。
返回值:返回转换后字符串
operator func ==
public override operator func ==(other: SocketKeepAliveConfig): Bool
功能:判断两个 SocketKeepAliveConfig
实例是否相等。
参数:
other
:参与比较的SocketKeepAliveConfig
实例。
返回值:如果相等,则返回 true
;否则,返回 false
operator func !=
public override operator func !=(other: SocketKeepAliveConfig): Bool
功能:判断两个 SocketKeepAliveConfig
实例是否不等。
参数:
other
:参与比较的SocketKeepAliveConfig
实例。
返回值:如果不等,则返回 true
;否则,返回 false
class SocketAddress
public open class SocketAddress <: ToString & Hashable & Equatable<SocketAddress> {
public init(kind: SocketAddressKind, address: Array<UInt8>, port: UInt16)
public init(hostAddress: String, port: UInt16)
public init(unixPath!: String)
}
具有特定类型、地址和端口的套接字地址。
init
public init(kind: SocketAddressKind, address: Array<UInt8>, port: UInt16)
功能:初始化 SocketAddress
。
参数:
kind
:套接字地址类型address
:IP 地址port
:端口号
异常:
SocketException
:当地址长度不符合地址类型要求时抛出异常
init
public init(hostAddress: String, port: UInt16)
功能:初始化 SocketAddress
。
参数:
hostAddress
:IP 地址port
:端口号
异常:
SocketException
:当地址无法解析成 IP 格式,或不符合地址类型要求时抛出异常
init
public init(unixPath!: String)
功能:初始化 SocketAddress
。
参数:
unixPath
:连接的文件地址
异常:
SocketException
:当地址无法解析成 IP 格式,或不符合地址类型要求时抛出异常
prop address
public prop address: Array<UInt8>
功能:获取地址。
返回值:获取存储在数组中的地址
prop hostAddress
public prop hostAddress: String
功能:获取主机地址。
返回值:获取由字符串表示的主机地址
prop hostName
public prop hostName: Option<String>
功能:获取名称,不存在时返回 None
。
prop kind
public prop kind: SocketAddressKind
功能:获取地址类型。
返回值:返回地址类型
prop port
public prop port: UInt16
功能:获取端口。
返回值:返回端口
prop zone
public prop zone: Option<String>
功能:获取 IPv6 地址族。
返回值:如果 IPv6 地址族存在,返回 IPv6 地址族,否则返回 None
prop defaultMask
public prop defaultMask: Option<IPMask>
功能:获取默认掩码。
返回值:如果默认掩码存在,返回默认掩码,否则返回 None
func mask
public func mask(mask: IPMask): SocketAddressWithMask
功能:使用掩码处理地址。
参数:
mask
:掩码
返回值:被处理后的地址
异常:
SocketException
:当掩码长度不符合地址长度时,抛出异常IllegalArgumentException
:当缓存空间不符合 IPv4/IPv6 要求时
func toString
public open func toString(): String
功能:获取地址对象字符串,格式为:"127.0.0.1:2048", "[::]:2048","[212c:3742::ffff:5863:6f00]:2048" 等。
异常:
SocketException
:地址不合法时,抛出异常
func hashCode
public open func hashCode(): Int64
功能:获取 hashcode
值。
返回值:返回 hashcode
值
operator func ==
public operator func ==(that: SocketAddress): Bool
功能:判断两个 SocketAddress
是否相等。
参数:
that
:传入SocketAddress
返回值:如果相等,则返回 true
;否则,返回 false
operator func !=
public operator func != (that: SocketAddress): Bool
功能:判断两个 SocketAddress
是否不相等。
参数:
that
:传入SocketAddress
返回值:如果不相等,则返回 true
;否则,返回 false
func kapString
public func kapString(): String
功能:获取 IP 协议、地址和端口字符串。
返回值:返回 IP 协议、地址和端口字符串
异常:
SocketException
:地址的大小与 IPv4 或 IPv6 不匹配时,抛出异常
func setHostName
public func setHostName(name: String): Unit
功能:设置主机名。
func resolve
public static func resolve(domain: String, port: UInt16): ?SocketAddress
功能:解析域和端口,并构造 SocketAddress
的实例。
当传入 IP 地址时,不包含 DNS 能力。当传入域名地址时,通过 getaddrinfo
解析得到 IP 地址,其中优先解析 IPv4 地址,并仅返回获取到的首个 IP 地址。
参数:
domain
:域port
:端口
返回值:如果解析域和端口成功,返回 SocketAddress
实例,否则返回 None
class SocketAddressWithMask
public class SocketAddressWithMask <: SocketAddress {
public init(kind: SocketAddressKind, address: Array<UInt8>, port: UInt16, mask: IPMask)
public init(hostAddress: String, port: UInt16, mask: IPMask)
public init(socketAddr: SocketAddress, mask: IPMask)
}
带有掩码的 SocketAddress
。
init
public init(kind: SocketAddressKind, address: Array<UInt8>, port: UInt16, mask: IPMask)
功能:初始化 SocketAddressWithMask
。
参数:
kind
:SocketAddress
类型address
:符合kind
所指定类型的地址port
:端口mask
:掩码
异常:
SocketException
:当参数address
传入的地址不符合参数kind
地址类型的要求时,抛出异常
init
public init(hostAddress: String, port: UInt16, mask: IPMask)
功能:初始化 SocketAddressWithMask
。
参数:
hostAddress
:IP 地址字符串port
:端口mask
:掩码
异常:
SocketException
:当参数address
无法解析成合法的 IP 地址
init
public init(socketAddr: SocketAddress, mask: IPMask)
功能:初始化 SocketAddressWithMask
。
参数:
socketAddr
:地址mask
:掩码
异常:
SocketException
:当参数socketAddr
不合法
prop ipMask
public mut prop ipMask: IPMask
功能:设置/获取 IP 掩码。
返回值:返回 IP 掩码
func clone
public func clone(): SocketAddressWithMask
功能:使用绑定的掩码处理地址,复制一个地址。
返回值:复制生成的 SocketAddressWithMask
实例
异常:
SocketException
:当掩码长度不符合地址长度IllegalArgumentException
:当缓存长度不足
func toString
public override func toString(): String
功能:将 SocketAddressWithMask
转换为字符串。
返回值:返回转换后字符串
func hashCode
public override func hashCode(): Int64
功能:获取 SocketAddressWithMask
的 hashcode
值。
返回值:返回 SocketAddressWithMask
的 hashcode
值
class IPMask
public class IPMask <: ToString {
public init(buf: Array<UInt8>)
public init(ones: Int64, bits: Int64)
public init(a: UInt8, b: UInt8, c: UInt8, d: UInt8)
}
IP 掩码,操作 IP 地址和路由地址。
init
public init(buf: Array<UInt8>)
功能:初始化掩码值。
参数:
buf
:掩码值
异常:
IllegalArgumentException
:当buffer
值超出阈值,不符合 IPv4/IPv6 要求
init
public init(ones: Int64, bits: Int64)
功能:初始化掩码值。
参数:
ones
:高位 1 的个数bits
:bit
位总个数
异常:
IllegalArgumentException
:当bits
值超出阈值,不符合 IPv4/IPv6 要求
init
public init(a: UInt8, b: UInt8, c: UInt8, d: UInt8)
功能:初始化掩码值,参数值分别是 IPv4 的 4 个字节 a.b.c.d
。
参数:
a
:最高字节b
:次高字节c
:次低字节d
:最低字节
func size
public func size(): (Int64, Int64)
功能:获取高位 1 的个数,以及总 bit
位数。
返回值:高位 1 的个数,以及总 bit
位数,若掩码格式不符合高位均为 1 的格式,返回 (0, 0)
func toString
public func toString(): String
功能:将IP 掩码转换为字符串。
返回值:返回转换后字符串
struct SocketOptions
public struct SocketOptions {
public static const SOL_SOCKET: Int32 = SOL_SOCKET
public static const IPPROTO_TCP: Int32 = IPPROTO_TCP
public static const IPPROTO_UDP: Int32 = IPPROTO_UDP
public static const SO_KEEPALIVE: Int32 = SOCK_KEEPALIVE
public static const TCP_NODELAY: Int32 = SOCK_TCP_NODELAY
public static const TCP_QUICKACK: Int32 = SOCK_TCP_QUICKACK
public static const SO_LINGER: Int32 = SOCK_LINGER
public static const SO_SNDBUF: Int32 = SOCK_SNDBUF
public static const SO_RCVBUF: Int32 = SOCK_RCVBUF
public static const SO_REUSEADDR: Int32 = SOCK_REUSEADDR
public static const SO_REUSEPORT: Int32 = SOCK_REUSEPORT
public static const SO_BINDTODEVICE: Int32 = SOCK_BINDTODEVICE
}
struct SocketOptions
存储了设置套接字选项的一些参数常量方便后续调用。
SOL_SOCKET
public static const SOL_SOCKET: Int32 = SOL_SOCKET
常数,用于将套接字选项的 level
层级设为 SOL_SOCKET
。
IPPROTO_TCP
public static const IPPROTO_TCP: Int32 = IPPROTO_TCP
常数,用于将套接字选项的 level
层级设为 IPPROTO_TCP
。
IPPROTO_UDP
public static const IPPROTO_UDP: Int32 = IPPROTO_UDP
常数,用于将套接字选项的 level
层级设为 IPPROTO_UDP
。
SO_KEEPALIVE
public static const SO_KEEPALIVE: Int32 = SOCK_KEEPALIVE
常数,用于将套接字选项的 optname
设为 SO_KEEPALIVE
。
TCP_NODELAY
public static const TCP_NODELAY: Int32 = SOCK_TCP_NODELAY
常数,用于将套接字选项的 optname
设为 TCP_NODELAY
。
TCP_QUICKACK
public static const TCP_QUICKACK: Int32 = SOCK_TCP_QUICKACK
常数,用于将套接字选项的 optname
设为 TCP_QUICKACK
。
SO_LINGER
public static const SO_LINGER: Int32 = SOCK_LINGER
常数,用于将套接字选项的 optname
设为 SO_LINGER
。
SO_SNDBUF
public static const SO_SNDBUF: Int32 = SOCK_SNDBUF
常数,用于将套接字选项的 optname
设为 SO_SNDBUF
。
SO_RCVBUF
public static const SO_RCVBUF: Int32 = SOCK_RCVBUF
常数,用于将套接字选项的 optname
设为 SO_RCVBUF
。
SO_REUSEADDR
public static const SO_REUSEADDR: Int32 = SOCK_REUSEADDR
常数,用于将套接字选项的 optname
设为 SO_REUSEADDR
。
SO_REUSEPORT
public static const SO_REUSEPORT: Int32 = SOCK_REUSEPORT
常数,用于将套接字选项的 optname
设为 SO_REUSEPORT
。
SO_BINDTODEVICE
public static const SO_BINDTODEVICE: Int32 = SOCK_BINDTODEVICE
常数,用于将套接字选项的 optname
设为 SO_BINDTODEVICE
。
class RawSocket
public class RawSocket {
public init(domain: SocketDomain, `type`: SocketType, protocol: ProtocolType)
}
RawSocket
提供了套接字的基本功能,可以访问特定通信域(domain)、类型(type)和协议(protocol)组合的套接字。Socket 包已经提供了 TCP、 UDP 等常用网络协议的支持,因此,该类型适用于已经支持以外的网络编程需求。
注意:当前 RawSocket
已经验证的功能包括 TCP、UDP、UDS 以及 ICMP 协议套接字,其它类型使用上可能存在预期之外的问题。此外,由于接口的开放性,可以使用 connect
再 listen
的组合,部分场景可能存在预期外的问题,请开发者使用时遵循正常的调用逻辑,避免产生问题。
init
public init(domain: SocketDomain, `type`: SocketType, protocol: ProtocolType)
功能:创建特定通信域、类型、协议组合的套接字。
参数:
domain
:通信域type
:套接字类型protocol
:协议类型
异常:
SocketException
:通信域、类型、协议组合无法创建套接字
prop localAddr
public prop localAddr: RawAddress
功能:获取当前 RawSocket
实例的本地地址。
返回值:当前 RawSocket
实例的本地地址
异常:
SocketException
:当前RawSocket
实例已经关闭,或无法获取本地地址
prop remoteAddr
public prop remoteAddr: RawAddress
功能:获取当前 RawSocket
实例的对端地址。
返回值:当前 RawSocket
实例的对端地址
异常:
SocketException
:当前RawSocket
实例已经关闭,或无法获取对端地址
prop readTimeout
public mut prop readTimeout: ?Duration
功能:获取或设置当前 RawSocket
实例的读超时时间。
异常:
SocketException
:当前RawSocket
实例已经关闭IllegalArgumentException
:设置的读超时时间为负
prop writeTimeout
public mut prop writeTimeout: ?Duration
功能:获取或设置当前 RawSocket
实例的写超时时间。
异常:
SocketException
:当前RawSocket
实例已经关闭IllegalArgumentException
:设置的写超时时间为负
func bind
public func bind(addr: RawAddress): Unit
功能:将当前 RawSocket
实例与指定的套接字地址进行绑定。
参数:
addr
:套接字地址
异常:
SocketException
:当前RawSocket
实例已经关闭,或绑定失败
func listen
public func listen(backlog: Int32): Unit
功能:监听当前 RawSocket
实例绑定的地址。
参数:
backlog
:等待队列增长的最大长度
异常:
SocketException
:当前RawSocket
实例已经关闭,或监听失败
func accept
public func accept(timeout!: ?Duration = None): RawSocket
功能:接收当前 RawSocket
实例监听时挂起连接队列上的第一个连接请求,返回一个用于通信的 RawSocket
。
参数:
timeout
:等待连接请求的最大时间,默认值None
表示一直等待
异常:
SocketException
:当前RawSocket
实例已经关闭,或接收失败SocketTimeoutException
:等待超时
返回值:用于通信的新 RawSocket
实例
func connect
public func connect(addr: RawAddress, timeout!: ?Duration = None): Unit
功能:向目标地址发送连接请求。
参数:
addr
:发送连接请求的目标地址timeout
:等待连接接收的最大时间,默认值None
表示一直等待
异常:
SocketException
:当前RawSocket
实例已经关闭,或请求失败SocketTimeoutException
:等待超时
func close
public func close(): Unit
功能:关闭。
func sendTo
public func sendTo(addr: RawAddress, buffer: Array<Byte>, flags: Int32): Unit
功能:向目标地址发送数据。若 RawSocket
是 DATAGRAM
类型,发送的数据包大小不允许超过 65507 字节。
参数:
addr
:发送数据的目标地址buffer
:数据flags
:指定函数行为的标志
异常:
SocketException
:当前RawSocket
实例已经关闭,或发送数据失败SocketTimeoutException
:超过指定的写超时时间SocketException
:macOS 平台下当connect
被调用后调用sendTo
, 将抛出异常
func receiveFrom
public func receiveFrom(buffer: Array<Byte>, flags: Int32): (RawAddress, Int64)
功能:接收来自其它 RawSocket
实例的数据。
参数:
buffer
:存储接收数据的数组flags
:指定函数行为的标志
返回值:数据来源的地址和数据长度
异常:
SocketException
:当前RawSocket
实例已经关闭,或接收数据失败SocketTimeoutException
:超过指定的读超时时间
func send
public func send(buffer: Array<Byte>, flags: Int32): Unit
功能:向连接的对端发送数据。
参数:
buffer
:数据flags
:指定函数行为的标志
异常:
SocketException
:当前RawSocket
实例已经关闭,或发送数据失败SocketTimeoutException
:超过指定的写超时时间
func receive
public func receive(buffer: Array<Byte>, flags: Int32): Int64
功能:接收来自连接对端发送的数据。
参数:
buffer
:存储接收数据的数组flags
:指定函数行为的标志
返回值:数据长度
异常:
SocketException
:当前RawSocket
实例已经关闭,或发送数据失败SocketTimeoutException
:超过指定的读超时时间
func setSocketOption
public unsafe func setSocketOption(level: Int32, option: Int32, value: CPointer<Byte>, len: Int32): Unit
功能:设置套接字选项。
参数:
level
:套接字选项级别option
:套接字选项名value
:套接字选项值len
:套接字选项字节长度
异常:
SocketException
:当前RawSocket
实例已经关闭,或设置套接字选项失败
func getSocketOption
public unsafe func getSocketOption(level: Int32, option: Int32, value: CPointer<Byte>, len: CPointer<Int32>): Unit
功能:获取套接字选项的值。
参数:
level
:套接字选项级别option
:套接字选项名value
:存储套接字选项值的指针len
:套接字选项值的长度
异常:
SocketException
:当前RawSocket
实例已经关闭,或获取套接字选项失败
struct SocketDomain
public struct SocketDomain <: Equatable<SocketDomain> & ToString & Hashable {
public static let IPV4: SocketDomain
public static let IPV6: SocketDomain
public static let UNIX: SocketDomain
public static let NETLINK: SocketDomain
public static let PACKET: SocketDomain
public init(domain: Int32)
}
提供了常用的套接字通信域,以及通过指定 Int32 值来构建套接字通信域的功能。
IPV4
public static let IPV4: SocketDomain
功能:IPV4
通信域。
IPV6
public static let IPV6: SocketDomain
功能:IPV6
通信域。
UNIX
public static let UNIX: SocketDomain
功能:本机通信。
NETLINK
public static let NETLINK: SocketDomain
功能:内核和用户空间进程之间通信。
注意:该常量在 Windows 平台不提供。
PACKET
public static let PACKET: SocketDomain
功能:允许用户空间程序直接访问网络数据包。
注意:该常量在 Windows 平台不提供。
init
public init(domain: Int32)
功能:根据指定通信域值创建套接字通信域。
operator func ==
public operator func ==(r: SocketDomain): Bool
功能:比较两个 SocketDomain
实例是否相等。
返回值:当二者代表的 Int32 值相等时,返回 true;否则,返回 false。
operator func !=
public operator func !=(r: SocketDomain): Bool
功能:比较两个 SocketDomain
实例是否不等。
返回值:当二者代表的 Int32 值不等时,返回 true;否则,返回 false。
func toString
public func toString(): String
功能:返回当前 SocketDomain
实例的字符串表示。
返回值:当前 SocketDomain
实例的字符串表示
func hashCode
public func hashCode(): Int64
功能:返回当前 SocketDomain
实例的哈希值。
返回值:当前 SocketDomain
实例的哈希值
struct SocketType
public struct SocketType <: Equatable<SocketType> & ToString & Hashable {
public static let STREAM: SocketType
public static let DATAGRAM: SocketType
public static let RAW: SocketType
public static let SEQPACKET: SocketType
public init(`type`: Int32)
}
提供了常用的套接字类型,以及通过指定 Int32 值来构建套接字类型的功能。
STREAM
public static let STREAM: SocketType
功能:流式套接字类型。
DATAGRAM
public static let DATAGRAM: SocketType
功能:数据报套接字类型。
RAW
public static let RAW: SocketType
功能:原始套接字类型。
SEQPACKET
public static let SEQPACKET: SocketType
功能:有序数据包套接字类型。
init
public init(`type`: Int32)
功能:通过指定套接字类型值创建套接字类型。
operator func ==
public operator func ==(r: SocketType): Bool
功能:判断两个 SocketType
实例是否相等。
返回值:当二者代表的 Int32
值相等时,返回 true
;否则,返回 false
operator func !=
public operator func !=(r: SocketType): Bool
功能:判断两个 SocketType
实例是否不等。
返回值:当二者代表的 Int32
值不等时,返回 true
;否则,返回 false
func toString
public func toString(): String
功能:返回当前 SocketType
实例的字符串表示。
返回值:当前 SocketType
实例的字符串表示
func hashCode
public func hashCode(): Int64
功能:返回当前 SocketType
实例的哈希值。
返回值:当前 SocketType
实例的哈希值
struct ProtocolType
public struct ProtocolType <: Equatable<ProtocolType> & ToString & Hashable {
public static let Unspecified: ProtocolType
public static let IPV4: ProtocolType
public static let IPV6: ProtocolType
public static let ICMP: ProtocolType
public static let TCP: ProtocolType
public static let UDP: ProtocolType
public static let RAW: ProtocolType
public init(protocol: Int32)
}
提供了常用的套接字协议,以及通过指定 Int32
值来构建套接字协议的功能。
Unspecified
public static let Unspecified: ProtocolType
功能:不指定协议。
IPV4
public static let IPV4: ProtocolType
功能:指定协议类型为 IPV4
。
IPV6
public static let IPV6: ProtocolType
功能:指定协议类型为 IPV6
。
ICMP
public static let ICMP: ProtocolType
功能:指定协议类型为 ICMP
。
TCP
public static let TCP: ProtocolType
功能:指定协议类型为 TCP
。
UDP
public static let UDP: ProtocolType
功能:指定协议类型为 UDP
。
RAW
public static let RAW: ProtocolType
功能:指定协议类型为 RAW
。
init
public init(protocol: Int32)
功能:通过指定套接字协议值创建协议。
operator func ==
public operator func ==(r: ProtocolType): Bool
功能:判断两个 ProtocolType
实例是否相等。
返回值:当二者代表的 Int32
值相等时,返回 true
;否则,返回 false
operator func !=
public operator func !=(r: ProtocolType): Bool
功能:判断两个 ProtocolType
实例是否不等。
返回值:当二者代表的 Int32
值不等时,返回 true
;否则,返回 false
func toString
public func toString(): String
功能:返回当前 ProtocolType
实例的字符串表示。
返回值:当前 ProtocolType
实例的字符串表示
func hashCode
public func hashCode(): Int64
功能:返回当前 ProtocolType
实例的哈希值。
返回值:当前 ProtocolType
实例的哈希值
struct OptionLevel
public struct OptionLevel {
public static const IP: Int32
public static const TCP: Int32
public static const UDP: Int32
public static const ICMP: Int32
public static const RAW: Int32
public static const SOCKET: Int32
}
提供了常用的套接字选项级别。
IP
public static const IP: Int32
功能:控制 IP
协议行为的套接字选项级别。
TCP
public static const TCP: Int32
功能:控制 TCP
协议行为的套接字选项级别。
UDP
public static const UDP: Int32
功能:控制 UDP
协议行为的套接字选项级别。
ICMP
public static const ICMP: Int32
功能:控制 ICMP
协议行为的套接字选项级别。
RAW
public static const RAW: Int32
功能:控制 IP
协议行为的套接字选项级别。
SOCKET
public static const SOCKET: Int32
功能:控制基本套接字行为的套接字选项级别。
struct OptionName
public struct OptionName {
public static const IP_HDRINCL: Int32
public static const IP_TOS: Int32
public static const IP_TTL: Int32
public static const TCP_KEEPCNT: Int32
public static const TCP_KEEPIDLE: Int32
public static const TCP_KEEPINTVL: Int32
public static const TCP_NODELAY: Int32
public static const SO_DEBUG: Int32
public static const SO_ACCEPTCONN: Int32
public static const SO_REUSEADDR: Int32
public static const SO_KEEPALIVE: Int32
public static const SO_DONTROUTE: Int32
public static const SO_BROADCAST: Int32
public static const SO_LINGER: Int32
public static const SO_OOBINLINE: Int32
public static const SO_SNDBUF: Int32
public static const SO_RCVBUF: Int32
public static const SO_SNDTIMEO: Int32
public static const SO_RCVTIMEO: Int32
public static const SO_ERROR: Int32
}
提供了常用的套接字选项。
IP_HDRINCL
public static const IP_HDRINCL: Int32
功能:用于在发送数据包时指定 IP
头部是否由应用程序提供的套接字选项。
IP_TOS
public static const IP_TOS: Int32
功能:用于指定数据包服务类型和优先级的套接字选项。
IP_TTL
public static const IP_TTL: Int32
功能:用于限制IP数据包在网络中传输最大跳数的套接字选项。
TCP_KEEPCNT
public static const TCP_KEEPCNT: Int32
功能:用于控制 TCP 连接中发送保持存活探测报文次数的套接字选项。
TCP_KEEPIDLE
public static const TCP_KEEPIDLE: Int32
功能:用于设置在没有收到对端确认的情况下,TCP
保持连接最大次数的套接字选项。
TCP_KEEPINTVL
public static const TCP_KEEPINTVL: Int32
功能:用于设置 TCP
保持连接时发送探测报文时间间隔的套接字选项。
TCP_NODELAY
public static const TCP_NODELAY: Int32
功能:用于控制 TCP
协议延迟行为的套接字选项。
SO_DEBUG
public static const SO_DEBUG: Int32
功能:用于启用或禁用调试模式的套接字选项。
SO_ACCEPTCONN
public static const SO_ACCEPTCONN: Int32
功能:用于查询套接字是否处于监听状态的套接字选项。
SO_REUSEADDR
public static const SO_REUSEADDR: Int32
功能:用于在套接字关闭后立即释放其绑定端口,以便其他套接字可以立即绑定该端口的套接字选项。
SO_KEEPALIVE
public static const SO_KEEPALIVE: Int32
功能:用于检测 TCP
连接是否仍然处于活动状态的套接字选项。
SO_DONTROUTE
public static const SO_DONTROUTE: Int32
功能:用于在连接套接字时,不路由套接字数据包的套接字选项。
SO_BROADCAST
public static const SO_BROADCAST: Int32
功能:用于设置套接字是否允许发送广播消息的套接字选项。
SO_LINGER
public static const SO_LINGER: Int32
功能:用于设置套接字关闭时行为的套接字选项。
SO_OOBINLINE
public static const SO_OOBINLINE: Int32
功能:用于控制接收带外数据方式的套接字选项。
SO_SNDBUF
public static const SO_SNDBUF: Int32
功能:用于设置套接字发送缓冲区大小的套接字选项。
SO_RCVBUF
public static const SO_RCVBUF: Int32
功能:用于设置套接字接收缓冲区大小的套接字选项。
SO_SNDTIMEO
public static const SO_SNDTIMEO: Int32
功能:用于设置套接字发送数据超时时间的套接字选项。
SO_RCVTIMEO
public static const SO_RCVTIMEO: Int32
功能:用于设置套接字接收数据超时时间的套接字选项。
SO_ERROR
public static const SO_ERROR: Int32
功能:获取和清除套接字上错误状态的套接字选项。
struct RawAddress
public struct RawAddress {
public init(addr: Array<Byte>)
}
提供了 RawSocket
的通信地址创建和获取功能。
init
public init(addr: Array<Byte>)
功能:创建地址。
参数:
addr
:存储地址的字节数组
prop addr
public prop addr: Array<Byte>
功能:获取地址。
class SocketException
public class SocketException <: Exception {
public init()
public init(message: String)
}
在出现套接字异常时抛出的异常。
init
public init()
功能:创建 SocketException
实例
init
public init(message: String)
功能:创建 SocketException
实例
参数:
message
:异常提示信息
class SocketTimeoutException
public class SocketTimeoutException <: Exception {
public init()
public init(message: String)
}
在套接字操作超时时抛出的异常。
init
public init()
功能:创建 SocketTimeoutException
实例
init
public init(message: String)
功能:创建 SocketTimeoutException
实例
参数:
message
:异常提示信息
示例
TCP 的使用
简单的 TCP 服务端和客户端示例
from std import socket.*
from std import time.*
from std import sync.*
let SERVER_PORT: UInt16 = 33333
func runTcpServer() {
try (serverSocket = TcpServerSocket(bindAt: SERVER_PORT)) {
serverSocket.bind()
try (client = serverSocket.accept()) {
let buf = Array<Byte>(10, item: 0)
let count = client.read(buf)
// Server read 3 bytes: [1, 2, 3, 0, 0, 0, 0, 0, 0, 0]
println("Server read ${count} bytes: ${buf}")
}
}
}
main(): Int64 {
spawn {
runTcpServer()
}
sleep(Duration.millisecond * 500)
try (socket = TcpSocket("127.0.0.1", SERVER_PORT)) {
socket.connect()
socket.write(Array<Byte>([1, 2, 3]))
}
return 0
}
运行结果如下:
Server read 3 bytes: [1, 2, 3, 0, 0, 0, 0, 0, 0, 0]
UDP 的使用
from std import socket.*
from std import time.*
from std import sync.*
let SERVER_PORT: UInt16 = 33333
func runUpdServer() {
try (serverSocket = UdpSocket(bindAt: SERVER_PORT)) {
serverSocket.bind()
let buf = Array<Byte>(3, item: 0)
let (clientAddr, count) = serverSocket.receiveFrom(buf)
let sender = clientAddr.hostAddress
// Server receive 3 bytes: [1, 2, 3] from 127.0.0.1
println("Server receive ${count} bytes: ${buf} from ${sender}")
}
}
main(): Int64 {
spawn {
runUpdServer()
}
sleep(Duration.second)
try (udpSocket = UdpSocket(bindAt: 0)) { // random port
udpSocket.sendTimeout = Duration.second * 2
udpSocket.bind()
udpSocket.sendTo(
SocketAddress("127.0.0.1", SERVER_PORT),
Array<Byte>([1, 2, 3])
)
}
return 0
}
运行结果如下:
Server receive 3 bytes: [1, 2, 3] from 127.0.0.1
Unix 的使用
from std import socket.*
from std import time.*
from std import sync.*
let SOCKET_PATH = "/tmp/tmpsock"
func runUnixServer() {
try (serverSocket = UnixServerSocket(bindAt: SOCKET_PATH)) {
serverSocket.bind()
try (client = serverSocket.accept()) {
client.write(b"hello")
}
}
}
main(): Int64 {
spawn {
runUnixServer()
}
sleep(Duration.second)
try (socket = UnixSocket(SOCKET_PATH)) {
socket.connect()
let buf = Array<Byte>(10, item: 0)
socket.read(buf)
println(String.fromUtf8(buf)) // hello
}
return 0
}
运行结果如下:
hello
UnixDatagram 的使用
from std import socket.*
from std import time.*
from std import sync.*
from std import fs.*
from std import os.*
from std import random.*
func createTempFile(): String {
let tempDir: Path = tempDir().info.path
let index: String = Random().nextUInt64().toString()
return tempDir.join("tmp${index}").toString()
}
func runUnixDatagramServer(serverPath: String, clientPath: String) {
try (serverSocket = UnixDatagramSocket(bindAt: serverPath)) {
serverSocket.bind()
let buf = Array<Byte>(3, item: 0)
let (clientAddr, read) = serverSocket.receiveFrom(buf)
if (read == 3 && buf == Array<Byte>([1, 2, 3])) {
println("server received")
}
if (clientAddr.toString() == clientPath) {
println("client address correct")
}
}
}
main(): Int64 {
let clientPath = createTempFile()
let serverPath = createTempFile()
spawn {
runUnixDatagramServer(serverPath, clientPath)
}
sleep(Duration.second)
try (unixSocket = UnixDatagramSocket(bindAt: clientPath)) {
unixSocket.sendTimeout = Duration.second * 2
unixSocket.bind()
unixSocket.connect(serverPath)
unixSocket.send(Array<Byte>([1, 2, 3]))
sleep(Duration.second)
}
return 0
}
运行结果如下:
server received
client address correct
增加自定义属性
from std import socket.*
let TCP_KEEPCNT: Int32 = 6
extend TcpSocket {
public mut prop customNoDelay: Int64 {
get() {
Int64(getSocketOptionIntNative(SocketOptions.IPPROTO_TCP, SocketOptions.TCP_NODELAY))
}
set(value) {
setSocketOptionIntNative(SocketOptions.IPPROTO_TCP, SocketOptions.TCP_NODELAY, IntNative(value))
}
}
}
main() {
let socket = TcpSocket("127.0.0.1", 0)
socket.customNoDelay = 1
println(socket.customNoDelay)
}
运行结果如下:
1
属性配置
from std import socket.*
from std import time.*
from std import sync.*
main (){
try (tcpSocket = TcpSocket("127.0.0.1", 80)) {
tcpSocket.readTimeout = Duration.second
tcpSocket.noDelay = false
tcpSocket.linger = Duration.minute
tcpSocket.keepAlive = SocketKeepAliveConfig(
interval: Duration.second * 7,
count: 15
)
}
}