Swift開源:AppMateServer - 基于 Websocket 的簡易通訊服務器

PamelaEPLF 8年前發布 | 22K 次閱讀 Swift WebSocket Apple Swift開發

AppMateServer

這是 AppMate 的服務端。

它是一個基于 Websocket 的簡易通訊服務器,編寫語言為 swift 。工程的 master 分支可在 Xcode 8.2 及以上編譯,當前只能工作在 macOS(10.12+) 平臺。

See Also

前置說明

AppMate 其實是我們小組內部的一個嘗試,正式服務的 server 端是用 Nodejs 實現的。用 swift 重寫這個項目的核心框架主要是想確認下知名 swift web 框架Perfect 的使用手感和穩定性到底如何。其中 websocket 組件是基于官方 PerfectlySoft/Perfect-WebSockets 自行定制的 Event-Driven 版本,Pull Request 見此。

嘗試這個項目另外一點,其實也想知道使用 swift 可以做到什么程度,以及對比其他 server 端(e.g. Nodejs)的優劣勢。

最后是關于平臺兼容性,這確實是一個問題。因為Swift Foundation 目前還處于早期階段,一些模塊還沒有做到完全跨平臺,不幸的是在這個項目中會使用到其中的個別模塊(e.g. Stream , DateFormatter )。另外用到了改版后的GCD,當前只能工作在 macOS(10.12+) 平臺。

編譯運行

首先是 clone 工程,SPM 安裝依賴

git clone https://github.com/c98/AppMateServer.git
cd AppMateServer
swift package fetch
swift package generate-xcodeproj
open *.xcodeproj

缺省的服務端端口是 8011,你可以在 main.swift 中修改。

在 Xcode 中運行服務端,你會看到如下輸出:

Starting HTTP server on 0.0.0.0:8011 with document root ./webroot

這表示服務端已啟動,正等待監聽,剩下就是手機端AppMateClient 和瀏覽器端AppMateBrowser 的訪問了。

文件組織

server 端主要依賴了 Perfect 框架,項目的源碼文件在 Sources 目錄下。

main.swift: 服務端配置,router handler 設定,主運行循環
handler.swift: 配置 websocket 的 message handler
pubsub.swift: 基于 Publish/Subscribe 的一套簡單的通訊模式
plugins.swift: 插件管理,負責注冊模塊的訂閱關系
sessions.swift: 核心插件,負責管理 websocket 應用級會話,包括連接進來、斷開、心跳控制等
Test.swift: 一個測試插件,用來訂閱手機端發來的 log,進行信息重組再推送給瀏覽器端

服務端通訊架構圖

后記

AppMate 系列項目是最近一周整理的,踩了一點坑,不過整體而言還算順利。

如果說有什么想說的,我覺得 server 端會是一個不錯的話題。

我大概還算是一名 iOS 開發,雖然近半年基本上不怎么寫 iOS 代碼了,主要是在搞 Nodejs 后端 和 前端應用。

上文說過我們在內部使用的是 Nodejs 版本,而在這個系列中的 server 端是采用 swift 編寫的,這其實是一個偶然也可以說是無奈之舉。

我倒是很想嘗試在 App 端用 swift 寫一點東西,但是因為一些客觀條件的限制,目前還無法在生產環境中使用這門語言,轉而想用這門語言在一些內部系統的后臺中做點事情 ;)

初次使用 swift 編寫 server 端應用,碰到了很多問題,給我印象深刻的是 swift 的 值語義 ,我以為這個東西很簡單,因為這也不是什么新東西,但是在實際編碼時忽略了這個簡單的概念而處處碰壁。Array 等基礎類型是值語義的,盡管語言內部是做了引用語義+COW 優化,由于長期習慣了 for in 的引用語義(OC/js),讓我在這個坑里爬了好久。

給我帶來一定沖擊的是 Optional,雖然從理解上而言不是特別繞,但是真的使用時,發現很多時間都是花在 Optional 上。它強制了我必須認真對待變量為空的可能, 一定程度上提高了編碼的可靠性,現在是想偷一點懶都不行,即便只是寫一個測試應用。

swift 真的是一個熟悉了才能提高編碼效率的語言,初次接觸還是比較難受的,好在現在 Xcode 的錯誤和 autofix 提示都做的非常好了。

同樣是開發這個服務端,Nodejs 在開發效率上遠超 swift,但是出錯率也會高于 swift。有幾方面原因,一個是語言本身的嚴謹度,js 就是太動態了,什么都沒有限制,都可以做,這一點真不知道是該讓人愛還是恨,swift 天生嚴謹,限制重重。第二個原因是社區的質量和支持度,以服務端而言,我覺得單從開發體驗上,Perfect 離 Node 還有相當距離,盡管 Perfect 目前已經算得上是社區中相對較為完善的 web 框架了。

swift 基礎類型比較豐富,如果 Fundation 和其他核心庫能完成標準化、跨平臺,我覺得作為服務端語言新秀也是相當有吸引力的 ;)

 

 

 

 本文由用戶 PamelaEPLF 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!