局域網終端互傳文件項目之課后交流
如果有什么問題請在這里反饋。
最近在學習 Go 語言,語法看得差不多了,想著找點什么項目做做,正好我一直想做一個「局域網PC與手機互傳文件,且不想借助微信/QQ等騷擾軟件」的軟件,于是就用 Go 來做了,最終截圖如下:

功能很簡單:
PC 上傳文字或文件后創(chuàng)建二維碼,提供給手機瀏覽器掃碼下載
手機在瀏覽器上傳文字或文件后自動用 websocket 通知給 PC 端,彈出下載提示
這里主要說一下實現(xiàn)思路。
實現(xiàn)思路
用 Loca 創(chuàng)建窗口
我了解到 Go 的如下庫可以實現(xiàn)窗口:
lorca?- 調用系統(tǒng)現(xiàn)有的 Chrome/Edge 實現(xiàn)簡單的窗口,UI 通過 HTML/CSS/JS 實現(xiàn)
webview?- 比 lorca 功能更強,實現(xiàn) UI 的思路差不多
fyne?- 使用 Canvas 繪制的 UI 框架,性能不錯
qt?- 更復雜更強大的 UI 框架
我隨便挑了個最簡單的 Lorca 就開始了。
用 HTML/CSS/JS 制作 UI
我用 React + ReactRouter 來實現(xiàn)頁面結構,文件上傳和對話框是自己用原生 JS 寫的,UI 細節(jié)用 CSS3 來做,沒有依賴其他 UI 組件庫。
Lorca 的主要功能就是展示我寫的 index.html。
用?gin?實現(xiàn)后臺接口
index.html 中的 JS 用到了五個接口,我使用 gin 來實現(xiàn):
router.GET("/uploads/:path", controllers.UploadsController) ? ? ? ? ? ? ?
router.GET("/api/v1/addresses", controllers.AddressesController)
router.GET("/api/v1/qrcodes", controllers.QrcodesController) ?
router.POST("/api/v1/files", controllers.FilesController) ? ? ?
router.POST("/api/v1/texts", controllers.TextsController)
其中的二維碼生成我用的是?go-qrcode。
用?gorilla/websocket?實現(xiàn)手機通知 PC
這個庫提供了一個聊天室的例子,稍微改一下就能為我所用了。
整體思路
總得來說:
用 Lorca 搞出一個窗口
用 HTML 制作界面,用 JS 調用后臺接口
用 Gin 實現(xiàn)后臺接口
上傳的文件都放到 uploads 文件夾中
共 400 行 Go 代碼,700 行 JS 代碼。
如何使用
目前我只測試了 Windows 系統(tǒng),能正常運行。理論上 macOS 和 Linux 也能運行,但我并沒有測試。
你可以在?releases 頁面?下載可執(zhí)行文件,也可以自行編譯源代碼得到可執(zhí)行文件。
Windows 用戶須知
Windows 用戶需要在防火墻的入站規(guī)則中運行 27149 端口的連接,否則此軟件無法被手機訪問。
自行編譯
git clone git@github.com:FrankFang/synk.git
cd synk
cd server/frontend; yarn; yarn build; cd -
./scripts/build_for_mac.sh
./scripts/build_for_win.sh
我的收獲
知道如何用 Go 寫一個發(fā)布訂閱(使用 websocket 的時候看到別人的源碼了)
知道?
ch2 <- ch1
?與?ch2 <- (<-ch1)
?的區(qū)別了,前者一般是寫錯了知道了 Go 應用代碼引入本地包的方法