什么是Socket.IO?
Socket.io是建立在 WebSocket 之上的一个实时应用程序框架。它封装了 WebSocket,并提供了更高级别的接口,
包括实时事件处理、自动重新连接、多房间支持等功能。Socket.IO 在客户端和服务器端分别有对应的库,简化了实时通信的开发。
go
package main
import (
"fmt"
"github.com/gin-gonic/gin"
socketio "github.com/googollee/go-socket.io"
"log"
"net/http"
"net/url"
"strings"
)
func main() {
router := gin.New()
server := socketio.NewServer(nil)
ok, err := server.Adapter(&socketio.RedisAdapterOptions{
Addr: "127.0.0.1:6379",
Prefix: "socket.io",
Network: "tcp",
})
if err != nil || !ok {
log.Fatal("socket-io adapter error:", err)
}
server.OnConnect("/", func(s socketio.Conn) error {
params, _ := url.ParseQuery(s.URL().RawQuery)
uid := params.Get("uid")
s.SetContext(uid)
s.Join("test")
log.Println("建立连接:", s.ID(), uid)
return nil
})
server.OnError("/", func(s socketio.Conn, e error) {
log.Println("连接错误:", s, e)
})
server.OnDisconnect("/", func(s socketio.Conn, reason string) {
s.LeaveAll()
if uid := s.Context(); uid != nil {
log.Printf("用户[%s]断开连接", uid)
}
log.Println("关闭连接:", s.ID(), reason)
})
server.OnEvent("/", "notice", func(s socketio.Conn, msg string) {
log.Println("notice收到内容::", msg)
s.Emit("notice", "have "+msg)
})
router.GET("/bcast", func(context *gin.Context) {
server.BroadcastToRoom("/", "test", "notice", "广播通知")
})
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.Static("/public", "./websocket")
if err := router.Run(":9100"); err != nil {
log.Fatal("failed run app: ", err)
}
}
func Cors() gin.HandlerFunc {
return func(c *gin.Context) {
method := c.Request.Method
origin := c.Request.Header.Get("Origin")
var headerKeys []string
for k, _ := range c.Request.Header {
headerKeys = append(headerKeys, k)
}
headerStr := strings.Join(headerKeys, ", ")
if headerStr != "" {
headerStr = fmt.Sprintf("access-control-allow-origin, access-control-allow-headers, %s", headerStr)
} else {
headerStr = "access-control-allow-origin, access-control-allow-headers"
}
if origin != "" {
c.Header("Access-Control-Allow-Origin", origin)
c.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE,UPDATE")
c.Header("Access-Control-Allow-Headers", "Authorization, Content-Length, X-CSRF-Token, Token,session,X_Requested_With,Accept, Origin, Host, Connection, Accept-Encoding, Accept-Language,DNT, X-CustomHeader, Keep-Alive, User-Agent, X-Requested-With, If-Modified-Since, Cache-Control, Content-Type, Pragma")
c.Header("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers,Cache-Control,Content-Language,Content-Type,Expires,Last-Modified,Pragma,FooBar")
c.Header("Access-Control-Max-Age", "172800")
c.Header("Access-Control-Allow-Credentials", "true")
c.Set("content-type", "application/json")
}
if method == "OPTIONS" {
c.JSON(http.StatusOK, "Options Request!")
}
c.Next()
}
}
建立websocket文件夹,并新建 index.html
<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 Client</h1>
<input id="sendTxt" type="text"/>
<button id="sendBtn">发送</button>
<div id="recv"></div>
<script type="text/javascript">
var socket = io("ws://192.168.252.128:9100?uid=zhangsan");
function showMessage(str){
var div = document.createElement('div');
div.innerHTML = str;
document.body.appendChild(div)
}
document.getElementById("sendBtn").onclick = function(){
var txt = document.getElementById("sendTxt").value;
if(txt){
socket.emit('notice',txt);
}
}
socket.on('connect', function(socket){
showMessage("连接成功")
});
socket.on('disconnect', function(socket){
showMessage("连接失败")
});
socket.on('error', function(socket){
showMessage("连接错误")
});
socket.on('notice',function(data){
console.log("receive server data",data);
showMessage(data)
})
</script>
</body>
</html>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具