go-socket.io 使用教程

1、socket.io 简介

[译] socket.io官方文档

Socket.io是一个WebSocket库,包括了客户端的js和服务器端的nodejs,它的目标是构建可以在不同浏览器和移动设备上使用的实时应用。它会自动根据浏览器从WebSocket、AJAX长轮询、Iframe流等等各种方式中选择最佳的方式来实现网络实时应用,非常方便和人性化,而且支持的浏览器最低达IE5.5

socket.io特点
实时分析:将数据推送到客户端,这些客户端会被表示为实时计数器,图表或日志客户。
实时通信和聊天:只需几行代码便可写成一个Socket.IO的”Hello,World”聊天应用。
二进制流传输:从1.0版本开始,Socket.IO支持任何形式的二进制文件传输,例如:图片,视频,音频等。
文档合并:允许多个用户同时编辑一个文档,并且能够看到每个用户做出的修改。

2、golang实现socket.io

引用库:github.com/googollee/go-socket.io@v1.6.0

  1. 使用http 解决乱问题(使用其他可以忽略)
    http.HandleFunc("/socket.io/", func(w http.ResponseWriter, r *http.Request) {
        origin := r.Header.Get("Origin")
        log.Println("origin", origin)
        w.Header().Set("Access-Control-Allow-Origin", origin)
        w.Header().Set("Access-Control-Allow-Credentials", "true")

        server.ServeHTTP(w, r)
    })
  1. 此教程采用gin Server端
  router := gin.New()
    log.SetFlags(log.Lshortfile | log.LstdFlags)
    server := socketio.NewServer(nil)
    // redis 适配器
    ok, err := server.Adapter(&socketio.RedisAdapterOptions{
        Addr:    "127.0.0.1:6379",
        Prefix:  "socket.io",
        Network: "tcp",
    })

    fmt.Println("redis:", ok)

    if err != nil {
        log.Fatal("error:", err)
    }

    // 连接成功
    server.OnConnect("/", func(s socketio.Conn) error {
        s.SetContext("")
        // 申请一个房间
        s.Join("bcast")
        fmt.Println("连接成功:", s.ID())
        return nil
    })
    // 接收”bye“事件
    server.OnEvent("/", "bye", func(s socketio.Conn, msg string) string {
        last := s.Context().(string)
        s.Emit("bye", msg)
        fmt.Println("============>", last)
        //s.Close()
        return last
    })
    
    server.OnEvent("/chat", "msg", func(s socketio.Conn, msg string) string {
        s.SetContext(msg)
        fmt.Println("=====chat====>", msg)
        return "recv " + msg
    })
    // 连接错误
    server.OnError("/", func(s socketio.Conn, e error) {
        log.Println("连接错误:", e)

    })
    // 关闭连接
    server.OnDisconnect("/", func(s socketio.Conn, reason string) {
        log.Println("关闭连接:", reason)
    })

    go server.Serve()
    defer server.Close()

    router.Use(gin.Recovery(), Cors())
    router.GET("/socket.io/*any", gin.WrapH(server))
    router.POST("/socket.io/*any", gin.WrapH(server))
    router.StaticFS("/public", http.Dir("../asset"))

    log.Println("Serving at localhost:8000...")
    if err := router.Run(":8000"); err != nil {
        log.Fatal("failed run app: ", err)

    }
  1. web端

<html lang="cn">
  <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <meta http-equiv="X-UA-Compatible" content="ie=edge">
      <title>WebSocket</title>
      <script type="text/javascript" src="socket.io.js"></script>
  </head>
  <body>
      <h1> socket.io 消息发送测试</h1>
      <input id="sendTxt" type="text"/>
      <button id="sendBtn">发送</button>
      <div id="recv"></div>
      <script type="text/javascript">
         
         var socket = io("ws://127.0.0.1:8000/");
         var s2 = io("ws://127.0.0.1:8000/chat");

          //把接收的数据显示到界面
          function showMessage(str,type){
              var div = document.createElement('div');
              div.innerHTML = str;
              if(type == "enter"){
                  div.style.color = 'blue';
              }else if(type == "leave"){
                  div.style.color = "red"
              }
              document.body.appendChild(div)
          }
   
          // 点击之后发送
          document.getElementById("sendBtn").onclick = function(){
              var txt = document.getElementById("sendTxt").value;
              if(txt){   // 文本不为空发送
                  socket.emit('bye',txt);
                  s2.emit("msg","chat-->"+txt)
              }
          }
         // 连接成功
         socket.on('connect', function(socket){
             showMessage("连接成功",'leave')
             // socket.join('RealTimeDataRoom');
         });
         // 连接失败
         socket.on('disconnect', function(socket){
             showMessage("连接失败",'leave')
         });
         socket.on('error', function(socket){
             showMessage("连接错误",'leave')
         });
          socket.on('bye',function(data){
              console.log("--------reply--------->",data);
              showMessage(data,'enter')
          })
      </script>
  </body>
  </html>
  1. 源码

csdn源码连接
码云地址

  1. 测试截图
    在这里插入图片描述
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
好的,我知道你的问题了。首先,使用beego框架和go-socket.io搭建聊天室需要以下步骤: 1. 安装beego和go-socket.io ```shell go get github.com/astaxie/beego go get github.com/googollee/go-socket.io ``` 2. 创建beego项目 ```shell bee new chatroom cd chatroom ``` 3. 在main.go中引入go-socket.io的包并创建socket.io服务器 ```go package main import ( "github.com/astaxie/beego" "github.com/googollee/go-socket.io" ) func main() { server, err := socketio.NewServer(nil) if err != nil { beego.Error("Socket.IO server creation failed: ", err) return } // TODO: 后续代码 } ``` 4. 添加路由 ```go server.On("connection", func(so socketio.Socket) { beego.Info("New user connected.") // 处理用户连接事件 so.On("chat", func(msg string) { beego.Info("Message received: ", msg) // TODO: 处理消息 }) // 处理用户断开连接事件 so.On("disconnection", func() { beego.Info("User disconnected.") }) }) // 处理根路由 beego.Router("/", &controllers.MainController{}) // 处理socket.io路由 beego.Handler("/socket.io/", server) beego.Handler("/socket.io.js", http.FileServer(http.Dir("./node_modules/socket.io-client/dist/")).ServeHTTP) ``` 5. 在前端页面上添加socket.io客户端代码 ```html <script src="/socket.io.js"></script> <script> var socket = io.connect('http://localhost:8080'); socket.on('connect', function () { console.log('Connected to server.'); }); socket.on('chat', function (message) { console.log('Message received: ' + message); }); socket.on('disconnect', function () { console.log('Disconnected from server.'); }); </script> ``` 6. 处理聊天消息 ```go server.On("connection", func(so socketio.Socket) { beego.Info("New user connected.") // 处理用户连接事件 so.On("chat", func(msg string) { beego.Info("Message received: ", msg) // 广播消息给所有用户 server.BroadcastToAll("chat", msg) }) // 处理用户断开连接事件 so.On("disconnection", func() { beego.Info("User disconnected.") }) }) ``` 这样,你就可以使用beego框架和go-socket.io搭建一个简单的聊天室了。当然,以上代码只是一个简单的示例,你可以根据具体需求进行修改和扩展。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值