架构设计
- 初始化部分:
- 在项目初始化时,分别初始化WebSocket和Socket.IO实例。对于WebSocket,可以使用iOS原生的
NSURLSessionWebSocketTask
来实现,而Socket.IO可以使用第三方库如Socket.IO-Client-Swift
(虽然是Swift库,但Objective - C项目也可通过桥接使用)。
- 创建一个管理类,例如
NetworkManager
,用于统一管理这两个实例,并对外提供统一的接口,如发送消息、接收消息等。
- 消息发送:
- 在
NetworkManager
中,提供一个sendMessage:
方法。根据当前网络状态和配置,决定使用WebSocket还是Socket.IO发送消息。例如,可以在NetworkManager
中设置一个isUsingSocketIO
的布尔属性,根据业务需求进行切换。
- 对于WebSocket发送消息,代码示例如下:
NSURL *url = [NSURL URLWithString:@"ws://your - server - url"];
NSURLSessionWebSocketTask *webSocketTask = [[NSURLSession sharedSession] webSocketTaskWithURL:url];
[webSocketTask resume];
NSString *message = @"Hello, WebSocket!";
[webSocketTask sendMessageWithString:message completionHandler:^(NSError * _Nullable error) {
if (error) {
NSLog(@"WebSocket send error: %@", error);
}
}];
- 对于Socket.IO发送消息,假设已桥接
Socket.IO - Client - Swift
库,代码示例如下:
#import "SocketIOClient.h"
SocketIOClient *socket = [SocketIOClient socketWithURL:[NSURL URLWithString:@"http://your - server - url"]];
[socket connect];
[socket emit:@"message" with:@[@"Hello, Socket.IO!"]];
- 消息接收:
- 对于WebSocket,在
NetworkManager
中设置一个接收闭包属性,例如receiveWebSocketMessageBlock
。在WebSocket连接成功后,开始接收消息:
[webSocketTask receiveMessageWithCompletionHandler:^(NSURLSessionWebSocketTaskMessage * _Nonnull message, NSError * _Nullable error) {
if (error) {
NSLog(@"WebSocket receive error: %@", error);
} else {
if (self.receiveWebSocketMessageBlock) {
self.receiveWebSocketMessageBlock(message);
}
}
}];
- 对于Socket.IO,同样在
NetworkManager
中设置接收闭包属性,例如receiveSocketIOMessageBlock
。并监听Socket.IO的消息事件:
[socket on:@"message" callback:^(NSArray<id> * _Nonnull data, SocketAckEmitter * _Nonnull ack) {
if (self.receiveSocketIOMessageBlock) {
self.receiveSocketIOMessageBlock(data);
}
}];
场景切换
- 网络稳定场景:
- 在网络稳定的情况下,优先使用WebSocket以获取高性能。可以通过网络监测工具(如
Reachability
)来判断网络状态。当检测到网络连接良好且稳定时,将NetworkManager
中的isUsingSocketIO
属性设为NO
,此时发送和接收消息都使用WebSocket。
- 网络不稳定场景:
- 当网络出现波动或连接中断时,切换到Socket.IO。在检测到网络问题后,将
isUsingSocketIO
属性设为YES
。Socket.IO的自动重连机制会尝试重新连接服务器,保证数据传输的连续性。
- 跨域场景:
- 如果项目需要跨域访问,且原生WebSocket的跨域配置较为复杂时,直接使用Socket.IO。Socket.IO在设计上对跨域有较好的支持,可避免繁琐的跨域配置。
数据一致性和应用稳定性保证
- 数据一致性:
- 在
NetworkManager
中,无论使用WebSocket还是Socket.IO,对发送和接收的数据进行统一的格式处理。例如,将所有数据序列化为JSON格式,这样在不同传输方式间切换时,数据格式保持一致。
- 对于重要数据,可以在发送端添加序列号,接收端根据序列号来判断数据是否完整和有序。如果发现数据缺失或顺序错误,通过重传机制来保证数据一致性。
- 应用稳定性:
- 在网络切换时,确保平滑过渡。例如,在从WebSocket切换到Socket.IO时,先暂停WebSocket的消息发送和接收,关闭连接,然后再启动Socket.IO连接并重新发送未发送成功的消息。
- 对WebSocket和Socket.IO的连接状态进行实时监控。如果连接出现异常(如断开连接、连接超时等),及时进行处理,如显示提示信息给用户,并尝试重新连接。
- 采用错误处理机制,对WebSocket和Socket.IO操作过程中可能出现的错误(如网络错误、协议错误等)进行捕获和处理,避免应用崩溃。例如,在接收消息的闭包中捕获错误,并根据错误类型进行相应处理,如重新连接或提示用户网络异常。