Golang websocket协议使用浅析

 更新时间:2023年05月19日 08:31:16   作者:Sahm5k  
这篇文章主要介绍了Golang websocket协议的使用,WebSocket是一种新型的网络通信协议,可以在Web应用程序中实现双向通信,感兴趣想要详细了解可以参考下文

WebSocket与HTTP协议的主要区别

HTTP 和 WebSocket 协议的区别 HTTP 是单向的,而 WebSocket 是双向的。

在客户端和服务器之间的通信中,每个来自客户端的 HTTP 请求都会建立一个新的连接,并在从服务器收到响应后关闭,而WebSocket连接只建立一次,并在服务器或客户端终止连接之前重复使用。

HTTP 的空闲连接的超时时间为 60 秒。可用于响应时间非常短的调用。

WebSocket 空闲连接的超时时间为 3600 秒(1 小时),可应用于响应时间长于 60 秒的调用,最大连接数为 250。

WebSocket服务器

首先,创建一个 HTTP 服务器。在这个服务器中,创建一个用于处理 WebSocket 连接的函数 handleWebSocket。

其实就是开启一个http服务器。

func HandleWebSocket(w http.ResponseWriter, r *http.Request) {
}
func main() {
	http.HandleFunc("/ws", HandleWebSocket)
	http.ListenAndServe(":8080", nil)
}

然后在该函数中,使用 gorilla/websocket 包来处理 WebSocket 连接。

1.建立upgrade变量。

websocket协议建立连接的握手过程就是http协议的头部加入了upgrade字段(upgrade:websocket)。

首先要导入"github.com/gorilla/websocket"包

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

2.升级http连接成websocket连接,处理websocket连接

将http连接头部加入upgrade字段,成为websocket协议。

func HandleHome(w http.ResponseWriter, r *http.Request) {
	//升级成websocket
	conn, err := upgrade.Upgrade(w, r, nil)
	if err != nil {
		log.Println(err)
	}
	//websocket读写逻辑
	for {
		messageType, p, err := conn.ReadMessage()
		if err != nil {
			log.Println(err)
			return
		}
		log.Println("receive:", string(p))
		conn.WriteMessage(messageType, []byte("hello, i am server"))
	}
}

WebSocket客户端

客户端主要是用来测试websocket服务器是否正确工作的,下面提供两种websocket服务器。

html+js实现

<!DOCTYPE html>
<html>
<head>
    <title>WebSocket Test</title>
</head>
<body>
    <script>
        var ws = new WebSocket("ws://localhost:8080/ws");
        ws.onopen = function() {
            console.log("WebSocket connection opened.");
	ws.send("Hi From the Client!")
        };
        ws.onmessage = function(event) {
            console.log("Received message: " + event.data);
        };
        ws.onclose = function() {
            console.log("WebSocket connection closed.");
        };
        ws.onerror = function(event) {
            console.log("WebSocket error: " + event.data);
        };
    </script>
</body>
</html>

利用golang websocket包实现

func WebSocketClient() {
	conn, _, err := websocket.DefaultDialer.Dial("ws://127.0.0.1:8080/ws", nil)
	if err != nil {
		panic(err)
	}
	defer conn.Close()
	for {
		time.Sleep(time.Second)
		conn.WriteMessage(websocket.TextMessage, []byte("hi i am client"))
		_, p, err := conn.ReadMessage()
		if err != nil {
			log.Println(err)
		}
		println("client recv:", string(p))
	}
}

到此这篇关于Golang websocket协议使用浅析的文章就介绍到这了,更多相关Go websocket内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go语言web框架Gin响应客户端的方式

    Go语言web框架Gin响应客户端的方式

    Gin是一个用Go语言编写的web框架,它是一个类似于martini但拥有更好性能的API框架, 由于使用了httprouter,速度提高了近40倍,本文给大家介绍了Go语言web框架Gin响应客户端有哪些方式,文中有详细的代码示例供大家参考,需要的朋友可以参考下
    2024-10-10
  • 详解golang defer 闭包 匿名函数

    详解golang defer 闭包 匿名函数

    这篇文章主要介绍了golang defer 闭包 匿名函数的相关知识,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • go如何利用orm简单实现接口分布式锁

    go如何利用orm简单实现接口分布式锁

    本篇文章主要介绍了go如何利用orm简单实现接口分布式锁,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • 一文带你了解Go语言fmt标准库输出函数的使用

    一文带你了解Go语言fmt标准库输出函数的使用

    这篇文章主要为大家详细介绍了Go语言中 fmt 标准库输出函数的使用,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-12-12
  • 使用Go语言创建error的几种方式小结

    使用Go语言创建error的几种方式小结

    Go语言函数(或方法)是支持多个返回值的,因此在Go语言的编程哲学中,函数的返回值的最后一个通常都是error类型,所以本文给大家介绍了使用Go语言创建error的几种方式小结,文中通过代码示例讲解的非常详细,需要的朋友可以参考下
    2024-01-01
  • 解决电脑用GoLand太卡将VsCode定制成Go IDE步骤过程

    解决电脑用GoLand太卡将VsCode定制成Go IDE步骤过程

    这篇文章主要为大家介绍了解决电脑用GoLand太卡,将VsCode定制成Go IDE步骤过程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • 解决go mod私有仓库拉取的问题

    解决go mod私有仓库拉取的问题

    这篇文章主要介绍了解决go mod私有仓库拉取的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05
  • Go 库bytes.Buffer和strings.Builder使用及性能对比

    Go 库bytes.Buffer和strings.Builder使用及性能对比

    这篇文章主要为大家介绍了Go 库bytes.Buffer和strings.Builder使用及性能对比,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • 详解Golang五种原子性操作的用法

    详解Golang五种原子性操作的用法

    本文主要介绍了详解Golang五种原子性操作的用法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • Golang截取字符串方法示例讲解及对比

    Golang截取字符串方法示例讲解及对比

    这篇文章主要介绍了Golang截取字符串方法,文中介绍了使用rune函数和utf包以及range遍历的方式,熟练掌握这些可以帮助我们更方便地处理字符串,提高编程效率和代码质量,感兴趣的同学可以参考下文
    2023-05-05

最新评论