WebSocket是什么

WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。其最大特点之一就是:服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话。

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

我这里通过两个库来实现整个WebSocket的开发,这两个库分别是gin和gorilla/websocket。这里有两种方法来获取这两个库,其一就是用go get,其二是使用git bash中的git clone拉取。我使用的是第二种方法,具体使用方法如下。

  • 拉取gorilla/websocket到GOPATH的src下的github.com目录里面

    git clone https://github.com/gorilla/websocket
  • 拉取gin-gonic/gin到GOPATH的src下的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
    }
    }

    这就是用gin框架搭载的一个简单HTTP服务,这里可以看出WebSocket就是由HTTP进行升级得到的。现在我们只要把r.GET()里面的func(c *gin.Context){}进行封装,即可完善整个服务。

  • 完善内部逻辑

    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
    }
    }
    }

    这里解释一下为什么说这个使用为什么内部线程不安全,因为conn.ReadMessage()和conn.WriteMessage()这两个接口是并发不安全的,它们在同一时刻不能被不同线程同时调用,否者会使服务中断。具体情况可以在函数里面写过几个goroutine就可以深刻体会它们的这种不安全。这就导致了一种情况做不到,就是若是想做一个心跳机制,这里就不能再开一个goroutine。

  • 将main函数调整

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

    只要把r.GET()里面的func(c *gin.Context){}提到成handler函数即可。

完整代码如下
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)的更多相关文章

  1. golang之websocket 源码分析

    下载go的websocket包. 1. 通过google官方的方法, 需要hg来同步代码. 由于墙的原因, 还需要设置代理. 比较麻烦 2. http://gopm.io/ 通过该网站下载, 这是go ...

  2. golang gorilla websocket例子

    WebSocket协议是基于TCP的一种新的网络协议.它实现了浏览器与服务器全双工(full-duplex)通信--允许服务器主动发送信息给客户端. WebSocket通信协议于2011年被IETF定 ...

  3. 使用golang对海康sdk进行业务开发

    目录 准备工作 开发环境信息 改写HCNetSDK.h头文件 开发过程 基本数据类型转换 业务开发 参考 项目最近需要改造升级:操作海康摄像头(包括登录,拍照,录像)等基本功能.经过一段时间研究后,发 ...

  4. go语言系列--golang在windows上的安装和开发环境goland的配置

    在windows上安装golang软件 golang中国网址为:https://studygolang.com/dl 我的学习选择版本:1.12.5 golang 1.12.5版本更新的内容:gola ...

  5. 基于golang的websocket通信实现

    代码: https://gitee.com/knox_xzk/websocket

  6. GoLang语言环境搭建及idea集成开发(超详细)

    一.所需安装包(windows) 1. https://golang.org/dl/  下载 MSI installer.不会翻墙的自己找国内下载,双击运行,按照提示安装即可.环境变量自动配置 2.i ...

  7. 【GoLang】GO语言系列--001.GO开发环境搭建

  8. 微信小程序开发---逻辑层(App Service)

    再说逻辑层之前,先说说微信小程序框架(MINA) 小程序开发框架的目标是通过尽可能简单.高效的方式让开发者可以在微信中开发具有原生APP体验的服务. 框架提供了自己的视图层描述语言WXML和WXSS, ...

  9. 20181220 Oracle程序包基本开发逻辑

    做事情,开始也许比较迷茫,也可能工具不会,也可能语言不会,但不要害怕 多去思考而不是盲目的开始工作,盲目的听从,程序开发都是不断训练自己的思维能力. 做每件事情都是有意义的,思考为什么这么做,这么做的 ...

随机推荐

  1. HashMap(1.8)源码学习

    一.HashMap介绍 1.哈希表(hash table) 在哈希表中进行添加,删除,查找等操作,时间复杂度为O(1) 存储位置 = f(关键字) 其中,这个函数f一般称为哈希函数,这个函数的设计好坏 ...

  2. 树莓派使用docker安装青龙面板和改面板端口号

    配置环境 系统:Raspbian 11(64位) 设备:树莓派4B 系统默认没有防火墙,所以就不用在防火墙中开放端口. 一.安装docker(已安装省略) 1.安装 curl -fsSL https: ...

  3. 关于WebStorm 破解

    建议资金宽裕,支持正版 2017.2.27更新 选择"license server" 输入:http://idea.imsxm.com/ 2016.2.2 版本的破解方式: 安装以 ...

  4. 自动同步bing壁纸

    在百度搜东西,经常出来一大坨广告:要么就是复制粘贴文章.完全没有创新,搜索越来越困难.偶尔用一下bing还挺好用. bing的壁纸是真心好看,每天不重样.决定写个脚本同步一下它的壁纸. 一.以我的Wi ...

  5. 说出来你可能不信,我用excel就能做一张高端的统计报表

    统计报表是指各级企事业.行政单位按规定的表格形式.内容.时间要求报送程序,自上而下统一布置,提供统计资料的一种统计调查方式.统计报表具有来源可靠.回收率高.方式灵活等特点,是各个基层企业或事业单位填报 ...

  6. 【C#基础概念】程序集与托管模块的概念

    本文是为了学习程序集而整理的网上资料,主要包括两个部分,概念和使用,前部分讲怎样理解程序集,后部分讲述怎样使用的细节. 程序集与托管模块的概念 "程序集与托管代码块"(摘自Hima ...

  7. C#爬虫(02):Web browser控件CefSharp的使用

    一.CefSharp介绍 CEF 全称是Chromium Embedded Framework(Chromium嵌入式框架),是个基于Google Chromium项目的开源Web browser控件 ...

  8. go 中 sort 如何排序,源码解读

    sort 包源码解读 前言 如何使用 基本数据类型切片的排序 自定义 Less 排序比较器 自定义数据结构的排序 分析下源码 不稳定排序 稳定排序 查找 Interface 总结 参考 sort 包源 ...

  9. Python:在命令行窗口中运行Python程序

    首先通过cd进入程序所在目录下 再通过python或者python3加要运行的python文件即可

  10. Liunxa安装Nignx,Git

    Linux安装Nignx 1.安装依赖 执行语句 yum install gcc patch libffi-devel python-devel zlib-devel bzip2-devel open ...