版权声明:本文为博主原创文章,博客地址:
https://blog.youkuaiyun.com/zxy_666/article/details/80164544,未经博主允许不得转载。
前言
在后端服务的开发中,网络通信往往是必不可少的。http连接是我们经常会用到的,但http可视为一种“短连接”,客户端若想访问服务器,每次都需要发出请求,服务器一旦返回响应,该次访问的链接就断了。客户端下次访问时,还得重新发起请求。
这种短连接并不能满足所有网络通信的场景,有时我们需要一种“长连接”。所谓“长连接”,就是指,通信双方一旦建立连接,该连接就会持续保持,直到任意一方主动关闭连接或因某种外部因素导致连接断掉(如网络不通,程序bug等)。在连接保持中,通信是双向的,也就是全双工的,通信双方随时都可以将数据发往连接的“管道”,另一方随时可读取(只要管道中有发向这一方的数据)。
可以看出,这种“长连接”方式的数据传输和读取是即时的,在前后端交互时,连接只需建立一次,就可实现数据即时的来回传输。而这种连接的一方就称为socket。
实现
- go实现socket用到了包:golang.org/x,本地没有时可以通过go get的方式拉下来:go get golang.org/x。
- 下面给出socket连接中客户端和服务端的完整代码,注释中,笔者总结了许多实践中的经验和坑,分享给大家
server
package main
import (
"golang.org/x/net/websocket"
"fmt"
"time"
"net/http"
)
//socket handler
//todo socket读写有2种方式
//todo 方式1. websocket.Message.Receive(conn, 数据接收体)/websocket.Message.Send(conn, 数据接收体)
//todo 方式2. conn.Read(数据接收体)/conn.Write(数据接收体)
//方式1
func Handler1(conn *websocket.Conn) {
//打印客户端和服务端地址
fmt.Printf("a new socket connection from %s -> %s\n", conn.RemoteAddr().String(), conn.LocalAddr().String())
//socket读写频率由代码自行控制。这里用了死循环,不断等待接受来自client端的数据。如果不设置循环,只数据传输一次后,程序就