日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

golang websocket conn.close关闭错误_Websockets 与在golang中的应用

發布時間:2023/12/15 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 golang websocket conn.close关闭错误_Websockets 与在golang中的应用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Network socket

Network socket或socket是一臺或多臺服務器中不同應用程序之間相互通信的接口.socket可以用于不同的網絡協議, 如HTTP, FTP等. 切不同的sockets可以同時存在.

Network sockets類型如下:

  • Datagram sockets(SOCK_DGRAM), 即無鏈接的sockets, 使用UDP協議(User Datagram Protocol).
  • Stream sockets(SOCK_STREAM), 即面向鏈接的sockets, 使用TCP協議(Transmission Control Protocol), SCTP協議(Stream Control Transmission Protocol), 或者DCCP協議(Datagram Congestion Control Protocol).
  • Raw sockets(or raw IP sockets)常見于路由和其他網絡設備. 應用程序中不常用.

socket通信

主機間的通信主要有TCP和UDP.

TCP Sockets

客戶端代碼

// init tcpAddr, err := net.ResolveTCPAddr(resolver, serverAddr) if err != nil {// handle error } conn, err := net.DialTCP(network, nil, tcpAddr) if err != nil {// handle error }// send message _, err = conn.Write({message}) if err != nil {// handle error }// receive message var buf [{buffSize}]byte _, err := conn.Read(buf[0:]) if err != nil {// handle error }

服務端代碼

// init tcpAddr, err := net.ResolveTCPAddr(resolver, serverAddr)if err != nil {// handle error}listener, err := net.ListenTCP("tcp", tcpAddr) if err != nil {// handle error }// listen for an incoming connection conn, err := listener.Accept() if err != nil {// handle error }// send message if _, err := conn.Write({message}); err != nil {// handle error } // receive message buf := make([]byte, 512) n, err := conn.Read(buf[0:]) if err != nil {// handle error }

UDP Socket

客戶端代碼

// init raddr, err := net.ResolveUDPAddr("udp", address) if err != nil {// handle error }conn, err := net.DialUDP("udp", nil, raddr) if err != nil {// handle error }....... // send message buffer := make([]byte, maxBufferSize) n, addr, err := conn.ReadFrom(buffer) if err != nil {// handle error }....... // receive message buffer := make([]byte, maxBufferSize) n, err = conn.WriteTo(buffer[:n], addr) if err != nil {// handle error }

服務端代碼

// init udpAddr, err := net.ResolveUDPAddr(resolver, serverAddr) if err != nil {// handle error }conn, err := net.ListenUDP("udp", udpAddr) if err != nil {// handle error }....... // send message buffer := make([]byte, maxBufferSize) n, addr, err := conn.ReadFromUDP(buffer) if err != nil {// handle error }....... // receive message buffer := make([]byte, maxBufferSize) n, err = conn.WriteToUDP(buffer[:n], addr) if err != nil {// handle error }

WebSocket

WebSocket是在單個TCP鏈接上建立可以雙向通信的渠道. 即不同于http(s), 客戶端需要發送請求(request)之后才能得到相應(Response). 客戶端可以發送消息, 也可以等待服務端的消息, 服務端也是如此. 更多WebSocket協議可以查看: RFC 6455 specification.

WebSocket客戶端請求:

GET /chat HTTP/1.1 Host: server.example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw== Sec-WebSocket-Protocol: chat, superchat Sec-WebSocket-Version: 13 Origin: http://example.com

服務端響應

HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk= Sec-WebSocket-Protocol: chat

用golang創建WebSocket

基于net/http類庫創建WebSocket

大致步驟如下:

  • 發起握手(websocket只需要一次握手)
  • 從客戶端接收數據包
  • 向客戶端發送數據包
  • 關閉握手
  • 具體查看原文: https://yalantis.com/blog/how-to-build-websockets-in-go/

    通過第三方類庫GOBWAS創建WebSocket

    go get github.com/gobwas/ws

    客戶端代碼

    // init // schema – can be ws or wss // host, port – ws server conn, _, _, err := ws.DefaultDialer.Dial(ctx, {schema}://{host}:{port}) if err != nil {// handle error }....... // send message err = wsutil.WriteClientMessage(conn, ws.OpText, {message}) if err != nil {// handle error }....... // receive message msg, _, err := wsutil.ReadServerData(conn) if err != nil {// handle error }

    服務器端代碼

    // init listener, err := net.Listen("tcp", op.Port) if err != nil {// handle error } conn, err := listener.Accept() if err != nil {// handle error } upgrader := ws.Upgrader{} if _, err = upgrader.Upgrade(conn); err != nil {// handle error }....... // receive message for { reader := wsutil.NewReader(conn, ws.StateServerSide)_, err := reader.NextFrame()if err != nil {// handle error}data, err := ioutil.ReadAll(reader)if err != nil {// handle error}....... } ....... // send message msg := "new server message" if err := wsutil.WriteServerText(conn, {message}); err != nil {// handle error }

    主流第三方Websocket類庫有:

    • http://golang.org/x/net/websocket
    • http://github.com/gorilla/websocket
    • http://github.com/gobwas/ws
    • http://github.com/sacOO7/gowebsocket

    (先告一段落,后續再修改)

    總結

    以上是生活随笔為你收集整理的golang websocket conn.close关闭错误_Websockets 与在golang中的应用的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。