WebSocket是什么

开发前期准备(默认已经安装了golang语言环境)

  • 拉取gorilla/websocketGOPATHsrc下的github.com目录里面

    git clone https://github.com/gorilla/websocket
    
  • 拉取gin-gonic/ginGOPATHsrc下的github.com目录里面

    git clone https://github.com/gin-gonic/gin
    

WebSocket 简单使用开发(内部并发不安全,服务端server

开发逻辑
  • 定义将HTTP升级成WebSocket的全局变量upgrade,并默认允许跨域。

    var (
    	upgrade = &websocket.Upgrader{
    	    // 允许跨域
    		CheckOrigin: func(r *http.Request) bool {
    			return true
    		},
    
    	}
    )
    
  • 确定服务的基本结构,即确定main函数的结构

    func main(){
    	r := gin.Default()
    	r.GET("/test",func(c *gin.Context){})
    	err := r.Run(":1234")
    	if err != nil{
    		return
    	}
    }
    
  • 完善内部逻辑

    func handler(c *gin.Context) {
    	// 定义两个变量,其一就是*websocket.Conn,其二就是error
    	var (
    		conn *websocket.Conn
    		err  error
    	)
    	// 赋值变量,这里就用到了前面定义的upgrade
    	// conn这结构体内有许多功能,可以都尝试一下,当一般常使用:
    	// conn.ReadMessage()
    	// conn.WriteMessage()
    	// conn.Close()
    	if conn, err = upgrade.Upgrade(c.Writer, c.Request, nil); err != nil {
    		return
    	}
    	// 为了防止忘记关闭WebSocket连接,使用defer
    	defer func(conn *websocket.Conn) {
    		if err = conn.Close(); err != nil {
    			return
    		}
    	}(conn)
    
    	// 这里只处理客户端传什么就返回什么
    	for {
    		// 定义数据变量
    		var (
    			msgType int    // 数据类型
    			data    []byte // 数据
    			errMsg  error  //错误信息
    		)
    		// 接收数据
    		if msgType, data, errMsg = conn.ReadMessage(); errMsg != nil {
    			break
    		}
    		// 响应数据
    		if errMsg = conn.WriteMessage(msgType,data); errMsg != nil{
    			break
    		}
    	}
    }
    
  • main函数调整

    func main() {
    	r := gin.Default()
    	r.GET("/test", handler)
    	err := r.Run(":1234")
    	if err != nil {
    		return
    	}
    }
    
完整代码如下
package main

import (
	"github.com/gin-gonic/gin"
	"golang.org/websocket"
	"net/http"
)

var (
	upgrade = &websocket.Upgrader{
		CheckOrigin: func(r *http.Request) bool {
			return true
		},
	}
)

func handler(c *gin.Context) {
	// 定义两个变量,其一就是*websocket.Conn,其二就是error
	var (
		conn *websocket.Conn
		err  error
	)
	// 赋值变量,这里就用到了前面定义的upgrade
	// conn这结构体内有许多功能,可以都尝试一下,当一般常使用:
	// conn.ReadMessage()
	// conn.WriteMessage()
	// conn.Close()
	if conn, err = upgrade.Upgrade(c.Writer, c.Request, nil); err != nil {
		return
	}
	// 为了防止忘记关闭WebSocket连接,使用defer
	defer func(conn *websocket.Conn) {
		if err = conn.Close(); err != nil {
			return
		}
	}(conn)

	// 这里只处理客户端传什么就返回什么
	for {
		// 定义数据变量
		var (
			msgType int    // 数据类型
			data    []byte // 数据
			errMsg  error  //错误信息
		)
		// 接收数据
		if msgType, data, errMsg = conn.ReadMessage(); errMsg != nil {
			break
		}
		// 响应数据
		if errMsg = conn.WriteMessage(msgType,data); errMsg != nil{
			break
		}
	}
}

func main() {
	r := gin.Default()
	r.GET("/test", handler)
	err := r.Run(":1234")
	if err != nil {
		return
	}
}

WebSocket 商业化使用开发 (内部并发安全,服务端server)

逻辑结构图

golang实现WebSocket的商业化使用的开发逻辑(1)-LMLPHP

封装
服务函数封装
完整代码
03-25 18:53