日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
創(chuàng)新互聯(lián)GoFrame教程:GoFrame高級(jí)特性-WebSocket服務(wù)

使用?GOframe?框架進(jìn)行?websocket?開發(fā)相當(dāng)簡單。我們以下通過實(shí)現(xiàn)一個(gè)簡單的?echo?服務(wù)器來演示?GoFrame?框架的?websocket?的使用(客戶端使用?HTML5?實(shí)現(xiàn))。示例代碼:https://github.com/gogf/gf/v2/tree/master/.example/net/ghttp/server/websocket

HTML5客戶端

先上?H5?客戶端的代碼




    gf websocket echo server
    
    


注意我們這里的服務(wù)端連接地址為:?ws://127.0.0.1:8199/ws?。

客戶端的功能很簡單,主要實(shí)現(xiàn)了這幾個(gè)功能:

  • 與服務(wù)端?websocket?連接狀態(tài)保持及信息展示;
  • 界面輸入內(nèi)容并發(fā)送信息到?websocket?服務(wù)端;
  • 接收到?websocket?的返回信息后回顯在界面上;

WebSocket服務(wù)端

package main

import (
	"github.com/gogf/gf/v2/frame/g"
	"github.com/gogf/gf/v2/net/ghttp"
	"github.com/gogf/gf/v2/os/gctx"
	"github.com/gogf/gf/v2/os/gfile"
	"github.com/gogf/gf/v2/os/glog"
)

var ctx = gctx.New()

func main() {
	s := g.Server()
	s.BindHandler("/ws", func(r *ghttp.Request) {
		ws, err := r.WebSocket()
		if err != nil {
			glog.Error(ctx,err)
			r.Exit()
		}
		for {
			msgType, msg, err := ws.ReadMessage()
			if err != nil {
				return
			}
			if err = ws.WriteMessage(msgType, msg); err != nil {
				return
			}
		}
	})
	s.SetServerRoot(gfile.MainPkgPath())
	s.SetPort(8199)
	s.Run()
}

可以看到,服務(wù)端的代碼相當(dāng)簡單,這里需要著重說明的是2個(gè)地方:

  1. ?WebSocket?方法: ?websocket?服務(wù)端的路由注冊(cè)方式和普通的?http?回調(diào)函數(shù)注冊(cè)方式一樣,但是在接口處理中我們需要通過?ghttp.Request.WebSocket?方法(這里直接使用指針對(duì)象?r.WebSocket()?)將請(qǐng)求轉(zhuǎn)換為?websocket?操作,并返回一個(gè)?WebSocket?對(duì)象,該對(duì)象用于后續(xù)的?websocket?通信操作。當(dāng)然,如果客戶端請(qǐng)求并非為?websocket?操作時(shí),轉(zhuǎn)換將會(huì)失敗,該方法會(huì)返回錯(cuò)誤信息,使用時(shí)請(qǐng)注意判斷方法的?error?返回值。
  2. ?ReadMessage & WriteMessage? 讀取消息以及寫入消息對(duì)應(yīng)的是?websocket?的數(shù)據(jù)讀取以及寫入操作(?ReadMessage & WriteMessage?),需要注意的是這兩個(gè)方法都有一個(gè)?msgType?的變量,表示請(qǐng)求讀取及寫入數(shù)據(jù)的類型,常見的兩種數(shù)據(jù)類型為:字符串?dāng)?shù)據(jù)或者二進(jìn)制數(shù)據(jù)。在使用過程中,由于接口雙方都會(huì)約定統(tǒng)一的數(shù)據(jù)格式,因此讀取和寫入的?msgType?幾乎都是一致的,所以在本示例中的返回消息時(shí),數(shù)據(jù)類型參數(shù)直接使用的是讀取到的?msgType?。

HTTPS的WebSocket

如果需要支持?HTTPS?的?WebSocket?服務(wù),只需要依賴的?WebServer?支持?HTTPS?即可,訪問的?WebSocket?地址需要使用 ?wss:// ?協(xié)議訪問。以上客戶端?HTML5?頁面中的?WebSocket?訪問地址需要修改為:?wss://127.0.0.1:8199/wss?。服務(wù)端示例代碼:

package main

import (
	"github.com/gogf/gf/v2/frame/g"
	"github.com/gogf/gf/v2/net/ghttp"
	"github.com/gogf/gf/v2/os/gctx"
	"github.com/gogf/gf/v2/os/gfile"
	"github.com/gogf/gf/v2/os/glog"
)

var ctx = gctx.New()

func main() {
	s := g.Server()
	s.BindHandler("/wss", func(r *ghttp.Request) {
		ws, err := r.WebSocket()
		if err != nil {
			glog.Error(ctx,err)
			r.Exit()
		}
		for {
			msgType, msg, err := ws.ReadMessage()
			if err != nil {
				return
			}
			if err = ws.WriteMessage(msgType, msg); err != nil {
				return
			}
		}
	})
	s.SetServerRoot(gfile.MainPkgPath())
	s.EnableHTTPS("../../https/server.crt", "../../https/server.key")
	s.SetPort(8199)
	s.Run()
}

示例結(jié)果展示

我們首先執(zhí)行示例代碼?main.go?,隨后訪問頁面 http://127.0.0.1:8199/,隨意輸入請(qǐng)求內(nèi)容并提交,隨后在服務(wù)端關(guān)閉程序。可以看到,頁面會(huì)回顯提交的內(nèi)容信息,并且即時(shí)展示?websocket?的連接狀態(tài)的改變,當(dāng)服務(wù)端關(guān)閉時(shí),客戶端也會(huì)即時(shí)地打印出關(guān)閉信息。

Websocket安全校驗(yàn)

?gf?框架的?websocket?模塊并不會(huì)做同源檢查(?origin?),也就是說,這種條件下的?websocket?允許完全跨域。

安全的校驗(yàn)需要由業(yè)務(wù)層來處理,安全校驗(yàn)主要包含以下幾個(gè)方面:

  1. ?origin?的校驗(yàn): 業(yè)務(wù)層在執(zhí)行?r.WebSocket()?之前需要進(jìn)行?origin?同源請(qǐng)求的校驗(yàn);或者按照自定義的處理對(duì)請(qǐng)求進(jìn)行校驗(yàn)(如果請(qǐng)求提交參數(shù));如果未通過校驗(yàn),那么調(diào)用?r.Exit()?終止請(qǐng)求。
  2. ?websocket?通信數(shù)據(jù)校驗(yàn): 數(shù)據(jù)通信往往都有一些自定義的數(shù)據(jù)結(jié)構(gòu),在這些通信數(shù)據(jù)中加上鑒權(quán)處理邏輯;

WebSocket聊天室案例

?gf?框架示例項(xiàng)目中提供了基于?WebSocket?的聊天室案例,具體請(qǐng)查看:https://github.com/gogf/gf-demos

WebSocket client 客戶端

func main() {
	client := ghttp.NewWebSocketClient()
	client.HandshakeTimeout = time.Second    // 設(shè)置超時(shí)時(shí)間
	client.Proxy = http.ProxyFromEnvironment // 設(shè)置代理
	client.TLSClientConfig = &tls.Config{}   // 設(shè)置 tls 配置

	conn, _, err := client.Dial("ws://127.0.0.1:9501", nil)
	if err != nil {
		panic(err)
	}
	defer conn.Close()

	err = conn.WriteMessage(websocket.TextMessage, []byte("hello word"))
	if err != nil {
		panic(err)
	}

	mt, data, err := conn.ReadMessage()
	if err != nil {
		panic(err)
	}
	fmt.Println(mt, data)
}

本文名稱:創(chuàng)新互聯(lián)GoFrame教程:GoFrame高級(jí)特性-WebSocket服務(wù)
文章源于:http://www.dlmjj.cn/article/djcjhge.html