问题标签 [swift-nio]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
360 浏览

swift - ChannelInboundHandler (Swift-NIO) 中不支持 writeData

我正在尝试制作一个简单的回显 UDP 服务器,它发送回所有以 UTF8 字符串为前缀的传入数据报。

在我试图达到这个目标的过程中,我成功地发回了传入的数据,但是当我尝试在这个数据前加上字符串:"You sent: "时,我得到了一个错误writeDataUnsupported

这是我的代码:

我做了一个ChannelInboundHandler调用Echo,它所做的只是:对于每个传入的数据报,它先发送字符串"You sent: ",然后再发送传入数据报的数据。

然后我创建了一个单线程事件循环组并为其分配了一个数据报引导程序。然后我将引导程序绑定到端口 4065。

为什么我writeDataUnsupported在尝试发送字符串时总是得到这个:"You sent: "

0 投票
1 回答
733 浏览

swift - 如何在单个 Vapor 路线中分支出“未来”序列?

计算流如何Future在单个 Vapor 路由中从多个动作序列中分支出来,以返回一个简单String Response的指示退出哪个阶段?

Future如果抛出错误,方法catch(_:)、、catchMap(on:_:)和可以执行;catchFlatMap(_:)但是,到目前为止,我对任何 catch 方法的实验都无法Future扩展动作序列。(参见API文档

注意:由于Vapor 3 Async 核心是建立在swift-nio之上的,所以 SwiftNIO 解决方案也很有趣。

例子

例如,考虑一个Future序列,它将create一个 db 条目、update相同的 db 条目、query(读取)该 db 条目,然后返回一些String响应。

发布结构

场景:map线性序列

场景:map嵌套序列

0 投票
2 回答
1035 浏览

swift - 使用 Vapor 3 创建和使用游标

这可能是一罐蠕虫,我会尽力描述这个问题。我们有一个长期运行的数据处理工作。我们的行动数据库被添加到每晚并处理未完成的行动。处理夜间操作大约需要 15 分钟。在 Vapor 2 中,我们使用了大量原始查询来创建 PostgreSQL 游标并循环遍历它,直到它为空。

目前,我们通过命令行参数运行处理。将来我们希望它作为主服务器的一部分运行,以便在执行处理时可以检查进度。

现在这不起作用,因为我正在调用wait()并且我收到错误“前提条件失败:在 EventLoop 上时不得调用 wait()”,这很公平。我面临的一个问题是,我不知道你是如何离开主事件循环以在后台线程上运行这样的事情的。我知道 BlockingIOThreadPool,但这似乎仍然在同一个 EventLoop 上运行并且仍然导致错误。虽然我能够提出越来越复杂的方法来实现这一目标,但我希望我错过了一个优雅的解决方案,也许对 SwiftNIO 和 Fluent 有更好了解的人可以提供帮助。

编辑:要清楚,这样做的目标显然不是汇总数据库中的操作数量。目标是使用光标同步处理每个动作。当我读入结果时,我会检测到动作的变化,然后将它们的批次扔到处理线程中。当所有线程都忙时,我不会再次从光标开始读取,直到它们完成。

这些动作有很多,一次运行多达 4500 万次。聚合承诺和递归似乎不是一个好主意,当我尝试它时,只是为了它,服务器挂起。

这是一个处理密集型任务,可以在单个线程上运行数天,所以我不关心创建新线程。问题是我无法弄清楚如何在命令中使用 wait() 函数,因为我需要一个容器来创建数据库连接,而我唯一可以访问的是context.container调用 wait() 会导致上述错误。

TIA

0 投票
1 回答
458 浏览

ios - 在 SwiftNIO 中添加多个通道管道处理程序,类似于 Java Netty

我正在探索如何在 SwiftNIO 的通道管道中添加多个处理程序。在 Java Netty 中,我有以下代码:

在 SwiftNIO 中,似乎没有与“LengthFieldBasedFrameDecoder”、“ProtobufDecoder”、“LengthFieldPrepender”、“ProtobufEncoder”类似的类。我怎样才能在 SwiftNIO 中获得这些?

0 投票
1 回答
1470 浏览

swift - Using SwiftNIO and SwiftNIOHTTP2 as an HTTP2 client

I'm currently working on a simple HTTP2 client in Swift using SwiftNIO and the SwiftNIOHTTP2 beta. My implementation looks like this:

Unfortunately the connection always fails with an error:

nghttp2 error: Remote peer returned unexpected data while we expected SETTINGS frame. Perhaps, peer does not support HTTP/2 properly.

However, connecting and issuing a simple request using nghttp2 from the command line works fine.

How can I establish a session and issue a GET request using SwiftNIOHTTP2?

0 投票
1 回答
193 浏览

swift - CloudRun 中的 Apple SwiftNIO - 这可能吗?

我需要实现以下功能。

  1. 客户端:iOS(和 Android)应用调用 Web 服务
  2. 服务器端:Goolge Cloud 上的 Web 服务。

服务器端应该有 HTTP/2、TLS 1.3

IBM Kitura 可以非常轻松地为 Android 和 iOS 生成客户端代码以与 SwiftNIO 服务器通信。

Kitura macOS 应用程序是创建服务定义和生成客户端和服务器代码的真正强大且简单的方法。Kitura 服务器是 SwiftNIO 2.0 服务器,可与最新的 Apple iOS 完美配合。

我探索了在 IBM Cloud 上运行服务器代码的可能性。IBM Swift Cloud Functions 非常轻量级。但它有两个大问题。

所以这两个问题排除了 IBM Cloud。

使用 Google Cloud,这两个都不是问题。

现在我正在探索使用以下选项之一构建 RESTful API 的选项:

选项 1) 是一个很好的选项,因为 Kitura macOS 应用程序。我可以只用一种语言 Swift 进行开发,这会加快开发时间。有一个缺点 - 不支持 Google Cloud API 的 Swift 客户端库。

因此基于 SwiftNIO 的 API 可以用作前端,并且应该从 1) 调用 Google Golang Cloud Functions。

或者,如果我使用 ColdRun,则可以从 Swift 调用 Golang,因为可以从 iOS 使用 Gomobile。如何?

Kitura 还可以生成 OpenAPI 接口。

选项 2) - 专门使用 Golang。缺点 - 我无法使用 Kitura Swift 功能。

Google Cloud 服务器上有哪些选项:

选项:1)我没有关于冷启动和其他参数作为 2)和 3)的答案

2) 非常好且便宜:每月 200 万次调用(包括后台和 HTTP 调用) 400,000 GB 秒内存,200,000 GHz 秒计算时间 每月 5 GB 网络出口 最大功能持续时间 = 9 分钟冷启动 = .5-1.5 秒

3)冷启动=秒,但我想2)是这个参数上最好的。

我想 ipv4 和 ipv6 以及 Apple App Transport Security (ATS) 要求适用于 1)、2) 和 3),但我需要确认。

我没有关于 1)、2) 和 3) 上的 HTTP/2、TLS 1.3 需要做什么的答案。

还有一件事。我需要能够调用 BigQuery。目前唯一支持的即用型客户端库是 Golang。

所以我认为 Cloud Run + Golang CloudFunction 上的 SwiftNIO 应该是最好的选择。

0 投票
2 回答
1215 浏览

ios - Swift-NIO 安全的 websocket 服务器

我正在尝试在我的 iOS 应用程序中创建 websocket 服务器和客户端,我在此处的示例实现的帮助下成功地做到了这一点。(https://github.com/apple/swift-nio/tree/master/Sources/NIOWebSocketServer) - 所以目前的工作情况是,我在应用程序启动时运行 websocket 服务器,然后我在可以连接的 web 视图中加载客户端给它。

现在我的问题是我希望我的服务器保护 websocket 服务器(基本上从 HTTPS html 页面连接到 websocket 服务器)

我是网络编程的新手,至少可以说缺少 Swift-nio 文档。据我了解,我可以使用(https://github.com/apple/swift-nio-transport-services

我发现这个线程正是我需要的 - https://github.com/apple/swift-nio-transport-services/issues/39 - 我可以禁用 TLS 身份验证,因为我不在乎我的用例,只要我可以连接websocket。

所以我的问题是如何扩展我的客户端(https://github.com/apple/swift-nio/tree/master/Sources/NIOWebSocketClient)和服务器(https://github.com/apple/swift-nio/ tree/master/Sources/NIOWebSocketServer ) 使用 swift-nio-transport-service。

我可以添加NIOSSLContextand 东西,但我认为我需要添加EventLoopGroupand 新bootstrap方法。我知道答案就在那里......但我似乎无法确定它。

任何指针将不胜感激。

谢谢。

0 投票
1 回答
207 浏览

swift - 为什么 Swift NIO 示例使用 HTTP/2 到 HTTP/1 协议转换?

的目的是什么HTTP2ToHTTP1ServerCodec。为什么需要将 HTTP/2 转换为 HTTP/1 协议?

这是来自 Swift NIO 示例 repo的修改代码片段。

0 投票
1 回答
522 浏览

swift - 如何在 SwiftNIO 中使用工作队列?

我有一个 Swift NIO HTTP2 服务器,它在上下文的事件循环中处理请求。但我想在另一个线程中处理请求,GCD aync 线程池并取回结果并发送它。

如果我将其更改为使用 GCD 全局队列,我将如何返回EventLoopFuture<Void>响应?

以这种方式使用 GCD 全局队列是否可以,或者我将如何使用工作线程?


发送字符串函数调用下面的函数来编写正文。

0 投票
1 回答
168 浏览

swift - SwiftNIO:如果代码在一个类中,则连接不起作用

我刚开始使用 SwiftNIO,并在第一次尝试时使用了此代码:

它有效,我打印了一个错误,因为我的服务器没有运行。

但是,如果我将该代码带到课程中,则不会发生任何事情:

我究竟做错了什么?