XMPP

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];
    
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值