SwiftSockets 0.22.2

SwiftSockets 0.22.2

测试已测试
Lang语言 SwiftSwift
许可 MIT
发布最后发布2016年3月
SPM支持 SPM

Helge Heß 维护。



SwiftSockets

Swift 基于的简单套接字库。

SwiftSockets 是如何将 Swift 与原始 C API 集成的示例。更多地是为了窃取 Swift 编码想法,而不是真正在现实世界项目中使用代码。在大多数现实世界的 Swift 应用中,您有 Cocoa 的访问权限,请使用它。

它还附带了一个精彩的 Echo 守护进程作为演示,如果您需要聊天,它始终都在。

注意:这是我第一个 Swift 项目。欢迎大家对我的代码提出改进建议。我期待很多很多 :-)

目标

该项目包括三个目标

  • SwiftSockets
  • ARIEchoServer
  • ARIFetch

更新支持 Swift 0.2.2(即 Xcode 7.3)。

Linux 用户注意:此项目可以通过 Swift Package Manager 以及使用嵌入的 makefiles 使用 Swift 2.2 版本编译。请确保您已将 Grand Central Dispatch 安装到您的 Swift 安装中。在 Linux 上,包含的 ARIEchoServer/ARIFetch 应用无法编译,但这个可以:SwiftyEchoDaemon

SwiftSockets

一个包含套接字类和相关扩展的框架。它从 SOPE NGStreams 库中汲取了一些灵感。

服务器示例

let socket = PassiveSocket<sockaddr_in>(address: sockaddr_in(port: 4242))!
  .listen(dispatch_get_global_queue(0, 0), backlog: 5) {
    print("Wait, someone is attempting to talk to me!")
    $0.close()
    print("All good, go ahead!")
  }

客户端示例

let socket = ActiveSocket<sockaddr_in>()!
  .onRead { sock, _ in
    let (count, block, errno) = sock.read() // $0 for sock doesn't work anymore?
    guard count > 0 else {
      print("EOF, or great error handling \(errno).")
      return
    }
    print("Answer to ring,ring is: \(count) bytes: \(block)")
  }
  .connect("127.0.0.1:80") { socket in
    socket.write("Ring, ring!\r\n")
  }

使用 Swift Package Manager 使用 SwiftSockets

要在您的 SPM 项目中使用 SwiftSockets,只需将其添加为您 Package.swift 文件中的依赖项即可

import PackageDescription

let package = Package(
  name:         "SwiftyEcho",
  targets:      [],
  dependencies: [
    .Package(url: "https://github.com/AlwaysRightInstitute/SwiftSockets.git",
             majorVersion: 0, minor: 1
    )
  ]
)

ARIEchoServer

出色的回声服务器。这个实际上是 Cocoa 应用。编译并运行它,然后在 Terminal.app 中通过 telnet 1337 连接到它。

SwiftyEchoDaemon

用Swift编写的最优秀的bezt回声守护程序 - SPM版本。这是一个演示如何在使用Linux或OSX的SwiftSockets Swift包管理器版本。如果没有使用SPM,只需通过makefile构建SwiftSockets即可。

优秀的回声服务器。通过make编译它,通过make run运行它,然后在Terminal.app中通过telnet 1337连接到它。

ARIFetch

将套接字连接到某些端点,发送带有一些很酷的头的HTTP/1.0 GET请求,然后显示服务器发送的结果。Cocoa应用程序。

为什么用HTTP/1.0?避免在www.apple.com上进行重定向 :-)

目标

  • [x] 最大行长度:80个字符
  • [ ] 优秀的错误处理
    • [x] PS风格的优秀错误处理
    • [x] print()错误处理
    • [ ] Swift 2 try/throw/catch
      • [ ] 真实的错误处理

  • [x] Twisted(无阻塞读取或写入)
    • [x] 异步读取和写入
      • [x] 永不阻塞读取
      • [x] 永不阻塞监听

    • [ ] Async connect()
  • [ ] 支持所有类型的Unix套接字和地址
    • [x] IPv4
    • [ ] IPv6(我猜这也应该可以工作)
    • [ ] Unix域套接字
    • [ ] 数据报套接字

  • [x] 无NS主义
  • [ ] 使用Swift提供的语言功能
    • [x] 泛型
      • [x] 泛型函数
      • [x] typealias

    • [x] Closures
      • [x] weak self
      • [x] trailing closures
      • [x] 隐式参数

    • [ ] Unowned
    • [x] 结构体上的扩展
    • [x] 组织类的扩展
    • [x] 结构体上的协议
    • [ ] Swift 2协议扩展
    • [x] 带标签的元组
    • [x] trailing closures
    • [ ] @Lazy
    • [x] 通过@class实现纯Swift弱代理
    • [x] Optionals
    • [x] 方便的初始化器
    • [x] 可失败的初始化器
    • [x] 结构体上的类变量
    • [x] CConstPointer, CConstVoidPointer
      • [x] withCString {}

    • [x] UnsafePointer
    • [x] sizeof()
    • [x] 标准协议
      • [x] 可打印的
      • [x] BooleanType(即LogicValue)
      • [x] OutputStreamType
      • [x] Equatable
        • [ ] EquatableEnumswithAssociatedValues中的Equatable

      • [x] Hashable
      • [x] SequenceType(GeneratorOf)
      • [x] 字面值可转换的
        • [x] StringLiteralConvertible
        • [ ] IntegerLiteralConvertible

    • [x] 左移和右移
    • [ ] 激进封装的枚举
    • [ ] 动态类型系统,反射
    • [x] 操作符重载
    • [ ] UCS-4标识符(🐔🐔🐔)
    • [ ] 带图片和不同字体代码段的RTF源代码
    • [ ] 嵌套类/类型
    • [ ] 模式
      • [x] 使用通配符模式忽略值

    • [x] 字面值可转换的
    • [ ] @autoclosure
    • [ ] unsafeBitCast(曾是reinterpretCast)
    • [x] final
    • [x] 隐式合并运算符
    • [ ] dynamic
    • [ ] Swift 2
      • [ ] 可用性
      • [x] guard
      • [x] defer
      • [ ] C函数指针
      • [x] debugPrint
      • [ ] lowercaseString

    • [x] #if os(Linux)
    • [ ] #if swift(>=2.2)
  • [x] Swift包管理器
    • [x] GNUmakefile支持

  • [x] Linux支持

原因?!

这是一个为了熟悉Swift的实验。为了检查是否可以在“纯”Swift中实现真正的东西。这意味着不使用任何Objective-C Cocoa类(不使用NS主义)。或者换句话说:你能否使用Swift,而不需要用Objective-C编码所有“真实”的代码? :-)

联系

@helje5 | [邮箱地址保护]