XMPP
发布日期:2022-02-08 18:03:26
浏览次数:32
分类:技术文章
本文共 3898 字,大约阅读时间需要 12 分钟。
1. Socket:
遵循协议:NSStreamDelegate
输入流:NSInputStream输出流:NSOutputStream
NSStreamEvent:
// NSStreamEventOpenCompleted = 1UL << 0,//输入输出流打开完成// NSStreamEventHasBytesAvailable = 1UL << 1,//有字节可读// NSStreamEventHasSpaceAvailable = 1UL << 2,//可以发放字节// NSStreamEventErrorOccurred = 1UL << 3,// 连接出现错误// NSStreamEventEndEncountered = 1UL << 4// 连接结束
1.2 GCDAsyncSocket:
**GCDAsyncSocket 多敲代码联系 **
1> 遵守协议:GCDAsyncSocketDelegate
创建socket对象:
建立全局队列 它的代理方法会在子线程执行
// 创建socket异步对象 创建时直接设置代理_socket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)];
2> 建立连接:
// host:本机ip Port:端口号[_socket connectToHost:host onPort:port error:&error];与主机连接成功:- (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port;
与主机断开连接:- (void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err; error返回错误信息
3> 读写数据
socket写数据:[_socket writeData:data withTimeout:-1 tag:101]; (发送指令给服务器)
socket读取数据:[_socket readDataWithTimeout:-1 tag:tag];
4>
-(void)socket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag:数据成功发送到服务器
-(void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag 服务器有数据的时候调用
#pragma mark 数据成功发送到服务器-(void)socket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag{ NSLog(@"数据成功发送到服务器"); /** * 数据发送成功后,需要自己调用一下读取数据(readaDataWithTimeout: tag:)的方法,系统不会自己调用 * 接着_socket才会调用下面的代理方法(socket: didReadData: withTag) */ [_socket readDataWithTimeout:-1 tag:tag];}#pragma mark 服务器有数据,会调用这个方法-(void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag{ // 从服务器接收到的数据 NSString *recStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; NSLog(@"%@ %ld %@",[NSThread currentThread],tag, recStr); if (tag == 102) {//聊天返回的数据 // 刷新表格 [self reloadDataWithText:recStr]; }}
2. XMPP:
1> 导入文件:libresolv.tbd libxml2.tbd (设置服务器IP 端口号 域名)
2> 发送消息通过管道:XMPPStream
- (instancetype)init { if (self = [super init]) { // 初始化管道 self.xmppStream = [[XMPPStream alloc]init]; self.xmppStream.hostName = kHostName; //kHostName:IP地址 self.xmppStream.hostPort = kHostPort; // kHostPort:端口号 // 在主线程设置代理 xmppStream没有delegate属性 只有下面的方法设置 [self.xmppStream addDelegate:self delegateQueue:dispatch_get_main_queue()]; } return self;}
- (void)connectUserName:(NSString *)user { // 判断当前有没有连接 if ([self.xmppStream isConnected]) { // 有-->先将其他的连接断开 [self.xmppStream disconnect]; } // 创建连接者: kDomin:域名 kResource:版本 XMPPJID *jid =[XMPPJID jidWithUser:user domain:kDomin resource:kResource]; // 设置JID属性 self.xmppStream.myJID = jid; [self.xmppStream connectWithTimeout:30 error:nil];// 30内进行连接}
#pragma mark ========== 代理方法:#pragma 1. 连接// 连接超时- (void)xmppStreamConnectDidTimeout:(XMPPStream *)sender { NSLog(@"连接超时 !");}// 连接成功- (void)xmppStreamDidConnect:(XMPPStream *)sender { NSLog(@"连接成功 !"); if (isLogin) { NSError *error = nil; //用密码验证登陆 [self.xmppStream authenticateWithPassword:self.passWord error:&error]; }else { [self.xmppStream registerWithPassword:self.passWord error:nil]; } }// 连接失败- (void)xmppStreamDidDisconnect:(XMPPStream *)sender withError:(NSError *)error{ NSLog(@"连接失败 !");}#pragma 2. 登陆// 登陆成功- (void)xmppStreamDidAuthenticate:(XMPPStream *)sender { NSLog(@"登陆成功 !");}// 登录失败- (void)xmppStream:(XMPPStream *)sender didNotAuthenticate:(DDXMLElement *)error { NSLog(@"登录失败 !");}#pragma mark 登陆方法:- (void)loginUser:(NSString *)userName password:(NSString *)password { isLogin = YES; self.passWord = password; // 1. 链接 [self connectUserName:userName];// 调用连接方法}- (void)registerUser:(NSString *)user passWord:(NSString *)passWord { isLogin = NO; self.passWord = passWord; [self connectUserName:user]; }
转载地址:https://blog.csdn.net/Evelynzn/article/details/50165803 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2024年04月02日 07时49分29秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
007_shell中把变量重置为null
2019-04-27
008_shell创建只读量
2019-04-27
009_shell中从标准输入信息
2019-04-27
010_bash脚本的参数传递
2019-04-27
011_命令行参数的左移
2019-04-27
012_bash中的if判断条件
2019-04-27
013_bash中的加法
2019-04-27
014_bash中的for循环
2019-04-27
015_Arduino上实现一个简单的番茄时钟
2019-04-27
021_Excel的条件格式
2019-04-27
022_Excel空白值批量填充默认值
2019-04-27
023_emacs git-gutter+报错解决
2019-04-27
024_spacemacs支持org-pomodoro的声音提示
2019-04-27
025_everything搜索使用体验
2019-04-27
026_好用的windows小工具clover
2019-04-27
027-Mac触摸板实现窗口移动
2019-04-27
028_AUTOSAR RTE学习笔记-1
2019-04-27
029_AUTOSAR VFB学习笔记-2
2019-04-27
030_AUTOSAR软件组件学习笔记
2019-04-27
031_AUTOSAR学习笔记_BSW
2019-04-27