使用 socketIO实现长连接
2021-03-18 本文已影响0人
来敲代码
实现长连接有很多
CocoaAsyncSocket:https://github.com/robbiehanson/CocoaAsyncSocket,
Facebook的SocketRocket https://github.com/facebook/SocketRocket,
socket.io https://github.com/socketio/socket.io-client-swift
今天讲解使用过的 socket.io-client-swift 作为记录 也为小伙伴提供参考
socket.io-client-swift是一个swift实现的Socket.IO框架
我们如果使用cocopods的话
pod ‘Socket.IO-Client-Swift’
安装好之后,实现长连接就简单了:
1)首先在你的viewController中引入这个第三方,
@import SocketIO;
/**是@而不是#import
如果做好桥接 也可以
#import <SocketIO/SocketIO-Swift.h>
总之引入正确就行,不行百度解决
*/
2)可对socket进行二次封装代理方法,这里就只讲使用
// 这里字典包含长链接所需url 和后台同事约定好字段就行
NSURL* url = [[NSURL alloc] initWithString:[dic valueForKey:@"chatserver"]];
// NSURL *url = [NSURL URLWithString:@"https://socketio-chat.now.sh/"];
3) 一种初始化方法
//使用给定的url初始化一个socketIOClient,后面的config是对这个socket的一些配置,比如log设置为YES,控制台会打印连接时的日志等
SocketIOClient *socket = [[SocketIOClient alloc] initWithSocketURL:url config:@{@"log": @YES, @"forcePolling": @YES}];
[socket connect];
4) 另一种种初始化方法
NSURL* url = [[NSURL alloc] initWithString:[dic valueForKey:@"chatserver"]];
SocketManager*socketManager = [[SocketManager alloc] initWithSocketURL:url config:@{@"log": @NO, @"compress": @YES}];
SocketIOClient *socket = socketManager.defaultSocket;
[socket connect];
4) 具体监听方法
// 链接后 与后台约定参数
NSArray *cur = @[@{
@"uid":[Config getOwnID] ? [Config getOwnID] : model.uid,
@"token":[Config getOwnID] ? [Config getOwnToken] : model.token,
@"roomnum":[dic valueForKey:@"uid"],
@"stream":[dic valueForKey:@"stream"],
@"gameId":[dic valueForKey:@"gameId"]
}];
//监听是否连接上服务器,正确连接走后面的回调
[socket on:@"connect" callback:^(NSArray* data, SocketAckEmitter* ack) {
NSLog(@"socket connected");
[socket emit:@"conn" with:cur];
}];
[socket on:@"disconnect" callback:^(NSArray* data, SocketAckEmitter* ack) {
NSLog(@"socket.io disconnect---%@",data);
}];
[socket on:@"error" callback:^(NSArray* data, SocketAckEmitter* ack) {
NSLog(@"socket.io error -- %@",data);
}];
[socket on:@"conn" callback:^(NSArray* data, SocketAckEmitter* ack) {
NSLog(@"进入房间");
}];
// broadcastingListen 这个与后台约定字段
[socket on:@"broadcastingListen" callback:^(NSArray* data, SocketAckEmitter* ack) {
for (NSString *path in data[0]) {
NSDictionary *jsonArray = [path JSONValue];
NSDictionary *msg = [[jsonArray valueForKey:@"msg"] firstObject];
NSString *retcode = [NSString stringWithFormat:@"%@",[jsonArray valueForKey:@"retcode"]];
NSString *method = [msg valueForKey:@"_method_"];
if ([retcode isEqual:@"409002"]) {
[MBProgressHUD showError:@"你已被禁言"];
return;
}
if ([method isEqual:@"SendMsg"]) {
// 这里代理封装 传递给使用的控制器
[weakself getmessage:msg andMethod:method];
}else if ([method isEqual:@"leaveAction"]) {
// 用户离开
}
}
}];
5)真正开发中,需要给服务端传递规定好的关键字,服务端才会正确的返回你想获取的数据,这个时候就要用到emmit()方法
[socket emit:@"conn" with:cur];
6)如果想停止本次长连接,也很简单,调用disconnect()方法即可。
[self.socket disconnect];
7)官网示例
NSURL *url = [NSURL URLWithString:@"https://socketio-chat.now.sh/"];
SocketIOClient *socket = [[SocketIOClient alloc] initWithSocketURL:url config:@{@"log": @YES, @"forcePolling": @YES}];
[socket on:@"connect" callback:^(NSArray* data, SocketAckEmitter* ack) {
NSLog(@"socket connected");
// [socket emit:@"conn" with:cur];
}];
//监听new message,这是socketIO官网提供的一个测试用例,大家都可以试试。如果成功连接,会收到data内容。
[socket on:@"new message" callback:^(NSArray* data, SocketAckEmitter* ack) {
NSLog(@"response is %@",data);
}];
[socket connect];