IBM-Swift/BlueSocket 一个为Swift而生的Socket框架

版权声明:本文为博主原创文章,但是可以随意转载。 https://blog.csdn.net/zhang5690800/article/details/79286678

本文大体介绍了BlueSocket,大多数内容都有提及。(翻译水平和理解水平有限,如有不对的地方请留言)
若想详细了解BlueSocket请到文章尾部点击链接查看原文。


Socket framework for Swift using the Swift Package Manager. Works on iOS, macOS, and Linux.
使用Swift包管理器的Swift Socket框架。适用于iOS,MacOS和Linux。
Generic low level socket framework. Pure Swift.
泛型低级套接字框架。纯Swift。

使用条件

Swift

  • 支持Swift 3、Swift 4
  • xCode 9.0或更高版本

macOS

  • macOS 10.11.6 (El Capitan)或更高版本
  • xCode 8.3.2或更高版本
  • xCode 9.0或更高版本

iOS

  • iOS 10.0或更高版本
  • xCode 8.3.2或更高版本
  • xCode 9.0或更高版本

添加到项目的方法

CocoaPods

    platform :ios, '10.0'

    target 'MyApp' do
        use_frameworks!
        pod 'BlueSocket'
    end

Carthage

github "IBM-Swift/BlueSocket" ~> <majorVersion>.<minor>

Swift Package Manager

    dependencies: [
        .Package(url: "https://github.com/IBM-Swift/BlueSocket.git", majorVersion: <majorVersion>, minor: <minor>)
    ]

使用前不要忘了添上这句

import Socket

Family, Type and Protocol Support

BlueSocket supports the following families, types and protocols:

Families:
    IPV4: Socket.ProtocolFamily.inet
    IPV6: Socket.ProtocolFamily.inet6
    UNIX: Socket.ProtocolFamily.unix
Types:
    Stream: Socket.SocketType.stream
    Datagram: Socket.SocketType.datagram
Protocols:
    TCP: Socket.SocketProtocol.tcp
    UDP: Socket.SocketProtocol.udp
    UNIX: Socket.SocketProtocol.unix

方法介绍

创建Socket

BlueSocket 提供了4种不同的构造方法用于创建一个Socket实例。

  1. create() —— 创建了一个全部为默认配置的Socket实例。(family为 .inet、type为 .stream、protocol为 .tcp)
  2. create(family family: ProtocolFamily, type: SocketType, proto: SocketProtocol) —— 创建一个自定义的Socket实例。
  3. create(connectedUsing signature: Signature) - This API will allow you create a Socket instance and have it attempt to connect to a server based on the information you pass in the Socket.Signature.
  4. create(fromNativeHandle nativeHandle: Int32, address: Address?) - This API lets you wrap a native file descriptor describing an existing socket in a new instance of Socket.

设置缓冲区大小

缓冲区默认大小为 Socket.SOCKET_DEFAULT_READ_BUFFER_SIZE (4096)
缓冲区最小值为 Socket.SOCKET_MINIMUM_READ_BUFFER_SIZE (1024)

下面展示了如何设置缓冲区大小,这里省略了异常处理。

let mySocket = try Socket.create()
mySocket.readBufferSize = 32768

缓冲区的设置应在使用Socket实例前完成。

关闭Socket

close() - This function will perform the necessary tasks in order to cleanly close an open socket.

关闭Socket只需要调用此函数即可,调用此函数会执行一些必要的操作,以便彻底的关闭Socket,但是没有提及必要的操作是什么。

监听Socket(TCP/UNIX)

使用以下方法来监听Socket上的连接。

  1. listen(on port: Int, maxBacklogSize: Int = Socket.SOCKET_DEFAULT_MAX_BACKLOG, allowPortReuse: Bool = true) —— 第一个参数 port,指监听哪一个端口。第二个参数 maxBackLogSize (BackLog:积压),指设置等待连接的队列的大小,默认值 Socket.SOCKET_DEFAULT_MAX_BACKLOG (50),在用作服务器时此值可能还需要加大。第三个参数 allowPortReuse ,指的是是否允许复用端口,默认为true,允许重复使用监听端口,若设置为false,当尝试监听一个正在使用中的端口时会报错。
  2. listen(on path: String, maxBacklogSize: Int = Socket.SOCKET_DEFAULT_MAX_BACKLOG) —— 此函数只能用在UNIX上,参数意义同上,少了第三个参数。

下面例子创建了一个默认配置的Socket,且监听了1337端口。这里省略了异常处理。

var socket = try Socket.create()
try socket.listen(on: 1337)

接受连接请求(TCP/UNIX)

当侦听的Socket检测到有连接请求时,决策权在你的程序这里。你可以选择接受连接请求,或者选择忽略连接请求继续监听,如果你的程序是多线程的你也可以一边接受连接请求,一边继续监听。BlueSocket提供两种不同的方法来接受进来的连接请求。(1、2是第一种,3是第二种)

  1. acceptClientConnection(invokeDelegate: Bool = true) —— 接受连接请求并且返回一个新的Socket实例。正在监听的实例不受影响。If invokeDelegate is false and the Socket has an SSLService delegate attached, you MUST call the invokeDelegateOnAccept method using the Socket instance that is returned by this function.
  2. invokeDelegateOnAccept(for newSocket: Socket) - If the Socket instance has a SSLService delegate, this will invoke the delegates accept function to perform SSL negotiation. It should be called with the Socket instance returned by acceptClientConnection. This function will throw an exception if called with the wrong Socket instance, called multiple times, or if the Socket instance does NOT have a SSLService delegate.
  3. acceptConnection() —— 这个方法接受进来的连接请求,替代并关闭现有的Socket监听。当前Socket相关的属性被新连接的Socket的属性取代。

与服务器建立Socket连接(TCP/UNIX)

除了上面提到的构造方法 create(connectedUsing:) 之外,BlueSocket 还提供了3个实例方法用于连接一个Socket实例到服务器。

  1. connect(to host: String, port: Int32, timeout: UInt = 0) —— 此方法根据你提供的 hostname 与 port 来连接到服务器。当提供的端口不在1-65535范围内时会报错。你可以选择设置连接超时时间timeout,单位毫秒。当Socket处于阻塞模式时,且设置的timeout大于0时,Socket则暂时会变成非阻塞模式。返回的Socket将被设置回原来的设置(阻塞或非阻塞)。
  2. connect(to path: String) —— 此方法只能用于UNIX下。根据提供的path连接服务器。
  3. connect(using signature: Signature) —— 此方法允许指定连接信息,连接信息包含在提供的Socket.Signature实例中。有关更多信息,请参阅Socket.swift中的Socket.Signature。

从Socket读取数据(TCP/UNIX)

BlueSocket 提供了4种从Socket读取数据的方法,按推荐顺序从上到下:

  1. read(into data: inout Data) —— 从Socket中读取所有可用的数据,返回Data对象。
  2. read(into data: NSMutableData) —— 从Socket中读取所有可用的数据,返回NSMutableData对象。
  3. readString() —— 从Socket中读取所有可用的数据并将其作为字符串返回,如果没有数据可读则返回nil。
  4. read(into buffer: UnsafeMutablePointer, bufSize: Int, truncate: Bool = false) —— 这个函数允许你通过提供一个不安全的指针将数据读入指定大小的缓冲区,该缓冲区的大小由bufSize参数来设置。如果提供的缓冲区太小则会抛出异常 Socket.SOCKET_ERR_RECV_BUFFER_TOO_SMALL,除非第三个参数truncate = ture,这种情况下Socket只读取bufSize字节的数据,未读取到的数据将在下次调用时被读取。如果truncate = false,你需要重新调用此函数并给出正确的bufSize。有关更多信息,请参阅Error.bufferSizeNeeded in Socket.swift。

注意:
除readString()之外的所有读取方法都可以返回零(0)。同时这可能表示远程连接已关闭,或者可能表示Socket被阻塞了。(假设你已经关闭阻塞)为了区分关闭还是阻塞,可以检查属性remoteConnectionClosed,如果返回true,说明Socket远程连接已关闭,而且这个Socket实例也应该关闭。

通过Socket发送数据(TCP/UNIX)

BlueSocket 提供了4种发送数据的方法,按推荐顺序从上到下:

  1. write(from data: Data) —— 发送Data类型数据。
  2. write(from data: NSData) —— 发送NSData类型数据。
  3. write(from string: String) —— 发送String类型数据。
  4. write(from buffer: UnsafeRawPointer, bufSize: Int) —— This function writes the data contained within the buffer of the specified size by providing an unsafe pointer to that buffer and an integer that denotes the size of that buffer.

UDP部分的不再介绍了。

有关NSData和NSMutableData的重要说明

上面使用NSData或NSMutableData的read、write方法在不久的将来可能会被弃用。

原文地址

https://github.com/IBM-Swift/BlueSocket

猜你喜欢

转载自blog.csdn.net/zhang5690800/article/details/79286678
今日推荐