面试题答案
一键面试确保消息可靠发送和接收的策略
- 消息确认机制:
- 在发送消息后,等待服务器的确认响应。当客户端发送一条消息给服务器时,服务器在成功接收并处理后,返回一个确认消息给客户端。客户端在收到确认消息后,标记该消息已成功发送。例如:
// 发送消息 [socket emit:@"message" with:@[@"Hello, Server!"]]; // 监听确认响应 [socket on:@"message_ack" callback:^(NSArray *args) { NSLog(@"Message successfully sent and acknowledged by server."); }];
- 消息队列:
- 客户端维护一个待发送消息的队列。当网络出现波动导致消息发送失败时,将消息重新加入队列。待网络恢复正常后,按顺序重新发送队列中的消息。可以使用
NSMutableArray
来实现简单的消息队列。例如:
NSMutableArray *messageQueue = [NSMutableArray array]; // 发送消息失败时,将消息加入队列 [messageQueue addObject:messageToSend]; // 网络恢复后,从队列中取出消息重新发送 for (id message in messageQueue) { [socket emit:@"message" with:@[message]]; }
- 客户端维护一个待发送消息的队列。当网络出现波动导致消息发送失败时,将消息重新加入队列。待网络恢复正常后,按顺序重新发送队列中的消息。可以使用
应对网络波动和消息丢失的策略
- 心跳检测:
- Socket.IO 提供了心跳机制,通过定期发送心跳包来检测网络连接状态。在 Objective - C 中,可以使用 Socket.IO 库默认的心跳设置,也可以自定义心跳间隔。例如:
socket.heartbeatInterval = 10; // 设置心跳间隔为10秒 [socket on:@"heartbeat" callback:^(NSArray *args) { NSLog(@"Received heartbeat from server. Connection is alive."); }];
- 当客户端长时间未收到服务器的心跳响应时,认为网络连接可能出现问题,触发重连机制。
- 重连机制:
- Socket.IO 具有自动重连机制。当网络连接断开时,它会尝试重新连接到服务器。可以通过设置重连的最大尝试次数和每次重连的间隔时间来优化重连策略。例如:
socket.maxReconnectionAttempts = 5; // 设置最大重连尝试次数为5次 socket.reconnectionDelay = 1; // 初始重连延迟为1秒 socket.reconnectionDelayMax = 5; // 最大重连延迟为5秒 [socket on:@"reconnect" callback:^(NSArray *args) { NSLog(@"Reconnected to server."); }];
- 持久化消息:
- 对于重要的消息,可以在本地进行持久化存储(如使用
NSUserDefaults
或 SQLite 数据库)。当消息发送失败或者客户端意外崩溃时,在下次启动应用时,从持久化存储中读取未成功发送的消息并重新发送。例如,使用NSUserDefaults
存储消息:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; NSMutableArray *unsentMessages = [defaults objectForKey:@"unsentMessages"]; if (!unsentMessages) { unsentMessages = [NSMutableArray array]; } // 添加未发送消息到数组 [unsentMessages addObject:messageToSend]; [defaults setObject:unsentMessages forKey:@"unsentMessages"]; [defaults synchronize];
- 对于重要的消息,可以在本地进行持久化存储(如使用
利用Socket.IO提供的机制实现消息可靠传输
- 使用ack回调:
- Socket.IO 支持在发送消息时传递一个ack回调函数。这个回调函数会在服务器确认收到并处理消息后被调用,从而确保消息的可靠发送。例如:
[socket emit:@"message" with:@[@"Hello"] callback:^(NSArray *args) { NSLog(@"Server acknowledged the message. Args: %@", args); }];
- 监听连接状态事件:
- 通过监听 Socket.IO 的连接状态事件(如
connect
、disconnect
、reconnect
等),可以在连接变化时采取相应的措施。例如,在连接断开时,提示用户网络连接已断开,并在重连成功时提示用户已重新连接。
[socket on:@"connect" callback:^(NSArray *args) { NSLog(@"Connected to server."); }]; [socket on:@"disconnect" callback:^(NSArray *args) { NSLog(@"Disconnected from server."); }];
- 通过监听 Socket.IO 的连接状态事件(如