Go 实现 WebSockets之创建 WebSockets
作者:宇宙之一粟 发布时间:2024-05-09 09:30:36
前言
上一篇文章Go 实现 WebSockets和什么是 WebSockets我们先介绍了什么是 WebSockets 协议。本篇文章将来介绍如何利用 Go 来实现一个 WebSockets。要基于 net/http 库编写一个简单的 WebSocket 响应服务器,我们需要:
建立握手
从客户端接收数据帧
向客户端发送数据帧
关闭握手
WebSockets 无需客户端事先请求即可从服务器传输数据,允许来回传递消息并保持连接打开,直到客户端或服务器终止它。因此,可以在客户端和服务器之间进行双向实时数据传输。 WebSocket 通信通常通过 TCP 端口号 443 完成。
WebSocket 协议规范定义了两种 URI 方案:
WebSocket (ws):用于非加密连接
WebSocket Secure (wss):用于加密连接
建立 HTTP 服务器
WebSockets 建立在 HTTP 之上,所以首先,我们将设置一个基本的 HTTP 服务器,它可以接受客户端连接并提供消息。将以下代码添加到我们的 ??server.go?
? 文件中:
package main
import (
"fmt"
"net/http"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Welcome to the server!\n")
})
http.ListenAndServe(":8080", nil)
}
通过运行 ??go run server.go?
?? 启动服务器。当您访问 ??localhost:8080?
? 时,您应该会看到以下输出:
Welcome to the server!
发起握手
由于开销较小,WebSocket 可以在 Web 服务器和 Web 浏览器或客户端应用程序之间实现实时通信和快速数据传输。 WebSocket 通信发起一个握手,它使用 HTTP Upgrade() 标头从 HTTP 协议更改为 WebSocket 协议。
要建立 WebSocket 连接,需要在客户端和服务器之间进行一次握手。握手使用 Upgrade() 方法将 HTTP 服务器连接升级到 WebSocket 协议。一旦服务器停止,我们还将使用 defer 关闭连接。
现在,我们修改 ??server.go?
? 文件,建立一个 WebSocket 握手:
首先,我们需要获取??gorilla/websocket?
? 库:
$ go get github.com/gorilla/websocket
定义一个 upgrader 结构,用来保存 WebSocket 连接的读取和写入缓冲区大小等信息:
var upgrader = websocket.Upgrader{
ReadBufferSize: 1024,
WriteBufferSize: 1024,
}
然后更改??server.go?
? 代码:
package main
import (
"fmt"
"net/http"
"github.com/gorilla/websocket"
)
var upgrader = websocket.Upgrader{
ReadBufferSize: 1024,
WriteBufferSize: 1024,
}
func main() {
http.HandleFunc("/echo", func(w http.ResponseWriter, r *http.Request) {
conn, _ := upgrader.Upgrade(w, r, nil) // error ignored for sake of simplicity
for {
// Read message from browser
msgType, msg, err := conn.ReadMessage()
if err != nil {
return
}
// Print the message to the console
fmt.Printf("%s sent: %s\n", conn.RemoteAddr(), string(msg))
// Write message back to browser
if err = conn.WriteMessage(msgType, msg); err != nil {
return
}
}
})
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
http.ServeFile(w, r, "websockets.html")
})
http.ListenAndServe(":8080", nil)
}
新建一个??websockets.html?
? 文件,写入如下代码:
<!-- websockets.html -->
<input id="input" type="text" />
<button onclick="send()">Send</button>
<pre id="output"></pre>
<script>
var input = document.getElementById("input");
var output = document.getElementById("output");
var socket = new WebSocket("ws://localhost:8080/echo");
socket.onopen = function () {
output.innerHTML += "Status: Connected\n";
};
socket.onmessage = function (e) {
output.innerHTML += "Server: " + e.data + "\n";
};
function send() {
socket.send(input.value);
input.value = "";
}
</script>
运行??go run server.go?
? 文件
打开浏览器,输入??http://localhost:8080/?
? ,然后就能看到如下界面:
当我们向服务器输入hello 后,然后单击??Send?
? 按钮。
界面如下:
回到服务器终端也能看到如下信息:
$ go run server.go
[::1]:58036 sent: Hello
至此,一个简单的 WebSockets 就完全实现了。接下来,我们看一下 WebSockets 有哪些实际运用。
WebSockets 的用例
因为 WebSockets
的主要目的是支持全双工或双向通信。除了提供实时更新外,WebSockets 还包括一个可以支持多个打开的 WebSocket 连接的轻量级服务器。与大多数其他方法相比,WebSockets 可以在更长的时间内维持客户端和服务器之间的连接。
目前,WebSockets 为 Android、iOS、Web 和桌面应用程序提供跨平台支持,WebSockets 常用于以下类型的应用程序:
实时消息
多人游戏
实时比分提要
协作编辑工具
实时位置和方向应用
使用 WebRTC 进行音频和视频聊天
来源:https://blog.51cto.com/yuzhou1su/5190020?b=totalstatistic
猜你喜欢
- SQL 多条件查询以后我们做多条件查询,一种是排列结合,另一种是动态拼接SQL如:我们要有两个条件,一个日期@addDate,一个是@nam
- 1. *表示匹配任意多个字符 \d*表示匹配任意多个数字字符import retext = "
- ThinkPHP支持多种php模板引擎,可以根据个人需要加以配置。下面我们以Smarty模板引擎为例,给大家说说具体的操作流程!首先去Sma
- 创建 NumPy ndarray 对象NumPy 用于处理数组,NumPy 中的数组对象称为 ndarray。我们可以使用 array()
- 本教程为大家分享了Fly Bird小游戏的制作流程,供大家参考,具体内容如下1.分析页面结构,理清需求和功能游戏有三个界面,分别是开始界面,
- 如何用我的国际域名做虚拟域名?config.asp<%Domain_URL = "intels.net&
- 1、通过将函数存储在独立的文件中,可隐藏程序代码的细节,将重点放在程序的高层逻辑上。2、能让你在众多不同的程序中重用函数。将函数存储在独立文
- web表单是web应用程序的基本功能。它是HTML页面中负责数据采集的部件。表单有三个部分组成:表单标签、表单域、表单按钮。表单允许用户输入
- 本文实例为大家分享了python自动化生成IOS的图标,供大家参考,具体内容如下每次上架之前都要生成十几个图片感觉无聊麻烦,考虑使用脚本处理
- 以前碰见这种使用场景都是直接order by rand()来处理的,但是效率实在是不敢恭维,所以最近又碰见这种场景,在网上找寻下比较好的解决
- 这个效果前些日子有人在论坛问起,今天有空研究了下。我打了原创标记,因为我在写这个方法时的确没有参考过别人的代码。我的方法其实就是层遮罩加AL
- 本文实例讲述了python中pycurl库的用法,分享给大家供大家参考。该实例代码实现从指定网址读取网页,主要是pycurl库的使用。具体实
- 0 前言大概是三个月前,有个人找我说要我帮忙写几行代码,功能是把一个文件夹里面的所有文件拆分成 200 个文件一个文件夹,很简单的。我理解了
- 不知道大家有没有见过在python数组中使用...符号,因为前段时间读别人代码的时候遇到了这个符号立刻就云里雾里,于是这里特此记录一下。先来
- 本文实例讲述了PHP利用header跳转失效的解决方法,分享给大家供大家参考。具体方法分析如下:一、问题:今天header(\"L
- 本文实例讲述了Python协程 yield与协程greenlet简单用法。分享给大家供大家参考,具体如下:协程协程,又称微线程,纤程。英文名
- 在索引列上使用函数使得索引失效的是常见的索引失效原因之一,因此尽可能的避免在索引列上使用函数。尽管可以使用基于函数的索引来解决索引失效的问题
- 1.官网下载:https://dev.mysql.com/downloads/找到Mysql Community Server 点击点击do
- 方法1: 将shell执行的结果保存到字符串def run_cmd(cmd): result_str='' process
- 关于中大型开发b/s开发中的缓存(cache),我的一些看法,有不正确的或者是有笔误的地方,请指正。thanks首先,应该了解基本的,对于缓