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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:CoreData
下一篇:Swift基础知识

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2024年04月02日 07时49分29秒