使用golang開發websocket的記錄


使用beego框架進行整個社區的restful api的開發,查找資料后決定使用github.com/gorilla/websocket  作為websocket的包,

定義websocket的屬性

var upgrader = websocket.Upgrader{
	ReadBufferSize:  1024,
	WriteBufferSize: 1024,
}

  都是按照官方的例子來,期間也參考了beego的一個聊天室的實例。

ws, err := upgrader.Upgrade(this.Ctx.ResponseWriter, this.Ctx.Request, nil)
defer ws.Close()

因為是使用beego框架,所以實例化websocket的時候,傳輸的參數是使用beego的獲取方式

 實例化ws以后,使用了一個for循環,等待接收數據,並且對數據進行處理

_, p, err := ws.ReadMessage()

  這里我沒有對內容進行判斷,所以第一個參數,返回的數據類型,我直接拋棄了,因為功能很簡單,所以也就不做數據類型驗證,對數據進行一堆處理之后,返回json

	if err = ws.WriteJSON(resMap); err != nil {
					fmt.Println(err)
					ws.Close()
					break
				}

  測試方便,把報錯信息直接打出,ws包帶着返回json的方式,直接把map傳遞過來就可以了,如果報錯一定要直接ws.Close() 不然會被后台信息淹沒掉

 

其實用法很簡單,麻煩的是公司的nginx版本太低,部署的時候先升級了nginx,然后做了個反向代理,監聽了腳本的端口,

設置了cgi的存活時間,否則是按照php的設置來的,所以單獨給websocket程序的段增加了持續時間

 

因為程序邏輯里還有一個延遲等待的功能,開始是使用一個time.sleep來實現,后來讀了go語言程序設計后,學會了一招,可以用channel來做處理。

 

設置nginx的方法

因為部署在php的服務器上,所以直接使用supertctl做了一個進程監控,讓go作為一個后台進程運行,然后使用nginx做了一個反向代理,設置如下

 

首先。修改nginx.conf文件, 要在 http 里面添加配置,也就是 跟server同級

map $http_upgrade $connection_upgrade {
    default upgrade;
    '' close;
}
 #limit_zone  crawler  $binary_remote_addr  10m;
upstream websocket {
    server 127.0.0.1:8198;
}

  設置反向代理 我的是監聽本機8198端口

 

然后設置 訪問的目錄

location /backapi/ {
            
            proxy_set_header Host $host;
            proxy_pass http://websocket;
            proxy_http_version 1.1;
            proxy_read_timeout 86400s;
            keepalive_timeout 86400s;
            #proxy_redirect off;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            #proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          
        }

  設置了nginx獲取到對目錄的訪問的時候,調用go的腳本進行解析,並且設置了讀取的時間為86400秒,防止ngxin對客戶端自動關閉


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM