GO提供原生的websocket API,使用时go get然后引用即可
golang.org/x/net/websocket
使用起来也很方便,直接上代码吧。

一个echo server的代码

package mainimport("golang.org/x/net/websocket""fmt""net/http""flag"
)type WSServer struct {ListenAddr string
}func (this *WSServer)handler(conn *websocket.Conn){fmt.Printf("a new ws conn: %s->%s\n", conn.RemoteAddr().String(), conn.LocalAddr().String())var err errorfor {var reply stringerr = websocket.Message.Receive(conn, &reply)if err != nil {fmt.Println("receive err:",err.Error())break}fmt.Println("Received from client: " + reply)if err = websocket.Message.Send(conn, reply); err != nil {fmt.Println("send err:", err.Error())break}}
}
func (this *WSServer)start()(error){http.Handle("/ws", websocket.Handler(this.handler))fmt.Println("begin to listen")err := http.ListenAndServe(this.ListenAddr, nil)if err != nil {fmt.Println("ListenAndServe:", err)return err}fmt.Println("start end")return nil
}func main(){addr  := flag.String("a", "127.0.1.1:12345", "websocket server listen address")flag.Parse()wsServer := &WSServer{ListenAddr : *addr,}wsServer.start()fmt.Println("------end-------")
}

上述代码中,每来一个新的websocket client,server会起一个goroutine执行WSSever的handler函数。

websocket client代码实例

package mainimport ("flag""fmt""time""golang.org/x/net/websocket"
)var addr = flag.String("addr", "127.0.0.1:12345", "http service address")func main() {flag.Parse()url := "ws://"+ *addr + "/ws"origin := "test://1111111/"ws, err := websocket.Dial(url, "", origin)if err != nil {fmt.Println(err)}go timeWriter(ws)for {var msg [512]byte_, err := ws.Read(msg[:])//此处阻塞,等待有数据可读if err != nil {fmt.Println("read:", err)return}fmt.Printf("received: %s\n", msg)}
}func timeWriter(conn *websocket.Conn) {for {time.Sleep(time.Second * 2)websocket.Message.Send(conn, "hello world")}
}

client的代码,每隔2秒钟发送hello world到server,然后阻塞在Read函数。需要注意的是origin必须以“http://1111111/” 这种标准的URI格式,否则报错“invalid URI for request”。

关闭进程、网络断线等异常情况

关闭进程

无论server还是client,关闭进程,对端Read都会立刻收到EOF,对EOF做处理即可。

网络断线

  • 测试
    client和server部署在不同机器上,client每隔2秒中向server发送数据,server收到后回吐给客户端。这个过程中,拔掉client的网线。
  • 测试结果
    1. 断网后,client一定时间内写都能成功返回,但是因为断网实际没有发送出去,数据写到了底层tcp的缓冲区。
    2. 过一段时间后,1分钟左右,client Read返回错误“read: operation timed out”。Write会返回“write: broken pipe”。这个可能是Go中websocket实现时加了超时机制,也有可能是设置了底层TCP SO_KEEPALIVE,检测到了网络不可用。
    3. 在Read/Write返回错误之前,重新连上网络,可以继续发送和接受数据。这个可以从TCP的实现上解释。TCP连接并不是物理连接,本质上就是连接两端各自系统内核维护的一个四元组。客户端断线,在一定时间内并不会导致四元组的释放。所以当连上网线后此TCP连接可以自动恢复,继续进行正常的网络操作。
    4. 断线重连到其他网络,相当于断网。这个很好解释,连上其他网络,IP地址都改变了,之前的四元组不可用。

--------------------- 本文来自 阿冬哥 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/c359719435/article/details/78845719?utm_source=copy

GO 语言websocket编程相关推荐

  1. Go 学习推荐 —(Go by example 中文版、Go 构建 Web 应用、Go 学习笔记、Golang常见错误、Go 语言四十二章经、Go 语言高级编程)

    Go by example 中文版 Go 构建 Web 应用 Go 学习笔记:无痕 Go 标准库中文文档 Golang开发新手常犯的50个错误 50 Shades of Go: Traps, Gotc ...

  2. C语言网络编程:多路IO select实现多客户端

    文章目录 阻塞式的服务器程序 多线程服务器程序 非阻塞式服务器程序 基于事件响应的服务器程序 事件响应服务器程序的实现`select` 阻塞式的服务器程序 我们接触过最多的最基础的网络通信模型为TCP ...

  3. c语言面向对象编程中的类_C ++中的面向对象编程

    c语言面向对象编程中的类 Object oriented programming, OOP for short, aims to implement real world entities like ...

  4. 实验四 数据库SQL语言基础编程

    -- 实验四 数据库SQL语言基础编程 -- 实验目的: --  掌握数据库查询语句的编写方法 --  掌握利用查询语言完成基本查询 --  掌握利用SQL语句完成数据的添加.删除.修改操作 -- 实 ...

  5. c语言 简单编程题,c语言简单编程练习题.doc

    c语言简单编程练习题 精品文档 2016全新精品资料-全新公文范文-全程指导写作 –独家原创 PAGE1 / NUMPAGES1 c语言简单编程练习题 然后输出相应的字符. #include #inc ...

  6. 融云开发漫谈:你是否了解Go语言并发编程的第一要义?

    2007年诞生的Go语言,凭借其近C的执行性能和近解析型语言的开发效率,以及近乎完美的编译速度,席卷全球.Go语言相关书籍也如雨后春笋般涌现,前不久,一本名为<Go语言并发之道>的书籍被翻 ...

  7. 二级c语言编程题只要得出答案,计算机二级C语言考试编程题题库答案.docx

    计算机二级C语言考试编程题题库答案 1.求100之内自然数中最大的能被17整除的数.void main(){ int i;for(i=100;i>0;i--)if(i%17==0)break;p ...

  8. 鼠标绘图 c语言,c语言高级编程技术教程 图形显示方式与鼠标输入.doc

    c语言高级编程技术教程 图形显示方式与鼠标输入 c语言高级编程技术教程 图形显示方式和鼠标输入 图形显示方式和鼠标输入 问题的提出编写程序,使用鼠标进行如下操作:按住鼠标器的任意键并移动,十字光 标将 ...

  9. vb编程转为c语言,C语言,VB编程题

    C语言,VB编程题 來源:互聯網  2012-01-26 12:27:25  評論 分類: 電腦/網絡 >> 程序設計 >> 其他編程語言 問題描述: 一道题目,请用C语言和V ...

最新文章

  1. linux的mount(挂载)命令
  2. ps如何把自己的图与样机结合_激光整平机厂家如何给自己一个定位?
  3. http方式调用第三方接口
  4. s3-1 数据链路层概述
  5. mysql截取字符串函数left和right和substring和substring_index
  6. 最简单的基于librtmp的示例:接收(RTMP保存为FLV)
  7. PHP的str_split分割字符串成数组
  8. openwrt 在centos7 上的开发环境搭建时需要注意的地方
  9. 论基于candence的组装清单做法
  10. 程序员面试金典 - 面试题 17.23. 最大黑方阵(DP)
  11. linux内核优化策略,linux系统调优小结
  12. 小米手机连接不上网络 或者 暂时关闭状况不佳的连接
  13. Windows下Github使用
  14. 用c++做算法题的注意事项(一)
  15. java程序员选择多个offer时需要看重哪些?_27 道阿里巴巴 Java 面试题,你会几道?...
  16. eclipse如何下载插件
  17. 运维部门工作总结_IT部门运维年终总结报告
  18. 5.9 学习日记 万事成蹉
  19. FPGA复位电路设计学习分析
  20. docker 部署jenkins + sonarqube + postgresql 代码扫描

热门文章

  1. 安装完CentOS可以不做的事
  2. Tomcat一些小事
  3. 多平台支持:下一步容器技术热点
  4. [python-图像处理]python图片处理技巧[基本操作]
  5. java url 解码 编码 奇怪的解码两次
  6. 【OpenCV】8邻域种子填充法剔除短连通域的高效算法
  7. kafka分区(partition)和和分组(group)
  8. HTML CSS JS之间的关系
  9. FFmpeg RTMP推HEVC/H265流
  10. 史上最详细、最完全的ipython使用教程,Python使用者必备!