上周周末的时候发烧了,就担误了写博客,这周就多写点吧。
这次主要讲下Socket,关于它的三次握手、四次挥手什么的已经写的很多了,也写的很好,我就不写了。但注释代码时会穿插些Socket原理进去,当然也会提供Demo。
TCP Socket Server
#import "GCDAysncSocket.h"
遵守协议<GCDAsyncSocketDelegate>
创建一个socket:
self.serverSocket = [[GCDAsyncSocket alloc]initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
监听端口:
NSError * error = nil;
[self.serverSocket acceptOnPort:[self.portTextField.text integerValue] error:&error];
等待连接://此为GCDAsyncSocket代理方法
- (void)socket:(GCDAsyncSocket *)sock didAcceptNewSocket:(GCDAsyncSocket *)newSocket
{
//这里需要对Socket的工作原理进行一点解释,当Socket accept一个连接服务请求时,将生成一个新的Socket,即此处的newSocket。在此可查看newSocket.connectedHost和newSocket.connectedPort等参数,并通过新的socket向客户端发送一包数据后会关闭你一开始创建的socket(self.serverSocket),接下来你都将使用newSocket(我将此保存为self.clientSocket)
self.clientSocket = newSocket;
}
连接失败://此为GCDAsyncSocket代理方法
- (void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err;
{
NSLog(@"连接失败,要怎么做,你自己看着办吧");
}
连接成功,发送数据
//注意此处使用的是上面的newSocket
[self.clientSocket writeData:[self.sendTextView.text dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:0];
//我创建了一个Socket单例,这里只讨论Socket,单例创建可看Demo
SocketManager * socketManager = [SocketManager sharedSocketManager];
[socketManager.mySocket readDataWithTimeout:-1 tag:0];
对发送的数据根据tag进行管理://此为GCDAsyncSocket代理方法
- (void)socket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag
{
NSLog(@"可通过参数中的tag值管理发送的数据,想怎么管理,您看着办");
}
连接成功,接收数据
//同样使用的是newSocket
[self.clientSocket readDataWithTimeout:-1 tag:0];
接收数据成功,处理数据://此为GCDAsyncSocket代理方法
- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
{
NSLog(@"接收到消息%@,要怎么处理,您看着办",data);
}
这是服务器Demo,欢迎大家Star
TCP Socket Client
#import "GCDAysncSocket.h"
遵守协议<GCDAsyncSocketDelegate>
创建Socket:
self.clientSocket = [[GCDAsyncSocket alloc]initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
连接服务器:
NSError * error = nil;
[self.clientSocket connectToHost:self.ipTextField.text onPort:[self.portTextField.text integerValue] error:&error];
连接成功://此处为GCDAsyncSocket代理方法
- (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port
{
//创建的socket单例
SocketManager * socketManager = [SocketManager sharedSocketManager];
socketManager.mySocket = sock;
}
连接失败://此处为GCDAsyncSocket代理方法
- (void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err
{
NSLog(@"自己看着办");
}
连接成功,发送数据
[self.clientSocket writeData:[self.sendTextView.text dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:0];
连接成功,接收数据
[self.clientSocket readDataWithTimeout:-1 tag:0];
接收数据成功,处理数据://此处为GCDAsyncSocket代理方法
- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
{
NSLog(@"接收到消息%@,要怎么处理,您看着办",data);
}
到此处就结束了,大家可以发现,客户端这边从头到尾都是使用的一个Socket,并没有出现新的Socket,这一点是需要注意的。客户端Demo,欢迎大家Star.