Add websocket module for open source project go gin API

Xinliang notes 2021-10-14 07:10:58
add websocket module open source

List of articles :

  • WebSocket Sample interface

  • Third party package

  • Code encapsulation

  • Summary

  • Recommended reading

WebSocket Sample interface


Third party package

  • gorilla/websocket [1]

websocket Configuration items are supported when linking :

type Upgrader struct {
    //  Specify upgrade  websocket  Timeout for handshake completion
    HandshakeTimeout time.Duration

    //  Appoint io The cache size of the operation , If not specified, it will be automatically assigned .
    ReadBufferSize, WriteBufferSize int

    //  Cache pool for write data operations , If there is no set value ,write buffers Will be assigned to the link lifecycle .
    WriteBufferPool BufferPool

    // Specify the protocols supported by the service in order , If the value exists , The service will match the client's protocol from the first .
    Subprotocols []string

    //  Appoint http Error response function , If not set Error be , Will generate http.Error Error response to .
    Error func(w http.ResponseWriter, r *http.Request, status int, reason error)

    //  Request check function , For unified link checking , To prevent cross site request forgery . If you don't check , Set a return value to  true  Function of .
    //  If you ask for  Origin  The header can accept ,CheckOrigin  Will return  true.  If CheckOrigin by nil, Then use the security default : If Origin The request header exists and the original host is not equal to the request host header , Then return to  false
    CheckOrigin func(r *http.Request) bool

    // EnableCompression Specifies whether the server should attempt to negotiate each message compression (RFC 7692). 
    //  Set this value to true There is no guarantee that compression will be supported . 
    //  Currently only supported “ No context takeover ” Pattern
    EnableCompression bool

Upgrade Function can change http Upgrade to WebSocket agreement :

// responseHeader Included in the response to the client upgrade request . 
//  Use responseHeader Appoint cookie(Set-Cookie) Sub protocol negotiated with the application (Sec-WebSocket-Protocol).
//  If the upgrade fails , The upgrade will use  HTTP  The error response replies to the client
//  Return to one Conn The pointer , When you get him , You can use Conn Read and write data and communicate with the client .
func (u *Upgrader) Upgrade(w http.ResponseWriter, r *http.Request, responseHeader http.Header) (*Conn, error)

Code encapsulation

Encapsulates a socket_server, It also supports the use of logs 、 database 、 Cache and other operations :

type Server interface {

 // OnMessage  receive messages

 // OnSend  Send a message
 OnSend(message []byte) error

 // OnClose  close

func New(logger *zap.Logger, db db.Repo, cache cache.Repo, conn *websocket.Conn) (Server, error) {

Encapsulates a socket_conn

func (h *handler) Connect() core.HandlerFunc {
 var upGrader = websocket.Upgrader{
  HandshakeTimeout: 5 * time.Second,
  CheckOrigin: func(r *http.Request) bool {
   return true

 return func(ctx core.Context) {
  ws, err := upGrader.Upgrade(ctx.ResponseWriter(), ctx.Request(), nil)
  if err != nil {

  server, err = socket_server.New(h.logger, h.db, h.cache, ws)
  if err != nil {

  go server.OnMessage()

socket_conn It's a HandlerFunc, It can be used directly in routing .

In the project websocket The link address is :/socket/system/message, The interface for sending messages is :/api/tool/send_message.

JavaScript Sample code :

const ws = new WebSocket("ws://");

// Triggered when the connection is open
ws.onopen = function (evt) {

// Trigger when a message is received
ws.onmessage = function (evt) {

// Triggered when the connection is closed
ws.onclose = function (evt) {

In the project Utility toolbox -> WebSocket Interface , The right side requests the interface to send a message , Messages can be received in real time on the left .


This article is just to throw a brick to attract jade , There is a problem , Welcome criticism and correction .

go-gin-api[2] The project is ready to use , Support WEB Interface one click installation , Go and have a try .

Recommended reading

Reference material





 New bright notes
New bright notes
The way to upgrade the program ape .
150 Original content
official account


本文为[Xinliang notes]所创,转载请带上原文链接,感谢

  1. Html + CSS + JS implémentation ️ Responsive Lucky Turnover ️ [with full source Sharing]
  2. Ren Jialun, who married young, was in a mess. Now she feels that it is a blessing in disguise
  3. 达梦数据库使用disql生成html格式的巡检报告
  4. React render phase parsing II - beginwork process
  5. Tableau linéaire de la structure des données (dessin à la main)
  6. In 2022, what are the highlights and popular elements in skirts to make skirts more elegant and gentle?
  7. JQuery installation
  8. Exemple de développement Android, dernière compilation de questions d'entrevue Android
  9. Differences and relations between JDK, JRE and JVM, nginx architecture diagram
  10. 【Azure 云服务】Azure Cloud Service 为 Web Role(IIS Host)增加自定义字段 (把HTTP Request Header中的User-Agent字段增加到IIS输出日志中)
  11. 【Azure 云服务】Azure Cloud Service 为 Web Role(IIS Host)增加自定义字段 (把HTTP Request Header中的User-Agent字段增加到IIS输出日志中)
  12. Questions d'entrevue pour les ingénieurs en développement Android, Android Foundation 72 questions
  13. It's kind of Cadillac CT6 to have a Mercedes Benz S-class captain and a 10At entry-level configuration, falling to less than 300000
  14. H6 meets the strong enemy again! The car body has a Cayenne visual sense, breaking 8.8 seconds, and the top configuration is less than 130000
  15. How nginx supports HTTPS and Linux kernel video tutorial
  16. Le martyr se réjouit de sa vieillesse Audi R8 V10 performance Rwd
  17. import 方式隨意互轉,感受 babel 插件的威力
  18. Le mode d'importation peut se déplacer librement pour sentir la puissance du plug - in Babel
  19. Pas de héros en termes de ventes!Du point de vue de la force du produit, la nouvelle version ax7 Mach est plus forte que H6
  20. The vue3 + TS project introduces vant as needed
  21. 深入浅出虚拟 DOM 和 Diff 算法,及 Vue2 与 Vue3 中的区别
  22. 深入淺出虛擬 DOM 和 Diff 算法,及 Vue2 與 Vue3 中的區別
  23. Explorer les algorithmes DOM et diff virtuels et les différences entre vue2 et vue3
  24. 两万字Vue基础知识总结,小白零基础入门,跟着路线走,不迷路(建议收藏)
  25. Résumé des connaissances de base de 20 000 mots vue, Introduction à la petite base blanche zéro, suivre la route et ne pas se perdre (Collection recommandée)
  26. 兩萬字Vue基礎知識總結,小白零基礎入門,跟著路線走,不迷路(建議收藏)
  27. "Talk show conference 4" Zhou qimo a remporté le championnat. Tout le monde l'admire. Il est mature et stable et a une vue d'ensemble
  28. Test logiciel entrevue non technique questions classiques - mise à jour continue!
  29. Digital forward disassembly reverse disassembly
  30. Analyse du cache distribué redis et essence de l'entrevue en usine v6.2.6
  31. [Hadoop 3. X series] use of HDFS rest HTTP API (II) httpfs
  32. Zhang Daxian sang in the morning to bless the motherland, xYG team: singing is much better than us
  33. My three years' experience -- avoiding endless internal friction
  34. Introduction à l'algorithme "dénombrement binaire" modéré 01 - - question d'entrevue leetcode 10.09. Recherche de matrice de tri
  35. Introduction à l'algorithme simple 06 - - leetcode 34. Trouver la première et la dernière position d'un élément dans un tableau de tri
  36. CSS animation
  37. Explain the new tags in HTML5 and the pseudo classes and pseudo elements in CSS3
  38. They are all talking about "serverless first", but do you really understand serverless?
  39. [apprentissage de l'algorithme] 1486. Fonctionnement exclusif du tableau (Java / C / C + + / python / go / Rust)
  40. Front and back end data interaction (VI) -- advantages, disadvantages and comparison of Ajax, fetch and Axios
  41. Front and back end data interaction (V) -- what is Axios?
  42. Front and back end data interaction (III) -- Ajax encapsulation and call
  43. 前端 100 万行代码是怎样的体验?
  44. 湖中剑 前端周刊 #10(ESLint8、Web 端侧 AI、react-if)
  45. 湖中劍 前端周刊 #10(ESLint8、Web 端側 AI、react-if)
  46. 前端 100 萬行代碼是怎樣的體驗?
  47. Huzhong Sword Front End Weekly # 10 (eslint8, Web end ai, React if)
  48. Quelle est l'expérience du premier million de lignes de code?
  49. Pancakeswap front-end source compilation and deployment Linux
  50. Pancakeswap front-end source compilation - Windows
  51. Walls and columns are powered, and 50W transmission power is available in any corner. The University of Tokyo has built a wireless charging house
  52. Pas besoin d'embrayage pour allumer une voiture?Vieux conducteur: la voiture est très blessée par des erreurs. Ces mauvaises habitudes doivent être changées!
  53. Cadre de développement Android MVP, résumé de l'entrevue
  54. [Azure Cloud Service] Azure Cloud Service ajoute des champs personnalisés pour le rôle Web (hôte IIS) (ajoute le champ user agent dans l'en - tête de demande http au Journal de sortie IIS)
  55. Principes de la plate - forme de développement Android, questions d'entrevue de développement Android
  56. [Azure Cloud Service] Azure Cloud Service ajoute des champs personnalisés pour le rôle Web (hôte IIS) (ajoute le champ user agent dans l'en - tête de demande http au Journal de sortie IIS)
  57. Weilai es8 was listed in Norway and SAIC's driverless concept car appeared at the World Expo
  58. One of the most high-frequency algorithm problems in the front end! Reverse linked list
  59. Échange de doigts d'épée 11. Nombre minimum de tableaux rotatifs
  60. Questions et réponses à l'entrevue Big Data (réimprimé)