午夜视频免费看_日韩三级电影网站_国产精品久久一级_亚洲一级在线播放_人妻体内射精一区二区三区_91夜夜揉人人捏人人添红杏_91福利在线导航_国产又粗又猛又黄又爽无遮挡_欧美日韩一区在线播放_中文字幕一区二区三区四区不卡 _日日夜夜精品视频免费观看_欧美韩日一区二区三区

主頁 > 知識庫 > golang websocket 服務(wù)端的實(shí)現(xiàn)

golang websocket 服務(wù)端的實(shí)現(xiàn)

熱門標(biāo)簽:學(xué)海導(dǎo)航地圖標(biāo)注 南通如皋申請開通400電話 高德地圖標(biāo)注口訣 地圖標(biāo)注的汽車標(biāo) 中國地圖標(biāo)注省會高清 浙江高速公路地圖標(biāo)注 廣州呼叫中心外呼系統(tǒng) 江西轉(zhuǎn)化率高的羿智云外呼系統(tǒng) 西部云谷一期地圖標(biāo)注

創(chuàng)建一個websocket的服務(wù)端

package smile

import (
  "errors"
  "log"
  "net/http"
  "sync"
  "time"

  "github.com/gorilla/websocket"
)

const (
  // 允許等待的寫入時間
  writeWait = 10 * time.Second

  // Time allowed to read the next pong message from the peer.
  pongWait = 60 * time.Second

  // Send pings to peer with this period. Must be less than pongWait.
  pingPeriod = (pongWait * 9) / 10

  // Maximum message size allowed from peer.
  maxMessageSize = 512
)

// 最大的連接ID,每次連接都加1 處理
var maxConnId int64

// 客戶端讀寫消息
type wsMessage struct {
  // websocket.TextMessage 消息類型
  messageType int
  data    []byte
}

// ws 的所有連接
// 用于廣播
var wsConnAll map[int64]*wsConnection

var upgrader = websocket.Upgrader{
  ReadBufferSize: 1024,
  WriteBufferSize: 1024,
  // 允許所有的CORS 跨域請求,正式環(huán)境可以關(guān)閉
  CheckOrigin: func(r *http.Request) bool {
    return true
  },
}

// 客戶端連接
type wsConnection struct {
  wsSocket *websocket.Conn // 底層websocket
  inChan  chan *wsMessage // 讀隊列
  outChan chan *wsMessage // 寫隊列

  mutex   sync.Mutex // 避免重復(fù)關(guān)閉管道,加鎖處理
  isClosed bool
  closeChan chan byte // 關(guān)閉通知
  id    int64
}

func wsHandler(resp http.ResponseWriter, req *http.Request) {
  // 應(yīng)答客戶端告知升級連接為websocket
  wsSocket, err := upgrader.Upgrade(resp, req, nil)
  if err != nil {
    log.Println("升級為websocket失敗", err.Error())
    return
  }
  maxConnId++
  // TODO 如果要控制連接數(shù)可以計算,wsConnAll長度
  // 連接數(shù)保持一定數(shù)量,超過的部分不提供服務(wù)
  wsConn := wsConnection{
    wsSocket: wsSocket,
    inChan:  make(chan *wsMessage, 1000),
    outChan:  make(chan *wsMessage, 1000),
    closeChan: make(chan byte),
    isClosed: false,
    id:    maxConnId,
  }
  wsConnAll[maxConnId] = wsConn
  log.Println("當(dāng)前在線人數(shù)", len(wsConnAll))

  // 處理器,發(fā)送定時信息,避免意外關(guān)閉
  go wsConn.processLoop()
  // 讀協(xié)程
  go wsConn.wsReadLoop()
  // 寫協(xié)程
  go wsConn.wsWriteLoop()
}

// 處理隊列中的消息
func (wsConn *wsConnection) processLoop() {
  // 處理消息隊列中的消息
  // 獲取到消息隊列中的消息,處理完成后,發(fā)送消息給客戶端
  for {
    msg, err := wsConn.wsRead()
    if err != nil {
      log.Println("獲取消息出現(xiàn)錯誤", err.Error())
      break
    }
    log.Println("接收到消息", string(msg.data))
    // 修改以下內(nèi)容把客戶端傳遞的消息傳遞給處理程序
    err = wsConn.wsWrite(msg.messageType, msg.data)
    if err != nil {
      log.Println("發(fā)送消息給客戶端出現(xiàn)錯誤", err.Error())
      break
    }
  }
}

// 處理消息隊列中的消息
func (wsConn *wsConnection) wsReadLoop() {
  // 設(shè)置消息的最大長度
  wsConn.wsSocket.SetReadLimit(maxMessageSize)
  wsConn.wsSocket.SetReadDeadline(time.Now().Add(pongWait))
  for {
    // 讀一個message
    msgType, data, err := wsConn.wsSocket.ReadMessage()
    if err != nil {
      websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway, websocket.CloseAbnormalClosure)
      log.Println("消息讀取出現(xiàn)錯誤", err.Error())
      wsConn.close()
      return
    }
    req := wsMessage{
      msgType,
      data,
    }
    // 放入請求隊列,消息入棧
    select {
    case wsConn.inChan - req:
    case -wsConn.closeChan:
      return
    }
  }
}

// 發(fā)送消息給客戶端
func (wsConn *wsConnection) wsWriteLoop() {
  ticker := time.NewTicker(pingPeriod)
  defer func() {
    ticker.Stop()
  }()
  for {
    select {
    // 取一個應(yīng)答
    case msg := -wsConn.outChan:
      // 寫給websocket
      if err := wsConn.wsSocket.WriteMessage(msg.messageType, msg.data); err != nil {
        log.Println("發(fā)送消息給客戶端發(fā)生錯誤", err.Error())
        // 切斷服務(wù)
        wsConn.close()
        return
      }
    case -wsConn.closeChan:
      // 獲取到關(guān)閉通知
      return
    case -ticker.C:
      // 出現(xiàn)超時情況
      wsConn.wsSocket.SetWriteDeadline(time.Now().Add(writeWait))
      if err := wsConn.wsSocket.WriteMessage(websocket.PingMessage, nil); err != nil {
        return
      }
    }
  }
}

// 寫入消息到隊列中
func (wsConn *wsConnection) wsWrite(messageType int, data []byte) error {
  select {
  case wsConn.outChan - wsMessage{messageType, data}:
  case -wsConn.closeChan:
    return errors.New("連接已經(jīng)關(guān)閉")
  }
  return nil
}

// 讀取消息隊列中的消息
func (wsConn *wsConnection) wsRead() (*wsMessage, error) {
  select {
  case msg := -wsConn.inChan:
    // 獲取到消息隊列中的消息
    return msg, nil
  case -wsConn.closeChan:

  }
  return nil, errors.New("連接已經(jīng)關(guān)閉")
}

// 關(guān)閉連接
func (wsConn *wsConnection) close() {
  log.Println("關(guān)閉連接被調(diào)用了")
  wsConn.wsSocket.Close()
  wsConn.mutex.Lock()
  defer wsConn.mutex.Unlock()
  if wsConn.isClosed == false {
    wsConn.isClosed = true
    // 刪除這個連接的變量
    delete(wsConnAll, wsConn.id)
    close(wsConn.closeChan)
  }
}

// 啟動程序
func StartWebsocket(addrPort string) {
  wsConnAll = make(map[int64]*wsConnection)
  http.HandleFunc("/ws", wsHandler)
  http.ListenAndServe(addrPort, nil)
}

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • golang基于websocket實(shí)現(xiàn)的簡易聊天室程序
  • Golang使用WebSocket通信的實(shí)現(xiàn)
  • 一百行Golang代碼實(shí)現(xiàn)簡單并發(fā)聊天室
  • golang實(shí)現(xiàn)一個簡單的websocket聊天室功能

標(biāo)簽:貴州 常州 保定 德宏 曲靖 吐魯番 許昌 東營

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《golang websocket 服務(wù)端的實(shí)現(xiàn)》,本文關(guān)鍵詞  golang,websocket,服務(wù),端,的,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《golang websocket 服務(wù)端的實(shí)現(xiàn)》相關(guān)的同類信息!
  • 本頁收集關(guān)于golang websocket 服務(wù)端的實(shí)現(xiàn)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    国产伦精品一区二区三区视频孕妇| 日本高清久久久| 国产精品综合久久| 国产裸体写真av一区二区 | 中文字幕一区电影| 日韩一区二区三区四区视频| 777a∨成人精品桃花网| 在线视频日韩一区 | 亚欧视频在线观看| 日韩网站免费观看| 日韩男人的天堂| 美女黄色丝袜一区| 午夜婷婷在线观看| 久久999免费视频| 日本妇乱大交xxxxx| 亚洲天堂男人的天堂| 日韩欧美亚洲一区二区三区| 免费不卡欧美自拍视频| 无码久久精品国产亚洲av影片| 国内精品久久久久久久久| 国产麻豆91视频| 日韩美女激情视频| 热久久久久久久| 欧美一区少妇| 91网站在线播放| av免费观看大全| 黑丝美女久久久| 国产真实乱人偷精品人妻| 亚洲午夜精品视频| 成人一级免费视频| 91福利视频在线观看| 亚洲精品综合网| 国产精品久久久久久久小唯西川 | 亚洲国产综合av| 亚洲午夜av久久乱码| 无码人妻精品一区二区蜜桃百度| 国产精品宾馆在线精品酒店| 国产农村妇女毛片精品久久麻豆 | 亚洲专区第一页| 国产精品美女黄网| 欧美一区二区日韩| youjizz在线视频| 法国空姐在线观看免费| 在线视频国产日韩| 久久99国产精品免费| 91女神在线观看| 久久的精品视频| 99久久99久久综合| 一级特级黄色片| 国产精品女主播视频| 亚洲一级二级在线| 五月天综合在线| 欧美在线一区二区三区四区| 欧美中文字幕一二三区视频| 中文字幕黄色av| 草草草视频在线观看| 亚洲精品一二区| 国产情人综合久久777777| 97超碰在线资源| 国产在线精品播放| 亚洲福利一区二区三区| 久久精品国产成人av| 欧美一区二区综合| 亚洲人成网站在线播| 国产成人亚洲精品狼色在线| 国产伦精品一区二区三区88av| 91精品国产91久久久久久最新| 91亚洲精品久久久蜜桃| 亚洲自拍偷拍一区二区| 成人亲热视频网站| 欧美久久免费观看| 亚洲天堂aaa| 手机免费av片| 国产精品91久久久| 91福利精品第一导航| 黄色aaa毛片| 五月天丁香社区| 91久久国产综合久久蜜月精品| 欧美亚洲高清一区| 国产精品自拍三区| 九九精品在线观看视频| 国产成人艳妇aa视频在线| 日韩资源av在线| 亚洲地区一二三色| 青青青国产在线| 黄色在线视频网| 91中文字幕在线观看| 欧美久久免费观看| 成人手机在线视频| 337p粉嫩色噜噜噜大肥臀| 中文字幕av久久| 欧美激情xxxx| 狠狠干狠狠久久| 国产98色在线|日韩| 狠狠人妻久久久久久综合蜜桃| 蜜桃传媒一区二区| 日韩在线www| 在线亚洲欧美专区二区| 久久99蜜桃精品| 特级片在线观看| 北条麻妃av高潮尖叫在线观看| 国产日韩欧美在线看| 日韩一级黄色大片| 欧美国产视频在线| 亚洲精品久久久久avwww潮水| av黄色在线免费观看| 成人免费观看cn| 国产精品一二三在线| 日韩精品视频在线免费观看| 亚洲最新在线观看| 日本美女视频一区二区| 欧美日韩精品区| 亚洲天堂美女视频| 国产成人一区二区三区别| 91老司机在线| 久久久久久久香蕉网| 欧美tickling挠脚心丨vk| 一区二区三区高清不卡| 东方欧美亚洲色图在线| 丰满人妻一区二区三区免费视频| 毛茸茸free性熟hd| www.99热这里只有精品| 大波视频国产精品久久| 欧美片一区二区三区| 亚洲的天堂在线中文字幕| 亚洲成人777| 欧美激情一区在线观看| 精品影院一区二区久久久| 国产乱码精品一区二区三区精东| 加勒比婷婷色综合久久| 男人舔女人下部高潮全视频| 亚洲最大天堂网| 黄色片视频在线免费观看| 99视频在线| 成人精品视频久久久久| 国产经典一区二区| 欧美精品18videos性欧| 社区色欧美激情 | 亚洲欧美在线播放| 日韩理论片久久| 日韩精品免费综合视频在线播放| 91黄色小视频| 日本久久电影网| 色综合中文字幕| 欧美日韩亚洲国产一区| 亚洲 欧美综合在线网络| 亚洲精品ww久久久久久p站| 中文字幕一区二区在线播放| 日本一区二区视频在线观看| 国产午夜精品美女毛片视频| 97se亚洲国产综合自在线观| 成人晚上爱看视频| 欧美黄网站在线观看| 国产成人a亚洲精品| 欧美视频在线观看 亚洲欧| 欧美激情一二三区| 婷婷在线免费观看| 国语对白做受69按摩| xxxx日本免费| 国产精品无码午夜福利| 朝桐光av一区二区三区| 免费黄色在线视频| 丝袜制服一区二区三区| 91传媒久久久| 日本激情综合网| 91精品国产三级| 欧美老熟妇乱大交xxxxx| 欧美巨胸大乳hitomi| 日本a级片视频| 人人妻人人澡人人爽人人精品 | 在线观看国产91| 精品久久人人做人人爱| 2020国产精品久久精品美国| 欧美国产日本韩| 五月婷婷激情综合| 在线播放/欧美激情| 日韩成人中文字幕| 精品香蕉一区二区三区| 97在线视频观看| 98视频在线噜噜噜国产| 91免费在线观看网站| 青青草影院在线观看| 日本中文字幕精品—区二区| aaa一级黄色片| 亚洲色图 激情小说| 五月激情丁香网| 精品一二三四在线| 欧美国产日韩亚洲一区| 欧美日韩色一区| 亚洲天堂av在线免费观看| 欧美最猛性xxxxx免费| 日韩精品一线二线三线| 日韩精品你懂的| 69xx绿帽三人行| 午夜影院在线视频| 国产精品伦一区| 日韩欧美亚洲一二三区| 国产一区二区三区在线观看网站 | 亚洲激情六月丁香| 亚洲第一页中文字幕| 国产精品入口夜色视频大尺度| 色一情一乱一乱一区91| 无码国产精品一区二区免费式直播| 日本少妇裸体做爰| 国产精品一区2区| 精品美女久久久久久免费| 99久久综合国产精品| 婷婷六月综合亚洲| 久久色免费在线视频| 久久九九视频| 制服丝袜中文字幕第一页| 波多野在线播放| 少妇人妻偷人精品一区二区| 日本一区二区三级电影在线观看 | 成人做爰69片免费| 一二三四区在线| 国产精品麻豆一区二区| 在线丨暗呦小u女国产精品| 国产在线精品二区| 国产一级二级视频| 97人妻人人澡人人爽人人精品| 亚洲国产精品av| 亚洲美女av电影| 欧美精品一区二区三区四区五区| 日本人视频jizz页码69| 亚洲天堂手机版| 一区二区三区欧美激情| 神马国产精品影院av| 日本中文不卡| 曰本女人与公拘交酡| aaa国产一区| 精品伊人久久久久7777人| 欧美男同性恋视频网站| 高清国产在线一区| 成人性生交大片免费看无遮挡aⅴ| 精品中文字幕一区二区| 亚洲精品美女免费| 亚洲激情啪啪| 成人免费毛片男人用品| 一区二区三区中文字幕在线观看| 欧美日韩国产成人| 免费在线观看的毛片| 亚洲成人第一区| 欧美午夜影院一区| 欧美性色黄大片人与善| 91久久国产综合| 国产日本欧洲亚洲| 欧美综合激情网| 国产性猛交96| 97aⅴ精品视频一二三区| 综合欧美国产视频二区| 国产h视频在线播放| 日日夜夜一区二区| 精品欧美乱码久久久久久1区2区| 高清日韩一区| 欧美男生操女生| 日韩在线观看一区二区| 在线不卡免费av| 四虎免费在线观看视频| 亚洲专区第一页| 欧美变态tickling挠脚心| 日韩欧美第二区在线观看| 五月天中文字幕| 精品精品国产高清a毛片牛牛 | 国产午夜精品理论片| 亚洲电影一区二区三区| 亚洲国产欧美日韩| 中日韩av在线| 五月天婷婷综合| 最近2019中文字幕第三页视频 | 电影午夜精品一区二区三区| 依人在线免费视频| 五月婷婷深深爱| 亚洲人成网在线播放| 在线一区二区不卡| 91尤物视频在线观看| 久久中文字幕一区| 久久成人激情视频| 日韩欧美大尺度| 日韩精品一区在线视频| 国产在线精品不卡| 国产精品福利在线| 久久高清内射无套| 欧美伦理视频网站| 黄色av免费在线播放| 国产精品911| 国产欧美在线一区二区| 亚洲国产精品视频在线| 91国产精品电影| 影音先锋制服丝袜| 欧美一区二区成人6969| 性高潮免费视频| 日韩毛片在线免费观看| 久久久99爱| 国产在线播放一区三区四| 国产精品久久久久久久久久久久午夜片| 国产精品女同一区二区| 国内精品久久久久伊人av| 天堂网av手机版| www.久久撸.com| 91精品国产乱码在线观看| 精品视频中文字幕| 亚洲精品天堂网| 亚洲视频一区二区| 免费三片在线播放| 一区二区三区亚洲| 91免费在线看片| 亚洲欧美一区二区三区情侣bbw | 成人综合激情网| 亚洲图片小说在线| 99精品一区二区三区| 青青草免费在线视频观看| 国产午夜久久久久| 日韩av播放器| 欧美性69xxxx肥| 挪威xxxx性hd极品| 亚洲电影免费观看| 扒开jk护士狂揉免费| 日韩电影中文字幕一区| 永久免费看片直接| 日韩中文av在线| 亚洲伦理在线精品| 成人福利视频网| 国产乱一区二区| 吴梦梦av在线| 一区二区三区**美女毛片| av在线免费观看不卡| 日韩一区二区不卡| 国产成人无码精品亚洲| 国产精品va在线| 亚洲欧美丝袜中文综合| 日本午夜一区二区三区| 国产精品久久福利| 成人欧美精品一区二区| 亚洲国产免费av| 中文字幕 视频一区| 精品国产免费人成电影在线观...| 成人av网站在线观看免费| 日本在线观看a| 欧美va在线播放| 中文字幕人妻一区二区三区视频| 亚洲一区制服诱惑| 久久综合成人精品亚洲另类欧美| youjizzxxxx18| 亚洲大胆人体av| 性一交一乱一伧老太| 特级西西444| 欧美变态口味重另类| 91精品国产乱码久久久| 日韩精品电影网站| 欧美日韩国产黄| 久久精品视频7| 亚洲欧美日韩另类精品一区二区三区| 亚洲国产中文字幕在线视频综合 | 日韩av手机在线观看| 国产**成人网毛片九色 | 国产wwwxxx| 欧美另类videos| 精品久久久久久久人人人人传媒| 国产三级伦理片| 综合国产精品久久久| 欧美高清视频不卡网| 日本少妇xxxx动漫| 欧洲av一区| 91精品欧美久久久久久动漫| 蜜臀精品一区二区三区| 影音先锋欧美在线| 欧美电影精品一区二区| 无套内谢的新婚少妇国语播放| 小泽玛利亚视频在线观看| 欧美福利视频网站| 中文字幕免费不卡| 日本少妇激情视频| 久久久久久一区| 精品中文字幕久久久久久| 国产一区二区精品久久| 成年人看片网站| 成人国产精品日本在线| 精品欧美激情精品一区| 最近中文字幕免费观看| 国产av熟女一区二区三区| 欧美日韩ab片| 亚洲国产精品嫩草影院| 波多野结衣在线观看视频| 9色视频在线观看| 欧美精品免费在线| 亚洲在线观看免费| 亚洲精品一区二区口爆| 初高中福利视频网站| 亚洲尤物视频网| 日韩欧美国产高清| 秋霞成人午夜伦在线观看| 一区二区在线免费看| 亚洲最大成人在线| 欧美成人精精品一区二区频| 99久久婷婷国产综合精品电影| 国产无遮挡裸体免费视频| 777精品久无码人妻蜜桃| 久久久精品视频成人| 欧美日韩国产精品专区| 乱一区二区av| 久久久久亚洲av片无码下载蜜桃 | 欧美日韩和欧美的一区二区| 三级影片在线观看欧美日韩一区二区 | 69成人免费视频| 人妻巨大乳一二三区| 亚洲欧洲一二三| 国产精品网红直播| 一区二区国产精品视频| 五月激情六月综合|