golang长连接

设计思路:每个websocket允许的连接都是有时间限制的,超时后服务端会自动断开连接,那么长连接就在服务端发出断开连接信息后客户端检测断开信息再次发起连接请求,中间再通过握手信息确保客户端同服务器处于连接状态。

设计结构:

[plain] view plain copy

  1. type Longsocket struct {
  2. Ws         *websocket.Conn
  3. writeCh    chan []byte
  4. readCh     chan []byte
  5. ShakeHand  bool
  6. Url        string
  7. Protocol   string
  8. Origin     string
  9. BufferSize int
  10. Status     int
  11. mu         sync.Mutex
  12. }

长连接通过`writeCh`通道主动向连接方发送消息,通过`ReadCh`通道读取连接中的信息,设置`ShakeHand`来确定是否要发送握手信息,Status用以标识连接状态。

通过WriteLoop来发送握手信息,同时监听`WriteCh`通道,转发通道里的消息。

[plain] view plain copy

  1. //call func with a gorouting, it will send shake hands message to service to make sure self is ok
  2. //if you want to send message call func ‘Write‘, and the case writeCh will be vaild
  3. func (l *Longsocket) WriteLoop() {
  4. defer func() {
  5. if err := recover(); err != nil {
  6. //fmt.Println("writeloop", err)
  7. }
  8. }()
  9. for {
  10. errCount := 0
  11. if l.Status != STATUS_CONNECT {
  12. break
  13. }
  14. select {
  15. case <-time.After(time.Second * time.Duration(SHAKE_HANDS_FREQUENCY)):
  16. if l.ShakeHand {
  17. _, err := l.Ws.Write([]byte(SHAKE_HANDS_MSG))
  18. if err != nil {
  19. errCount++
  20. }
  21. }
  22. case msg := <-l.writeCh:
  23. _, err := l.Ws.Write(msg)
  24. if err != nil {
  25. errCount++
  26. }
  27. }
  28. if errCount != 0 {
  29. break
  30. }
  31. }
  32. l.Close()
  33. }

通过ReadLoop来接受信息,同时将消息转发到`ReadCh`通道内。

[plain] view plain copy

  1. //read message form socket and write them to readCh
  2. func (l *Longsocket) ReadLoop() {
  3. defer func() {
  4. if err := recover(); err != nil {
  5. //fmt.Println("readloop", err)
  6. }
  7. }()
  8. for {
  9. if l.Status != STATUS_CONNECT {
  10. break
  11. }
  12. buf := make([]byte, l.BufferSize)
  13. n, err := l.Ws.Read(buf)
  14. if err != nil {
  15. break
  16. }
  17. if n > 0 {
  18. l.readCh <- buf[0:n]
  19. }
  20. }
  21. l.Close()
  22. }

然后可以通过Read函数将消息转发到形如

type dealmsg func([]byte, *Longsocket) error

的函数中去做相应的消息处理,当然你也可以通过Longsocket参数发送相应的处理消息。

源码已上传githup如下,其中有demo供参考。

https://github.com/qianlnk/longsocket

时间: 2024-08-04 19:44:27

golang长连接的相关文章

golang长连接和短连接的学习

TCP连接示意图 长连接和短链接的区别 客户端和服务端响应的次数 长连接:可以多次. 短链接:一次. 传输数据的方式 长连接:连接--数据传输--保持连接 短连接:连接--数据传输--关闭连接 长连接和短链接的优缺点 长连接 优点 省去较多的TCP建立和关闭的操作,从而节约时间. 性能比较好.(因为客户端一直和服务端保持联系) 缺点 当客户端越来越多的时候,会让将服务器压垮. 连接管理难. 安全性差.(因为会一直保持着连接,可能会有些无良的客户端,随意发送数据等) 短链接 优点 服务管理简单.存

百万级别长连接,并发测试指南

前言 都说haproxy很牛x, 可是测试的结果实在是不算满意, 越测试越失望,无论是长连接还是并发, 但是测试的流程以及工具倒是可以分享分享.也望指出不足之处. 100w的长连接实在算不上太难的事情,不过对于网上关于测试方法以及测试工具的相关文章实在不甚满意,才有本文. 本文有两个难点,我算不上完全解决. 后端代码的性能. linux内核参数的优化. 环境说明 下面所有的测试机器都是基于openstack云平台,kvm虚拟化技术创建的云主机. 由于一个socket连接一般占用8kb内存,所以百

HTTP的长连接和短连接——Node上的测试

    本文主要从实践角度介绍长.短连接在TCP层面的表现,借助Node.JS搭建后台服务,使用WinHTTP.Ajax做客户端请求测试,最后简单涉及WebSocket.     关键字:长连接.短连接.Node.JS.WebSocket. 一两年前,在理论上对长短连接做了学习,那时的技能以客户端为主,所以也止步于客户端和网络抓包,两年来后台技术渐有把握,打算从前到后的实践一遍.如对理论有不理解的,可以先google/百度 一下,或者看看这篇偏理论的介绍:HTTP的长连接和短连接. 1 短连接的

TCP中的长连接和短连接(转载)

原文地址:http://www.cnblogs.com/onlysun/p/4520553.html 当网络通信时采用TCP协议时,在真正的读写操作之前,server与client之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接,连接的建立是需要三次握手的,而释放则需要4次挥手,所以说每个连接的建立都是需要资源消耗和时间消耗的 示意图: 长连接: 所谓长连接,指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要双方发检测包以

【HTTP】长连接和短连接

1. HTTP协议与TCP/IP协议的关系 HTTP的长连接和短连接本质上是TCP长连接和短连接.HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议.IP协议主要解决网络路由和寻址问题,TCP协议主要解决如何在IP层之上可靠的传递数据包,使在网络上的另一端收到发端发出的所有包,并且顺序与发出顺序一致.TCP有可靠,面向连接的特点. 2. 如何理解HTTP协议是无状态的 HTTP协议是无状态的,指的是协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态.也就是说,打开一个服

HTTP长连接和短连接

1.HTTP协议的五大特点1)支持客户/服务器模式2)简单快速3)灵活4)无连接每次连接只处理一个请求,服务器处理完客户的请求,并受到客户的应答后,断开连接.5)无状态协议不会记录服务器客户端状态. 2.保持HTTP连接状态的两种方式1)Cookie在访问统一网站时,可以将信息写入cookie,方便在不同的页面间提取信息. 2)SessionSession保存在服务器上,同时将标识Session的SessionId传递给客户端浏览器,保存在cookie中,浏览器关闭后,这个cookie就会被清掉

HTTP 长连接和短连接

1. HTTP协议与TCP/IP协议的关系 HTTP的长连接和短连接本质上是TCP长连接和短连接.HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议.IP协议主要解决网络路由和寻址问题,TCP协议主要解决如何在IP层之上可靠的传递数据包,使在网络上的另一端收到发端发出的所有包,并且顺序与发出顺序一致.TCP有可靠,面向连接的特点. 2. 如何理解HTTP协议是无状态的 HTTP协议是无状态的,指的是协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态.也就是说,打开一个服

TCP/IP系列——长连接与短连接的区别

1 什么是长连接和短连接 三次握手和四次挥手 TCP区别于UDP最重要的特点是TCP必须建立在可靠的连接之上,连接的建立和释放就是握手和挥手的过程. 三次握手为连接的建立过程,握手失败则连接建立失败. 四次挥手为连接的完整释放过程,也会发生某个消息丢失或者超时的情况,有一方主动发送FIN消息即表示连接即将释放. 注:SYN.ACK.FIN消息具有哪些含义,以及连接的状态,请参考<TCP/IP详解 卷1>第18章. 长连接 长连接,也叫持久连接,在TCP层握手成功后,不立即断开连接,并在此连接的

Web 通信 之 长连接、长轮询(long polling)(转载)

基于HTTP的长连接,是一种通过长轮询方式实现"服务器推"的技术,它弥补了HTTP简单的请求应答模式的不足,极大地增强了程序的实时性和交互性. 一.什么是长连接.长轮询? 用通俗易懂的话来说,就是客户端不停的向服务器发送请求以获取最新的数据信息.这里的“不停”其实是有停止的,只是我们人眼无法分辨是否停止,它只是一种快速的停下然后又立即开始连接而已. 二.长连接.长轮询的应用场景 长连接.长轮询一般应用与WebIM.ChatRoom和一些需要及时交互的网站应用中.其真实案例有:WebQQ