[go笔记]websocket入门

简介: [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>

参考文档

相关文章
|
4月前
|
人工智能 安全 算法
Go入门实战:并发模式的使用
本文详细探讨了Go语言的并发模式,包括Goroutine、Channel、Mutex和WaitGroup等核心概念。通过具体代码实例与详细解释,介绍了这些模式的原理及应用。同时分析了未来发展趋势与挑战,如更高效的并发控制、更好的并发安全及性能优化。Go语言凭借其优秀的并发性能,在现代编程中备受青睐。
140 33
|
4月前
|
网络协议 算法 物联网
Go语言的WebSocket与实时通信
本文介绍了 WebSocket 技术及其在 Go 语言中的实现。WebSocket 是一种基于 TCP 的协议,支持客户端与服务器间的持久连接和实时通信,相比传统 HTTP 更高效。文章详细讲解了 WebSocket 的核心概念、Go 语言中的相关库(如 `gorilla/websocket`),以及其实现步骤和应用场景。通过代码示例展示了如何构建 WebSocket 服务器和客户端,并探讨了其在聊天应用、实时更新、游戏和物联网等领域的实际用途。此外,还推荐了相关工具和学习资源,帮助开发者更好地掌握这一技术。
130 3
|
5月前
|
存储 算法 数据可视化
【二叉树遍历入门:从中序遍历到层序与右视图】【LeetCode 热题100】94:二叉树的中序遍历、102:二叉树的层序遍历、199:二叉树的右视图(详细解析)(Go语言版)
本文详细解析了二叉树的三种经典遍历方式:中序遍历(94题)、层序遍历(102题)和右视图(199题)。通过递归与迭代实现中序遍历,深入理解深度优先搜索(DFS);借助队列完成层序遍历和右视图,掌握广度优先搜索(BFS)。文章对比DFS与BFS的思维方式,总结不同遍历的应用场景,为后续构造树结构奠定基础。
236 10
|
7月前
|
存储 Go
Go 语言入门指南:切片
Golang中的切片(Slice)是基于数组的动态序列,支持变长操作。它由指针、长度和容量三部分组成,底层引用一个连续的数组片段。切片提供灵活的增减元素功能,语法形式为`[]T`,其中T为元素类型。相比固定长度的数组,切片更常用,允许动态调整大小,并且多个切片可以共享同一底层数组。通过内置的`make`函数可创建指定长度和容量的切片。需要注意的是,切片不能直接比较,只能与`nil`比较,且空切片的长度为0。
164 3
Go 语言入门指南:切片
|
7月前
|
Go C语言
Go语言入门:分支结构
本文介绍了Go语言中的条件语句,包括`if...else`、`if...else if`和`switch`结构,并通过多个练习详细解释了它们的用法。`if...else`用于简单的条件判断;`if...else if`处理多条件分支;`switch`则适用于基于不同值的选择逻辑。特别地,文章还介绍了`fallthrough`关键字,用于优化重复代码。通过实例如判断年龄、奇偶数、公交乘车及成绩等级等,帮助读者更好地理解和应用这些结构。
105 15
|
10月前
|
缓存 监控 前端开发
Go 语言中如何集成 WebSocket 与 Socket.IO,实现高效、灵活的实时通信
本文探讨了在 Go 语言中如何集成 WebSocket 与 Socket.IO,实现高效、灵活的实时通信。首先介绍了 WebSocket 和 Socket.IO 的基本概念及其优势,接着详细讲解了 Go 语言中 WebSocket 的实现方法,以及二者集成的重要意义和具体步骤。文章还讨论了集成过程中需要注意的问题,如协议兼容性、消息格式、并发处理等,并提供了实时聊天、数据监控和在线协作工具等应用案例,最后提出了性能优化策略,包括数据压缩、缓存策略和连接管理优化。旨在帮助开发者更好地理解并应用这些技术。
450 3
|
10月前
|
缓存 监控 前端开发
在 Go 语言中实现 WebSocket 实时通信的应用,包括 WebSocket 的简介、Go 语言的优势、基本实现步骤、应用案例、注意事项及性能优化策略,旨在帮助开发者构建高效稳定的实时通信系统
本文深入探讨了在 Go 语言中实现 WebSocket 实时通信的应用,包括 WebSocket 的简介、Go 语言的优势、基本实现步骤、应用案例、注意事项及性能优化策略,旨在帮助开发者构建高效稳定的实时通信系统。
448 1
|
10月前
|
存储 设计模式 安全
Go语言中的并发编程:从入门到精通###
本文深入探讨了Go语言中并发编程的核心概念与实践技巧,旨在帮助读者从理论到实战全面掌握Go的并发机制。不同于传统的技术文章摘要,本部分将通过一系列生动的案例和代码示例,直观展示Go语言如何优雅地处理并发任务,提升程序性能与响应速度。无论你是Go语言初学者还是有一定经验的开发者,都能在本文中找到实用的知识与灵感。 ###
|
10月前
|
Serverless Go
Go语言中的并发编程:从入门到精通
本文将深入探讨Go语言中并发编程的核心概念和实践,包括goroutine、channel以及sync包等。通过实例演示如何利用这些工具实现高效的并发处理,同时避免常见的陷阱和错误。
|
11月前
|
安全 Go 开发者
破译Go语言中的并发模式:从入门到精通
在这篇技术性文章中,我们将跳过常规的摘要模式,直接带你进入Go语言的并发世界。你将不会看到枯燥的介绍,而是一段代码的旅程,从Go的并发基础构建块(goroutine和channel)开始,到高级模式的实践应用,我们共同探索如何高效地使用Go来处理并发任务。准备好,让Go带你飞。