*AsyncSocket類是支持TCP的
*AsyncUdpSocket是支持UDP的
導(dǎo)入頭文件
import "GCDAsyncSocket.h" // for TCP
import "GCDAsyncUdpSocket.h" // for UDP
如果代理里的動作 是 耗時的動作各淀,就 不能 在主線程中調(diào)用蔬顾,要 在子線程中
如果代理里的動作 不 是耗時的動作所踊,就 能 在主線程中調(diào)用愿棋,不需要 在子線程中
//將handler設(shè)置成接收TCP信息的代理
_chatSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
全局隊列(代理的方法是在子線程被調(diào)用)
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0)
主隊列(代理的方法會在主線程被調(diào)用)
dispatch_get_main_queue()
連接
#pragma mark - 連接服務(wù)器端口
- (void)connectServerHost {
if (_connectStatus == SocketConnectStatus_UnConnected) {
[_chatSocket connectToHost:ML_SocketHost onPort:5678 withTimeout:-1 error:nil];
}
}
斷開
//設(shè)置默認(rèn)關(guān)閉讀取
[_chatSocket setAutoDisconnectOnClosedReadStream:NO];
[_chatSocket disconnect];
connect翁授、read、write崭倘、disconnect,GCDAsyncSocket
GCDAsyncSocketDelegate
寫發(fā)送消息:[_chatSocket writeData:sendingData withTimeout:ML_TCP_TimeoutInterval tag:type];
//連接成功調(diào)用
- (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port
//斷開連接的時候調(diào)用
- (void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(nullable NSError *)err
#pragma mark - 發(fā)送消息超時
- (NSTimeInterval)socket:(GCDAsyncSocket *)sock shouldTimeoutWriteWithTag:(long)tag elapsed:(NSTimeInterval)elapsed bytesDone:(NSUInteger)length
//寫的回調(diào)
- (void)socket:(GCDAsyncSocket*)sock didWriteDataWithTag:(long)tag
//收到消息
- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag{
即時通訊的時候幾個注意的點:
*斷網(wǎng)重連的問題需要做一個網(wǎng)絡(luò)監(jiān)聽監(jiān)聽
*賬戶只能連接一次楼肪,不能同時存在多條線路,不然可能會導(dǎo)致對方收到的消息不知道是誰發(fā)的
*發(fā)送心跳這是必須的惹悄,不然服務(wù)器不知道你有沒有活著
*發(fā)送消息的格式按后臺的協(xié)議來春叫,nsdata格式傳輸