python从头搭建服务器_使用SwiftNIO从头开始构建日间服务器

python从头搭建服务器

自从Swift 1.2发布以来,我一直在业余时间从事Swift和iOS / macOS的开发。 尽管我仍然认为自己是Swift的新手(不感谢Apple对语言的全面改进),但我发现它是一种非常有趣且功能强大的语言。 这些年来,我什至已经发布了一些iOS和macOS应用程序,并取得了不同程度的成功(是的)。

由于我将大部分的专业工作都花在了后端开发上,所以我在很大程度上将我对Swift的兴趣和时间限制在我越来越有限的“业余时间”上。 在这种情况下,当闭门苹果公司在2015年宣布他们通过A pache License 2.0将Swift释放到开源世界时,我感到非常激动 宣布此消息后,I BM通过开发开源HTTP服务器和一个名为K itura的附带Web服务器,成为在该语言上进行投资的首批主要参与者之一。

从那时起,其他各种服务器框架如雨后春笋般冒出来,例如VaporPerfect ,它们似乎都在构建精美,功能丰富且有据可查的工具,用于构建围绕Swift构建的堆栈。 我已经阅读了许多有关这些框架的评论和教程,但是还没有机会深入探讨这些框架。 我计划将来。

今年3月, 苹果在东京的开发会议上宣布了异步事件驱动的网络框架 。 苹果公司希望将其称为SwiftNIO ,该框架将允许创建使用Swift编写的基于TCP / IP的高性能服务器和客户端。 既然服务器端Swift生态系统似乎已经成熟了,那么在将堆栈移到一些高级Web框架之前,先探索一下Swift的低层协议交付,这似乎是一个好主意。

什么是白天? 🗓🕐

当我决定要从低层次开始使用Swift时,我实际上并没有什么想法可以建立一个很好的介绍。 我问谷歌,我遇到了一些类似的教程,但是不想做一个公然的剥削,所以我决定采用经过实践检验的,真正的决策方法。

这就是我发现Daytime的方式 ,Daytime是一个比我早的超级简单tcp协议(Daytime已有35年历史了),此后一直变得完全无用。

基本上,回溯到NTP之前的日子,这是tcp协议Daytime,它只是返回客户端在终止连接之前进行连接的时间的字符串表示形式。 白天甚至没有严格定义要返回给客户端的日期格式。

入门

我假设您在macOS上进行开发,但是如果您在Linux上,则可以按照以下说明进行Swift设置。 至于macOS…

  1. 确保Xcode是最新的。 您可以在App Store中执行此操作。

2.安装brew(如果还没有的话)

$ /usr/bin/ruby -e “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

3.检查您安装的Swift版本。 您至少需要4.1.1

$ swift --version

4.安装SwiftNIO

$ brew install swiftxcode/swiftxcode/swift-xcode-nio

5.更新您的Xcode模板以包括新的服务器模板

$ swift xcode link-templates
设置项目

打开Xcode并创建一个新项目。 在模板选择对话框中,打开macOS选项卡,最底部应该是一个名为Server的区域,并带有一个名为Swift NIO的选项。 接下来,为您的项目命名,然后取消选择所有选项,然后单击“下一步”。

守则🆗

通过使用Apple的模板创建项目,您应该获得一些内置代码,包括Package.swift和main.swift文件,以及让Xcode配置产品和部署目标。 虽然这不是从实际部署中启动脚本的方式,但是出于我们的测试目的,这使事情变得容易。 为了使我们的代码可以从Xcode以及从终端运行,我们可能需要稍微调整一下内容。

Package.swift

通过使用Xcode模板,该文件将已经包含在您的项目中,并且看起来类似于下面的示例。 由于我们的日间服务器不会有很多依赖关系,因此我们唯一需要的就是TIO。

主Swift

顾名思义,main.swift是我们服务器上真正的肉和土豆的存放地。 在这里,我们定义了Server类,其中包含运行TCP / IP服务器所需的所有样板代码。

您可以在第14行的Configuration结构中看到我们正在分配值,例如侦听主机(localhost)和端口(在本例中为1313)。

在第25行的下方,我们正在init函数中初始化服务器。 我们将传入在Configuration结构中设置的config值,并设置eventLoopGroup,它充当服务器上用于处理请求的线程池。 在此示例中,我将此值设置为系统上的内核数,这将使服务器可用的最大系统线程数。

下面的函数(例如listenlistenAndWait)主要是样板代码,仅定义服务器应如何监听连接。

此代码要注意的最后一件事是在makeBootstrap函数中,在此函数中我们完成了服务器设置,特别是在第84行中,将DaytimeHandler设置为接受通道的处理程序。

最后,在第98–99行中,我们创建了服务器并开始在服务器上侦听。

DaytimeHandler.swift

DaytimeHandler定义将负责处理传入通道的处理程序,它通过实现ChannelInboundHandler协议来实现。

由于我们正在实现一个已经存在的协议,因此这里我们将覆盖该协议的默认方法。

注意:Daytime协议会丢弃任何客户端输入,并在以当前时间/日期做出响应后终止连接。

在第16和19行,我们将定义入站和出站数据类型。 因此,如果提供了任何输入,我们期望有一个ByteBuffer,并且我们也返回一个ByteBuffer。

接下来,我们将在第22行上查看channelActive函数。该函数处理新的活动连接和任何提供的输入。 首先,我们将连接详细信息记录到stdout,然后创建一个新的缓冲区,然后将time / date字符串添加到该缓冲区,然后再将该缓冲区写入通道并刷新该通道,最后关闭该通道。

当连接关闭或发生错误时, channelInactiveerrorCaught基本上只处理其他日志记录。

最后,在第43行有getTimestamp 。此方法使用Swift内置的Date和DateFormatter来获取GMT中的当前服务器时间,并返回时间/日期的字符串表示形式。 我还发现NSDateFormatter是一个很好的资源,可用于确定Swift中的日期格式。

运行服务器

从Xcode运行

这里的最后一步是运行代码。 最简单的方法是单击Xco​​de中的运行按钮。

从终端运行

也可以直接从命令行运行。 您可以通过在包含Package.swift文件的目录中运行以下命令来执行此操作

$ swift package resolve
$ swift run

测试中

macOS上的较新版本默认包含netcat(nc)。 您可以通过在端口1313(或在main.swift中指定的任何端口)上连接到本地主机来测试Daytime服务器。

$ nc 0.0.0.0 <port>
摘要

到此为止,您现在已经使用一种时髦的,先进的语言实现了3年前的tcp协议。 将来,我希望深入研究服务器端Swift,以及如何将其与其他部署技术(例如容器化和CI / CD管道)一起使用。

您可以在这里找到我的完整代码。

翻译自: https://hackernoon.com/building-a-daytime-server-from-scratch-with-swiftnio-965fc4f013ea

python从头搭建服务器

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值