Socket.IO 配置、房间、事件

本文介绍了Socket.IO的配置选项,包括心跳间隔、日志级别等,并解释了如何根据不同环境调整配置。此外还探讨了如何利用房间功能进行广播通信及事件处理。

一、配置

Socket.IO提供了4个配置的API:io.configure, io.set, io.enable, io.disable。其中io.set对单项进行设置,io.enable和io.disable用于单项设置布尔型的配置。io.configure可以让你对不同的生产环境(如devlopment,test等等)配置不同的参数。

以下定义了development和release两种环境下Socket.IO的不同配置:

var io =require('socket.io').listen(80);
io.set('heartbeat interval', 20);
io.set('heartbeat timeout', 25);
io.configure('production', function () {
    io.enable('browser client etag');
    io.set('log level', 0);
    io.set('transports', ['websocket', 'jsonp-polling', 'xhr-polling', 'htmlfile']);
});

io.configure('development', function () {
    io.set('transports', ['websocket', 'jsonp-polling', 'xhr-polling', 'htmlfile']);
});

常用配置:

transports(默认['websocket', 'htmlfile', 'xhr-polling', 'jsonp-polling']):一个包含通信方法类型的数组。Socket.IO支持多种实现在线即时通信的方式,如websocket、polling等等,该配置能让你自行选择备用的通信方式。
log level(默认3):日志输出的最低级别,0为error,1为warn,2为info,3为debug,默认即输出所有类型的日志。
heartbeat interval(默认25秒):心跳包发送间隔,客户端需要在此时间段之内向服务器发送一个心跳包才能保持通信。

二、房间

房间是Socket.IO提供的一个非常好用的功能。房间相当于为指定的一些客户端提供了一个命名空间,所有在房间里的广播和通信都不会影响到房间以外的客户端。

socket.join('room name')可用于客户端进入房间,socket.leave('room name')用于离开房间。当客户端进入一个房间之后,可以通过以下两种方式在房间里广播消息:

//1. 向my room广播一个事件,提交者会被排除在外(即不会收到消息)
io.sockets.on('connection',function(socket){//注意:和下面对比,这里是从客户端的角度来提交事件
socket.broadcast.to('my room').emit('event_name', data);}//2. 向another room广播一个事件,在此房间所有客户端都会收到消息//注意:和上面对比,这里是从服务器的角度来提交事件
io.sockets.in('another room').emit('event_name', data);//向所有客户端广播
io.sockets.emit('event_name', data);

除了向房间广播消息之外,还可以通过以下API来获取房间的信息。

//获取所有房间的信息//key为房间名,value为房间名对应的socket ID数组
io.sockets.manager.rooms

//获取particular room中的客户端,返回所有在此房间的socket实例
io.sockets.clients('particular room')//通过socket.id来获取此socket进入的房间信息

三、事件

Socket.IO内置了一些默认事件,我们在设计事件的时候应该避开默认的事件名称,并灵活运用这些默认事件。

服务器端事件:

io.sockets.on('connection', function(socket) {}):socket连接成功之后触发,用于初始化
socket.on('message', function(message, callback) {}):客户端通过socket.send来传送消息时触发此事件,message为传输的消息,callback是收到消息后要执行的回调
socket.on('anything', function(data) {}):收到任何事件时触发
socket.on('disconnect', function() {}):socket失去连接时触发(包括关闭浏览器,主动断开,掉线等任何断开连接的情况)

客户端事件:

connect:连接成功
connecting:正在连接
disconnect:断开连接
connect_failed:连接失败
error:错误发生,并且无法被其他事件类型所处理
message:同服务器端message事件
anything:同服务器端anything事件
reconnect_failed:重连失败
reconnect:成功重连
reconnecting:正在重连

在这里要提下客户端socket发起连接时的顺序。当第一次连接时,事件触发顺序为:connecting->connect;当失去连接时,事件触发顺序为:disconnect->reconnecting(可能进行多次)->connecting->reconnect->connect。

在 Java Spring 项目中集成 Socket.IO 并使用 Netty-SocketIO 库实现 WebSocket 功能,可以通过以下步骤完成配置和测试。Apifox 是一个支持 WebSocket 测试的 API 工具,因此可以用于连接并验证后端服务。 ### ### 添加 Maven 依赖 首先,在 `pom.xml` 文件中添加 Netty-SocketIO 的依赖项: ```xml <dependency> <groupId>com.corundumstudio.socketio</groupId> <artifactId>netty-socketio</artifactId> <version>2.0.6</version> </dependency> ``` 该库基于 Netty 实现了与 socket.io 客户端兼容的服务端功能,并支持命名空间、房间、SSL 加密等特性 [^4]。 ### ### 配置 Socket.IO 服务器 接下来,需要在 Spring Boot 中创建一个配置类来初始化 Socket.IO 服务器实例。以下是一个基础配置示例: ```java import com.corundumstudio.socketio.Configuration; import com.corundumstudio.socketio.SocketIOServer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class SocketIoConfig { @Bean public SocketIOServer socketIOServer() { Configuration config = new Configuration(); config.setHostname("localhost"); config.setPort(8080); // 设置监听端口 config.setTransports("websocket"); // 可选:仅允许 WebSocket 连接 return new SocketIOServer(config); } } ``` 此配置定义了一个监听在 `localhost:8080` 的 Socket.IO 服务器,并指定传输方式为 WebSocket [^1]。 ### ### 创建事件处理器 为了响应客户端发送的消息,需注册事件监听器。例如,可以在 Spring 启动时启动 Socket.IO 服务器并绑定事件处理逻辑: ```java import com.corundumstudio.socketio.SocketIOServer; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; @Component public class SocketIoServerRunner { @Autowired private SocketIOServer server; @PostConstruct public void start() { server.addConnectListener(socket -> System.out.println("Client connected")); server.addEventListener("message", String.class, (socket, data, ackSender) -> { System.out.println("Received message: " + data); socket.sendEvent("response", "Echo: " + data); }); server.start(); } @PreDestroy public void stop() { if (server != null && !server.isStopped()) { server.stop(); } } } ``` 上述代码展示了如何监听连接事件以及接收和响应消息事件 [^1]。 ### ### 前端连接测试(使用 Apifox) 在完成 Java 后端的配置后,可通过 Apifox 进行 WebSocket 连接测试。打开 Apifox 并按照以下步骤操作: 1. 新建接口,选择“WebSocket”作为协议。 2. 在 URL 输入框中输入:`ws://localhost:8080/socket.io/?EIO=3&transport=websocket`。 3. 发送连接请求,等待连接成功提示。 4. 使用 Apifox 提供的界面发送 `message` 事件,并查看是否收到服务器返回的 `response` 消息。 如果一切正常,应能看到服务器返回的回显信息 [^3]。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值