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