[go笔记]websocket入门
简介
WebSocket是一种在单个TCP连接上进行全双工通信的协议。WebSocket让客户端和服务端之间的数据交换变得非常简单,且允许服务器主动向客户端推送数据,并且之后客户端和服务端所有的通信都依靠这个专用协议进行。
在websocket出现之前,一些网站为了实现消息的推送,采用最多的技术是Ajax轮询,每隔一段时间,由浏览器向服务器发出HTTP请求,然后由服务器返回最新的数据给浏览器。在这种模式下,浏览器需要不断地向服务器发出http请求,而http请求可能包含较长的头部,其中真正有效的数据可能只占一小部分,显然浪费带宽,影响传输效率。
而客户端和服务端之间的websocket连接一旦建立,就可以一直保持连接状态,不需要重复发起连接请求,能更好地节省网络带宽资源,实时性更高。
需要安装第三方包:
go get golang.org/x/net/websocket
示例代码:服务端server.go
package main
import (
"fmt"
"golang.org/x/net/websocket"
"html/template"
"net/http"
)
func main() {
fmt.Println("websocket at 127.0.0.1:8000/echo")
http.Handle("/echo",websocket.Handler(Echo))
http.HandleFunc("/",handleIndex)
if err := http.ListenAndServe("127.0.0.1:8000",nil); err != nil {
fmt.Println(err)
}
}
// Echo为处理程序
func Echo(w *websocket.Conn) {
var err error
for {
var recMsg string
if err = websocket.Message.Receive(w, &recMsg); err != nil {
fmt.Println(err)
break
}
fmt.Println("客户端: ",recMsg)
msg := ""
if recMsg == "猜猜年龄" {
msg = "server: 17岁"
} else if recMsg == "你好" {
msg = "server: 你好,请问有什么可以帮你?"
} else {
msg = "server: " + recMsg
}
fmt.Println(msg)
// 发消息给客户端
if err = websocket.Message.Send(w, msg); err != nil {
fmt.Println(err)
break
}
}
}
// 返回静态html
func handleIndex(writer http.ResponseWriter, request *http.Request) {
t,_ := template.ParseFiles("index.html")
t.Execute(writer,nil)
}
客户端:index.html
服务端运行后,浏览器访问http://127.0.0.1:8000,并打开开发者模式的控制台。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Html5 Websocket test</title>
</head>
<body>
<script type="text/javascript">
var sock = null;
var wsuri = "ws://127.0.0.1:8000/echo";
window.onload = function() {
sock = new WebSocket(wsuri);
// 建立连接时触发
sock.onopen = function() {
console.log("connected to " + wsuri);
}
// 关闭连接时触发
sock.onclose = function(e) {
console.log("connection clsoed (" + e.code + ")");
}
// 收到消息时触发
sock.onmessage = function (e) {
console.log("收到消息: " + e.data);
}
// 发生错误时触发
sock.onerror = function (e) {
console.log("Error: " + wsuri);
}
};
// 发送消息
function send() {
var msg = document.getElementById('message').value;
if (sock) {
sock.send(msg);
}
};
</script>
<h1>Go WebSocket</h1>
<form>
<p>
消息: <input id="message" type="text" value="猜猜年龄">
</p>
</form>
<button onclick="send();">发送消息</button>
</body>
</html>
参考文档
- 百度百科 - websocket
- 汪明 - 《GO并发编程实战》清华大学出版社
- https://pkg.go.dev/golang.org/x/net/websocket
[go笔记]websocket入门的更多相关文章
- WebSocket学习笔记——无痛入门
WebSocket学习笔记——无痛入门 标签: websocket 2014-04-09 22:05 4987人阅读 评论(1) 收藏 举报 分类: 物联网学习笔记(37) 版权声明:本文为博主原 ...
- python学习笔记--Django入门四 管理站点--二
接上一节 python学习笔记--Django入门四 管理站点 设置字段可选 编辑Book模块在email字段上加上blank=True,指定email字段为可选,代码如下: class Autho ...
- Spring WebSocket初探2 (Spring WebSocket入门教程)<转>
See more: Spring WebSocket reference整个例子属于WiseMenuFrameWork的一部分,可以将整个项目Clone下来,如果朋友们有需求,我可以整理一个独立的de ...
- WebSocket入门教程(五)-- WebSocket实例:简单多人聊天室
from:https://blog.csdn.net/u010136741/article/details/51612594 [总目录] WebSocket入门教程--大纲 [实例简介] ...
- Java学习笔记之---入门
Java学习笔记之---入门 一. 为什么要在众多的编程语言中选择Java? java是一种纯面向对象的编程语言 java学习起来比较简单,适合初学者使用 java可以跨平台,即在Windows操作系 ...
- Bootstrap笔记--快速入门
首先是Bootstrap的简介: 业余了解:下面这个网址可以查询IP地址的地理位置 下面学习:(具体可以参考Bootstrap中文网) 栅格系统 Bootstrap 提供了一套响应式.移动设备优先的流 ...
- DBFlow框架的学习笔记之入门
什么是DBFlow? dbflow是一款android高性的ORM数据库.可以使用在进行项目中有关数据库的操作.github下载源码 1.环境配置 先导入 apt plugin库到你的classpat ...
- MongoDB学习笔记:快速入门
MongoDB学习笔记:快速入门 一.MongoDB 简介 MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统.在高负载的情况下,添加更多的节点,可以保证服务器性能.M ...
- 学习笔记_J2EE_SpringMVC_01_入门
1. 概述 笔者作为一个不太正经的不专业佛教信仰者,习惯了解事物的因果关系,所以概述就有点BBB...了.如果不喜欢这些的,请自行跳过概述章节,直接进入第二章的操作实践:2 入门示例. 1.1. ...
- dubbo入门学习笔记之入门demo(基于普通maven项目)
注:本笔记接dubbo入门学习笔记之环境准备继续记录; (四)开发服务提供者和消费者并让他们在启动时分别向注册中心注册和订阅服务 需求:订单服务中初始化订单功能需要调用用户服务的获取用户信息的接口(订 ...
随机推荐
- 【Python基础】 什么是函数
函数是一段可重用的代码块,它接受输入参数并返回输出.函数在程序设计中具有很多优点,如: 代码重用:在程序中可以重复调用相同的代码块,使程序更加简洁.高效. 模块化设计:函数是模块化设计的基本单元,可以 ...
- 2020-12-07:go中,slice的底层数据结构是什么?
福哥答案2020-12-07: 源码位于runtime/slice.go文件中的slice结构体. type slice struct { array unsafe.Pointer len int c ...
- 2021-07-12:缺失的第一个正数。给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。比如[3,4,5
2021-07-12:缺失的第一个正数.给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数.请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案.比如[3,4,5 ...
- Redis数据结构二之SDS和双向链表
本文首发于公众号:Hunter后端 原文链接:Redis数据结构二之SDS和双向链表 这一篇笔记介绍一下 SDS(simple dynamic string)和双向链表. 以下是本篇笔记目录: SDS ...
- vue全家桶进阶之路24:Mock
Mock 是一个 JavaScript 库,用于生成随机数据或模拟 HTTP 请求响应,用于前端开发中的单元测试.功能测试.集成测试等场景. Mock 可以生成各种类型的数据,包括字符串.数字.布尔值 ...
- 尤雨溪创立 Vue.js 的心路历程纪录片
Show More 本文分享自微信公众号 - 生信科技爱好者(bioitee).如有侵权,请联系 support@oschina.cn 删除.本文参与"OSC源创计划",欢迎正在阅 ...
- 六大云端 Jupyter Notebook 平台测评
有许多方法可以与其他人共享静态 Jupyter 笔记本,例如把它发布在 GitHub 上或通过 nbviewer 链接进行分享. 但是,如果接收人已经安装了 Jupyter Notebook 环境,那 ...
- VUE路由传参的实用方式
本文讲解了VUE项目中路由之间的传值方式,涉及到的方法都是开发时常用的,希望对大家有多帮助. 1. 方式一:使用router-link标签 1.1 params 传参 首先定义好路由 const ro ...
- 驱动开发:内核封装WFP防火墙入门
WFP框架是微软推出来替代TDIHOOK传输层驱动接口网络通信的方案,其默认被设计为分层结构,该框架分别提供了用户态与内核态相同的AIP函数,在两种模式下均可以开发防火墙产品,以下代码我实现了一个简单 ...
- 专访泛境科技:如何借助3DCAT实时云渲染打造元宇宙解决方案
随着5G.VR/AR等技术的发展,元宇宙(Metaverse)这一概念越来越受到关注.元宇宙是一个由虚拟世界构成的网络空间,其中人们可以通过数字化的身份和形象进行各种社交.娱乐.创作和商业活动.元宇宙 ...