*AsyncSocket类是支持TCP的
*AsyncUdpSocket是支持UDP的
导入头文件
import "GCDAsyncSocket.h" // for TCP
import "GCDAsyncUdpSocket.h" // for UDP
如果代理里的动作 是 耗时的动作,就 不能 在主线程中调用,要 在子线程中
如果代理里的动作 不 是耗时的动作,就 能 在主线程中调用,不需要 在子线程中
//将handler设置成接收TCP信息的代理
_chatSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
全局队列(代理的方法是在子线程被调用)
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0)
主队列(代理的方法会在主线程被调用)
dispatch_get_main_queue()
连接
#pragma mark - 连接服务器端口
- (void)connectServerHost {
if (_connectStatus == SocketConnectStatus_UnConnected) {
[_chatSocket connectToHost:ML_SocketHost onPort:5678 withTimeout:-1 error:nil];
}
}
断开
//设置默认关闭读取
[_chatSocket setAutoDisconnectOnClosedReadStream:NO];
[_chatSocket disconnect];
connect、read、write、disconnect,GCDAsyncSocket
GCDAsyncSocketDelegate
写发送消息:[_chatSocket writeData:sendingData withTimeout:ML_TCP_TimeoutInterval tag:type];
//连接成功调用
- (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port
//断开连接的时候调用
- (void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(nullable NSError *)err
#pragma mark - 发送消息超时
- (NSTimeInterval)socket:(GCDAsyncSocket *)sock shouldTimeoutWriteWithTag:(long)tag elapsed:(NSTimeInterval)elapsed bytesDone:(NSUInteger)length
//写的回调
- (void)socket:(GCDAsyncSocket*)sock didWriteDataWithTag:(long)tag
//收到消息
- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag{
即时通讯的时候几个注意的点:
*断网重连的问题需要做一个网络监听监听
*账户只能连接一次,不能同时存在多条线路,不然可能会导致对方收到的消息不知道是谁发的
*发送心跳这是必须的,不然服务器不知道你有没有活着
*发送消息的格式按后台的协议来,nsdata格式传输
网友评论