简介

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>

参考文档

[go笔记]websocket入门的更多相关文章

  1. WebSocket学习笔记——无痛入门

    WebSocket学习笔记——无痛入门 标签: websocket 2014-04-09 22:05 4987人阅读 评论(1) 收藏 举报  分类: 物联网学习笔记(37)  版权声明:本文为博主原 ...

  2. python学习笔记--Django入门四 管理站点--二

    接上一节  python学习笔记--Django入门四 管理站点 设置字段可选 编辑Book模块在email字段上加上blank=True,指定email字段为可选,代码如下: class Autho ...

  3. Spring WebSocket初探2 (Spring WebSocket入门教程)<转>

    See more: Spring WebSocket reference整个例子属于WiseMenuFrameWork的一部分,可以将整个项目Clone下来,如果朋友们有需求,我可以整理一个独立的de ...

  4. WebSocket入门教程(五)-- WebSocket实例:简单多人聊天室

    from:https://blog.csdn.net/u010136741/article/details/51612594 [总目录]   WebSocket入门教程--大纲   [实例简介]   ...

  5. Java学习笔记之---入门

    Java学习笔记之---入门 一. 为什么要在众多的编程语言中选择Java? java是一种纯面向对象的编程语言 java学习起来比较简单,适合初学者使用 java可以跨平台,即在Windows操作系 ...

  6. Bootstrap笔记--快速入门

    首先是Bootstrap的简介: 业余了解:下面这个网址可以查询IP地址的地理位置 下面学习:(具体可以参考Bootstrap中文网) 栅格系统 Bootstrap 提供了一套响应式.移动设备优先的流 ...

  7. DBFlow框架的学习笔记之入门

    什么是DBFlow? dbflow是一款android高性的ORM数据库.可以使用在进行项目中有关数据库的操作.github下载源码 1.环境配置 先导入 apt plugin库到你的classpat ...

  8. MongoDB学习笔记:快速入门

    MongoDB学习笔记:快速入门   一.MongoDB 简介 MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统.在高负载的情况下,添加更多的节点,可以保证服务器性能.M ...

  9. 学习笔记_J2EE_SpringMVC_01_入门

    1.    概述 笔者作为一个不太正经的不专业佛教信仰者,习惯了解事物的因果关系,所以概述就有点BBB...了.如果不喜欢这些的,请自行跳过概述章节,直接进入第二章的操作实践:2 入门示例. 1.1. ...

  10. dubbo入门学习笔记之入门demo(基于普通maven项目)

    注:本笔记接dubbo入门学习笔记之环境准备继续记录; (四)开发服务提供者和消费者并让他们在启动时分别向注册中心注册和订阅服务 需求:订单服务中初始化订单功能需要调用用户服务的获取用户信息的接口(订 ...

随机推荐

  1. Syncthing 忽略模式

    忽略模式 概要 .stignore 描述 这是 Syncthing 同步文件夹的忽略模式语法指南 语法 .stignore 文件可包含一系列路径匹配模式,对指定文件的处理方式由第一个匹配到它的模式决定 ...

  2. 2021-08-28:给定一个正数数组arr,长度一定大于6(>=7),一定要选3个数字做分割点,从而分出4个部分,并且每部分都有数,分割点的数字直接删除,不属于任何4个部分中的任何一个。 返回有没有

    2021-08-28:给定一个正数数组arr,长度一定大于6(>=7),一定要选3个数字做分割点,从而分出4个部分,并且每部分都有数,分割点的数字直接删除,不属于任何4个部分中的任何一个. 返回 ...

  3. 2021-11-08:扁平化嵌套列表迭代器。给你一个嵌套的整数列表 nestedList 。每个元素要么是一个整数,要么是一个列表;该列表的元素也可能是整数或者是其他列表。请你实现一个迭代器将其扁平化

    2021-11-08:扁平化嵌套列表迭代器.给你一个嵌套的整数列表 nestedList .每个元素要么是一个整数,要么是一个列表:该列表的元素也可能是整数或者是其他列表.请你实现一个迭代器将其扁平化 ...

  4. django视图中使用return redirect(reverse('')) 没有传参出现题:Reverse for ‘‘ with no arguments no arguments not

    redirect 的作用是跳转 reverse的作用是反向解析 当无法反向解析的时候要确认urls.py中的path参数,name参数是否一直

  5. Java配置线程池

    一.Java配置线程池 1.线程池分类.其他 1.1.分类 IO密集型 和 CPU密集型 任务的特点不同,因此针对不同类型的任务,选择不同类型的线程池可以获得更好的性能表现. 1.1. IO密集型任务 ...

  6. JavaWeb编程面试题——Spring Boot

    引言 面试题==知识点,这里所记录的面试题并不针对于面试者,而是将这些面试题作为技能知识点来看待.不以刷题进大厂为目的,而是以学习为目的.这里的知识点会持续更新,目录也会随时进行调整. 关注公众号:编 ...

  7. 从源码级剖析Java类加载原理

    相信大多数熟悉Java的研发工程师,都知道Java类加载原理:Java中的类是由类加载器采用双亲委派机制进行加载.其中,Java核心库中实现了三种类型的类加载器,它们分别是:引导类加载器Bootstr ...

  8. chatgpt入口,免费在线chatgpt--与人工智能聊天?尝试chatgpt入口,免费在线chatgpt吧!

    介绍一款人工智能聊天机器人--chatgpt入口 chatgpt是一款智能聊天机器人,它能够与人类进行自然语言对话,可以回答问题.提供建议,还可以玩游戏和聊天互动,是当前最受欢迎的人工智能聊天工具之一 ...

  9. GPT3的技术突破:实现更准确、更真实的语言生成

    目录 1. 引言 2. 技术原理及概念 3. 实现步骤与流程 4. 应用示例与代码实现讲解 5. 优化与改进 6. 结论与展望 7. 附录:常见问题与解答 GPT-3 技术突破:实现更准确.更真实的语 ...

  10. Prometheus-2:blackbox_exporter黑盒监控

    黑盒监控blackbox_exporter 前边介绍有很多exporter可以直接将metrics暴露给Prometheus进行监控,这些称为"白盒监控",那些exporter无法 ...