websocket介绍

The WebSocket Protocol  RFC6455,这个是WebSocket的RFC文档,所以内容非常全面(当然只涉及协议,不涉及具体实现),不过内容太多,如果是初次了解,可以挑自己感兴趣的看看。

《WebSocket 是什么原理?为什么可以实现持久连接?》,这个是知乎上的一篇文章,对于WebSocket讲的通俗易懂,可以了解一下。

在介绍WebSocket之前,我们先来了解一下为什么会出现WebSocket。我们知道HTTP协议(底层使用的是TCP协议)是无状态的,即一次Request,一个Response就结束了。实际中的场景就是客户端(比如浏览器)向服务器发送一次请求,然后服务器返回一个响应,一次交互就结束了,底层的TCP连接也会断掉,下次请求时,重新再创建新的连接。而且这种通信是被动式的,就是说服务器端不能主动向客户端发响应,只能是客户端一个Request,服务的一个Response这种模式(当然最新的协议里面,可能可以将多个Request合并一次发给服务端,但模型仍旧是这种模式)。

如果你曾经使用TCP协议写过通信程序,应该非常熟悉那种模式:客户端和服务端(有时都没有清晰的界限)通过三步握手建立连接后,就可以相互随便发送数据,除非网络异常或者主动关闭,否则该TCP连接将一直存在。而WebSocket的出现就是为了在应用层实现类似传输层的TCP协议,当然它底层和HTTP一样使用的是TCP协议。这样我们就明白一些了,WebSocket不像HTTP协议,一次交互后就结束,它建立后会一直存在(除非主动断开或者网络异常等),而且客户端和服务端可以任意向对方发送数据,不再像以前那么“傻”了。也就是说,HTTP协议是一次性的,“单工的”;而WebSocket是真正意义上的长连接,且是全双工的。当然,上述提及的需求HTTP通过poll和轮循等方式也可以实现,但弊端非常多:

  • 服务器端需要在底层为每个HTTP连接维护一个TCP连接,比如一个用于发送消息,一个用于接收消息等。
  • 资源浪费,每次的HTTP请求中都需要携带消息头。
  • 客户端还必须通过一些手段知道哪些响应对应发出去的哪些请求。

go websocket

Go官方的标准包里面提供了一个WebSocket的包 golang.org/x/net/websocket,但也说的很明确,这个包里面并没有实现WebSocket协议规定的一些特性,而推荐使用github.com/gorilla/websocket这个包。

代码示例,代码主要实现服务端向客户端写入数据,你可以通过channel Broadcast插入数据。

web页面的测试,可以在百度上选择一些在线的,如http://coolaf.com/tool/chattest

package controllers

import (
"github.com/astaxie/beego"
"github.com/gorilla/websocket"
"net/http"
) const (
readBufferSize = 1024
writeBufferSize = 1024
) type Client struct {
conn *websocket.Conn
messages chan []byte
} var (
upgrader = websocket.Upgrader{
ReadBufferSize: readBufferSize,
WriteBufferSize: writeBufferSize,
CheckOrigin: func(r *http.Request) bool {
return true
},
}
clients map[*Client]bool // 存储所有的链接
addClients chan *Client // 新链接进来的chan
delClients chan *Client // 删除退出的chan
Broadcast chan []byte // 广播聊天的chan
) func (c *Client) writePump() {
defer func() {
delClients <- c
c.conn.Close()
}()
for {
select {
case message := <- c.messages:
err := c.conn.WriteMessage(websocket.TextMessage, message)
if err != nil {
return
}
}
}
} func manager() {
clients = make(map[*Client]bool)
addClients = make(chan *Client)
delClients = make(chan *Client) for {
select {
case message := <- Broadcast:
for client := range clients {
select {
case client.messages <- message:
default:
close(client.messages)
delete(clients, client)
}
}
case client := <- addClients:
clients[client] = true
case client := <- delClients:
if _, ok := clients[client]; ok {
close(client.messages)
delete(clients, client)
}
}
}
} type WebSocketController struct {
beego.Controller
} func (this *WebSocketController) Ws() {
ws, err := upgrader.Upgrade(this.Ctx.ResponseWriter, this.Ctx.Request, nil)
if err != nil {
return
}
client := &Client{conn: ws, messages: make(chan []byte, 256)}
addClients <- client
go client.writePump()
} func init() {
Broadcast = make(chan []byte)
go manager()
}

参考文章:

http://time-track.cn/websocket-and-golang.html

https://www.cnblogs.com/cornor/p/6178507.html

https://github.com/gorilla/websocket/tree/master/examples/chat

https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/08.2.md

https://beego.me/docs/examples/chat.md

go websocket的更多相关文章

  1. 漫扯:从polling到Websocket

    Http被设计成了一个单向的通信的协议,即客户端发起一个request,然后服务器回应一个response.这让服务器很为恼火:我特么才是老大,我居然不能给小弟发消息... 轮询 老大发火了,小弟们自 ...

  2. 细说WebSocket - Node篇

    在上一篇提高到了 web 通信的各种方式,包括 轮询.长连接 以及各种 HTML5 中提到的手段.本文将详细描述 WebSocket协议 在 web通讯 中的实现. 一.WebSocket 协议 1. ...

  3. java使用websocket,并且获取HttpSession,源码分析

    转载请在页首注明作者与出处 http://www.cnblogs.com/zhuxiaojie/p/6238826.html 一:本文使用范围 此文不仅仅局限于spring boot,普通的sprin ...

  4. WebSocket - ( 一.概述 )

    说到 WebSocket,不得不提 HTML5,作为近年来Web技术领域最大的改进与变化,包含CSS3.离线与存储.多媒体.连接性( Connectivity )等一系列领域,而即将介绍的 WebSo ...

  5. php+websocket搭建简易聊天室实践

    1.前言 公司游戏里面有个简单的聊天室,了解了之后才知道是node+websocket做的,想想php也来做个简单的聊天室.于是搜集各种资料看文档.找实例自己也写了个简单的聊天室. http连接分为短 ...

  6. Demo源码放送:打通B/S与C/S !让HTML5 WebSocket与.NET Socket公用同一个服务端!

    随着HTML5 WebSocket技术的日益成熟与普及,我们可以借助WebSocket来更加方便地打通BS与CS -- 因为B/S中的WebSocket可以直接连接到C/S的服务端,并进行双向通信.如 ...

  7. Cowboy 开源 WebSocket 网络库

    Cowboy.WebSockets 是一个托管在 GitHub 上的基于 .NET/C# 实现的开源 WebSocket 网络库,其完整的实现了 RFC 6455 (The WebSocket Pro ...

  8. 借助Nodejs探究WebSocket

    文章导读: 一.概述-what's WebSocket? 二.运行在浏览器中的WebSocket客户端+使用ws模块搭建的简单服务器 三.Node中的WebSocket 四.socket.io 五.扩 ...

  9. 细说websocket - php篇

    下面我画了一个图演示 client 和 server 之间建立 websocket 连接时握手部分,这个部分在 node 中可以十分轻松的完成,因为 node 提供的 net 模块已经对 socket ...

  10. webSocket and LKDBHelper的使用说明

    socketket与lkdbhelper来处理数据 客户需求: 当我们有需要从自己的后台推送消息给我们的用户时,用户需要实时的接收到来自我们的推送消息.前提是没有使用第三方的推送框架,那么这个使用we ...

随机推荐

  1. Sql Server设置主键和外键

    设置主键 https://jingyan.baidu.com/article/9158e0003349a7a2541228fd.html 设置外键 https://jingyan.baidu.com/ ...

  2. Codeforces Round #446 Div. 1

    B:即使看到n<=22也应该猜到这只是为了写spj.将每个数替换为恰好比他大的数即可,最大值替换为最小值.这样原序列中不包含最小值的集合显然都满足条件,并且容易发现包含最小值的集合的变化量都是最 ...

  3. 第四十九天 mysql 索引 元类

    一 昨日回顾 视图 触发器 事务 什么是事务 逻辑上的一组操作 要么都成功 要么都失败 如何使用 start transaction 开启事务 mysql 默认一条sql就是一个事务 pymysql默 ...

  4. Server socket

    用法都一样 区别:  self.request   TCP  self.requsst 代表具体的链接 UDP  self.requst 代表一个小元组(元组里面: 第一个元素 客户端发来的数据 ,第 ...

  5. 志愿者招募 HYSBZ - 1061(公式建图费用流)

    转自神犇:https://www.cnblogs.com/jianglangcaijin/p/3799759.html 题意:申奥成功后,布布经过不懈努力,终于 成为奥组委下属公司人力资源部门的主管. ...

  6. 我的SSH框架实例(附源码)

    整理一下从前写的SSH框架的例子,供新人学习,使用到了注解的方式. 源码和数据库文件在百度网盘:http://pan.baidu.com/s/1hsH3Hh6 提取码:br27 对新同学的建议:最好的 ...

  7. Install Nagios (Agent) nrpe client and plugins in Ubuntu/Debian

    安装apt-get install nagios-nrpe-server nagios-plugins 修改nrpe.cfgvi /etc/nagios/nrpe.cfg修改Allow Host,添加 ...

  8. $NOIp2018$劝退记

    鸽子博主好久没更博了,这一更可能以后都更不了了啊 \(Day~~1\) 考试爆零,已经无所畏惧了. 当作攒rp吧...qwq 晚上写了写数学总结,蒯了一堆人的博客资料,然后就学会了\(CRT\),\( ...

  9. Leetcode 350.两个数组的交集|| By Python

    给定两个数组,编写一个函数来计算它们的交集. 示例 1: 输入: nums1 = [1,2,2,1], nums2 = [2,2] 输出: [2,2] 示例 2: 输入: nums1 = [4,9,5 ...

  10. 06 Zabbix4.0系统CISCO交换机告警模板规划信息(基础)

    点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 06 Zabbix4.0系统CISCO交换机告警模板规划信息(基础) 1. Host groups ...