Go gorilla websocket 小试牛刀

  • 一、项目引入
  • 二、项目使用
    • 1、根目录 GoWebsocket 下新建 go.mod 文件
    • 2、go build 构建项目
    • 3、go run 入口文件,执行项目
    • 4、执行 client.html 文件
    • 5、其他
  • 三、初始文件代码
    • 1、connection.go
    • 2、client.html
    • 3、server.go
  • 四、相关地址

一、项目引入

  • 项目结构很简单,只有3个文件,大家可以把这三个文件排版成这种格式,然后导入。
    Go gorilla websocket 小试牛刀_第1张图片

    • 三个文件详见步骤3
    • 如果大家觉得下载太麻烦,那就去步骤四直接下载代码 https://gitee.com/yinleilei/GoWebsocket,记得把 server.go 第四行 "**/**/impl",改成你在 mod.go 中设置的名字
  • 关于怎么用Goland新建一个已有的项目,请查看我这一篇 GoLand添加一个已有项目的相关配置

二、项目使用

1、根目录 GoWebsocket 下新建 go.mod 文件

  • 由于我新建的是一个 Go Mosules ( vgo )类型的项目,所以要在根目录GWebsocket下加一个 go.mod文件
  • go.mod 内容如下:定义项目的模块名称
module GoWebsocket

2、go build 构建项目

  • 如果没创建go.mod文件就执行 go build,报错如下:
go: cannot find main module; see 'go help modules'
  • go build 命令构建项目,在 GoLand添加一个已有项目的相关配置 已经设置了go第三方包自动导入,所以可以看到已经成功引入了第三方扩展,如图:
    Go gorilla websocket 小试牛刀_第2张图片

  • 大家同时可以看到 根目录GoWebsocket下生成了2新文件,如图
    Go gorilla websocket 小试牛刀_第3张图片
    go.sum :标记每个依赖包的版本 【Go专家编程】一文搞懂go.sum工作机制
    GoWebsocket.exe:可执行文件

3、go run 入口文件,执行项目

  • go run server.go 命令启动项目
    弹窗网络安全提示:选择允许访问,如图
    Go gorilla websocket 小试牛刀_第4张图片

程序没报错没结束,说明在执行中,如图
在这里插入图片描述

4、执行 client.html 文件

GoLang中选择 client.html 文件,选择一种浏览器打开,如图
Go gorilla websocket 小试牛刀_第5张图片
浏览器打开后,点击操作按钮打开关闭发送,打印效果,如图
Go gorilla websocket 小试牛刀_第6张图片

5、其他

  • 1)、mod.go 中定义的模块 GoWebsocket,在 server.go中引入impl下的所有文件中用到了
import (
	"GoWebsocket/impl"
	"net/http"
	"time"

	"github.com/gorilla/websocket"
)
  • 2)、如果修改了服务端代码,请务必重启服务,重启命令为go run 入口文件
go run server.go

三、初始文件代码

1、connection.go

package main

import (
	"GoWebsocket/impl"
	"net/http"
	"time"

	"github.com/gorilla/websocket"
)

var (
	upgrader = websocket.Upgrader{
     
		//允许跨域
		CheckOrigin: func(r *http.Request) bool {
     
			return true
		},
	}
)

func wsHandler(w http.ResponseWriter, r *http.Request) {
     
	var (
		wsConn *websocket.Conn
		err    error
		data   []byte
		conn   *impl.Connection
	)
	//Upgrade字段:websocket
	if wsConn, err = upgrader.Upgrade(w, r, nil); err != nil {
     
		return
	}

	if conn, err = impl.InitConnection(wsConn); err != nil {
     
		goto ERR
	}

	/**
	这个是发送心跳
	*/
	go func() {
     

		var (
			err error
		)
		for {
     
			if err = conn.WriteMessage([]byte("心跳")); err != nil {
     
				return
			}
			time.Sleep(1 * time.Second)
		}

	}()

	for {
     
		if data, err = conn.ReadMessage(); err != nil {
     
			goto ERR
		}
		if err = conn.WriteMessage(data); err != nil {
     
			goto ERR
		}
	}

ERR:
	conn.Close()
}

func main() {
     
	http.HandleFunc("/ws", wsHandler)
	http.ListenAndServe(":8888", nil)
}

2、client.html


<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>websocket实现消息推送title>
    <script>
        window.addEventListener("load",function (event) {
      
            let output = document.getElementById("output")
            let input = document.getElementById("input")
            let ws
            let print = function (message) {
      
                let d=document.createElement("div")
                d.innerHTML = message
                output.appendChild(d)
            }

            document.getElementById("open").onclick = function (event) {
      
                if(ws){
      
                    return false
                }
                ws = new WebSocket("ws://localhost:8888/ws")
                ws.onopen = function (event) {
      
                    print("打开")
                }
                ws.onclose = function (event) {
      
                    print("关闭")
                    ws = null
                }

                ws.onmessage = function (event) {
      
                    print("响应:"+event.data)
                }
                ws.onerror = function (event) {
      
                    print("错误:"+event.data)
                }
                return false
            }

            document.getElementById("send").onclick = function (event) {
      
                if(!ws){
      
                    return false
                }
                print("发送:"+input.value)
                ws.send(input.value)
                return false
            }

            document.getElementById("close").onclick = function (event) {
      
                ws.close()
                return false
            }
        })
    script>
head>
<body>
    <table>
        <tr>
            <td valign="top" width="50%">
                <p>
                    点击:<br>
                    “打开”和服务端创建一个连接。<br>
                    "发送"发送一个消息给服务端。<br>
                    "关闭"去关闭连接.<br>
                    你可以改变消息Message并且发送多次.<br>
                p>
                <form>
                    <button id="open">打开button>
                    <button id="close">关闭button><br>
                    <input  id="input" type="text" value="Websocket —— Go">
                    <button id="send">发送button><br>
                form>
            td>
            <td valign="top" width="50%">
                <div id="output">div>
            td>
        tr>
    table>

body>
html>

3、server.go

package main

import (
	"GoWebsocket/impl"
	"net/http"
	"time"

	"github.com/gorilla/websocket"
)

var (
	upgrader = websocket.Upgrader{
     
		//允许跨域
		CheckOrigin: func(r *http.Request) bool {
     
			return true
		},
	}
)

func wsHandler(w http.ResponseWriter, r *http.Request) {
     
	var (
		wsConn *websocket.Conn
		err    error
		data   []byte
		conn   *impl.Connection
	)
	//Upgrade字段:websocket
	if wsConn, err = upgrader.Upgrade(w, r, nil); err != nil {
     
		return
	}

	if conn, err = impl.InitConnection(wsConn); err != nil {
     
		goto ERR
	}

	/**
	这个是发送心跳
	*/
	go func() {
     

		var (
			err error
		)
		for {
     
			if err = conn.WriteMessage([]byte("心跳")); err != nil {
     
				return
			}
			time.Sleep(1 * time.Second)
		}

	}()

	for {
     
		if data, err = conn.ReadMessage(); err != nil {
     
			goto ERR
		}
		if err = conn.WriteMessage(data); err != nil {
     
			goto ERR
		}
	}

ERR:
	conn.Close()
}

func main() {
     
	http.HandleFunc("/ws", wsHandler)
	http.ListenAndServe(":8888", nil)
}

四、相关地址

  • github地址:github.com/gorilla/websocket
  • Go: WebSocket实现消息推送,这篇博客最下面,分享了一个代码地址,如下
  • https://gitee.com/yinleilei/GoWebsocket
  • 我发现这个视频的代码跟这里一样:封装Websocket

你可能感兴趣的:(#,Go,Go,gorilla,websocket,Gowebsocket,Gogorilla)