golang实时应用框架socket.io库插件go-socket.io的使用

golang实时应用框架socket.io库插件go-socket.io的使用

警告

此仓库已归档。请查看fork版本

go-socket.io介绍

go-socket.io是Golang中Socket.IO库的实现,它是一个实时应用框架。当前该库支持Socket.IO客户端1.4版本,目前支持房间、命名空间和广播功能。

安装

使用以下命令安装包:

go get github.com/googollee/go-socket.io

导入方式:

import "github.com/googollee/go-socket.io"

在代码中使用socketio作为包名。

示例代码

下面是一个完整的go-socket.io使用示例:

package main

import (
	"log"
	"net/http"

	socketio "github.com/googollee/go-socket.io"
)

func main() {
	// 创建Socket.IO服务器
	server, err := socketio.NewServer(nil)
	if err != nil {
		log.Fatal(err)
	}

	// 处理连接事件
	server.OnConnect("/", func(s socketio.Conn) error {
		log.Println("connected:", s.ID())
		return nil
	})

	// 处理自定义事件
	server.OnEvent("/", "notice", func(s socketio.Conn, msg string) {
		log.Println("notice:", msg)
		s.Emit("reply", "have "+msg)
	})

	// 处理错误事件
	server.OnError("/", func(s socketio.Conn, e error) {
		log.Println("meet error:", e)
	})

	// 处理断开连接事件
	server.OnDisconnect("/", func(s socketio.Conn, reason string) {
		log.Println("closed", reason)
	})

	// 启动HTTP服务器
	go server.Serve()
	defer server.Close()

	http.Handle("/socket.io/", server)
	http.Handle("/", http.FileServer(http.Dir("./asset")))

	log.Println("Serving at localhost:8000...")
	log.Fatal(http.ListenAndServe(":8000", nil))
}

常见问题

关于此仓库的一些常见问题:

  • 此库是否支持socket.io版本2?

    • 不支持,但如果您愿意,可以帮助实现。加入我们的社区聊天Telegram
  • 如何将go-socket.io与CORS一起使用?

    • 请查看项目中的示例

社区

Telegram聊天: @go_socketio

Engineio

此项目包含一个名为engineio的子包。它包含原始node包的engine.io模拟实现。它可以不依赖socket.io实现单独使用。

许可证

3-clause BSD许可证


更多关于golang实时应用框架socket.io库插件go-socket.io的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang实时应用框架socket.io库插件go-socket.io的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Go-Socket.IO 使用指南

Go-Socket.IO 是一个用于 Golang 的 Socket.IO 库实现,允许开发者构建实时应用程序。下面我将详细介绍如何使用这个库。

安装

首先安装 go-socket.io 库:

go get github.com/googollee/go-socket.io

基本服务器示例

package main

import (
	"log"
	"net/http"

	socketio "github.com/googollee/go-socket.io"
)

func main() {
	// 创建Socket.IO服务器
	server := socketio.NewServer(nil)

	// 处理连接事件
	server.OnConnect("/", func(conn socketio.Conn) error {
		log.Println("connected:", conn.ID())
		conn.Join("room1") // 加入房间
		return nil
	})

	// 处理自定义事件
	server.OnEvent("/", "notice", func(conn socketio.Conn, msg string) {
		log.Println("notice:", msg)
		conn.Emit("reply", "have "+msg)
	})

	// 处理错误事件
	server.OnError("/", func(conn socketio.Conn, err error) {
		log.Println("error:", err)
	})

	// 处理断开连接事件
	server.OnDisconnect("/", func(conn socketio.Conn, reason string) {
		log.Println("closed:", reason)
	})

	// 设置HTTP路由
	go server.Serve()
	defer server.Close()

	http.Handle("/socket.io/", server)
	http.Handle("/", http.FileServer(http.Dir("./asset")))

	log.Println("Serving at localhost:8000...")
	log.Fatal(http.ListenAndServe(":8000", nil))
}

客户端连接示例

HTML客户端代码 (可以放在asset目录下):

<!DOCTYPE html>
<html>
<head>
    <title>Socket.IO Client</title>
    <script src="https://cdn.socket.io/4.5.0/socket.io.min.js"></script>
</head>
<body>
    <script>
        const socket = io('http://localhost:8000', {
            path: '/socket.io/'
        });
        
        socket.on('connect', () => {
            console.log('Connected to server');
            socket.emit('notice', 'hello');
        });
        
        socket.on('reply', (data) => {
            console.log('Received reply:', data);
        });
        
        socket.on('disconnect', () => {
            console.log('Disconnected from server');
        });
    </script>
</body>
</html>

进阶功能

1. 房间管理

// 加入房间
server.OnEvent("/", "join", func(conn socketio.Conn, room string) {
    conn.Join(room)
    conn.Emit("joined", "You joined "+room)
})

// 向房间广播消息
server.OnEvent("/", "room message", func(conn socketio.Conn, room string, msg string) {
    server.BroadcastToRoom("/", room, "room message", msg)
})

2. 命名空间

// 创建命名空间
nsp := server.Of("/admin")

nsp.OnConnect(func(conn socketio.Conn) error {
    log.Println("Admin connected:", conn.ID())
    return nil
})

nsp.OnEvent("admin message", func(conn socketio.Conn, msg string) {
    log.Println("Admin message:", msg)
})

3. 中间件

// 添加连接中间件
server.OnConnect("/", func(conn socketio.Conn) error {
    // 检查认证
    token := conn.URL().Query().Get("token")
    if token != "secret" {
        return errors.New("authentication failed")
    }
    return nil
})

性能优化

  1. 使用适配器:对于分布式部署,可以使用Redis适配器
import "github.com/googollee/go-socket.io/redis"

// 创建Redis适配器
adapter, err := redis.NewAdapter("redis://localhost:6379")
if err != nil {
    log.Fatal(err)
}

server.SetAdapter(adapter)
  1. 配置选项
server, err := socketio.NewServer(nil, socketio.WithPingInterval(1*time.Second),
    socketio.WithPingTimeout(500*time.Millisecond),
    socketio.WithMaxPayload(1e6)) // 1MB
if err != nil {
    log.Fatal(err)
}

常见问题解决

  1. 跨域问题:可以在创建服务器时配置
server, err := socketio.NewServer(nil, socketio.WithCors(&cors.Options{
    AllowedOrigins:   []string{"http://localhost:3000"},
    AllowCredentials: true,
}))
  1. 连接断开处理:确保正确处理断开连接
server.OnDisconnect("/", func(conn socketio.Conn, reason string) {
    log.Println("Client disconnected:", conn.ID(), reason)
    // 清理资源
})

Go-Socket.IO 提供了构建实时应用程序的强大功能,通过合理使用事件、房间和命名空间,可以构建复杂的实时交互系统。

回到顶部