iOS 通过GCDAsyncSocket建立tcp链接
来源:互联网 发布:淘宝女装尺码表模板 编辑:程序博客网 时间:2024/05/22 06:31
最近辗转到了ios开发当中。记录下一下最近开发的东西
这次开发的目的是建立一个tcp链接向服务器发送消息,然后读取服务器返回的消息
在这附上GCDAsyncSock的git地址可以下载下来使用,同时附带了很多例子,
https://github.com/robbiehanson/CocoaAsyncSocket
//创建socket,ps当然你可以先用isConnected判断一下是否链接
GCDAsyncSocket *reqsocket; //监听套接字
reqsocket = [[GCDAsyncSocketalloc]initWithDelegate:selfdelegateQueue:dispatch_get_main_queue()];
//建立连接
NSError *err=nil;
if (![reqsocketconnectToHost:@"192.168.1.1"onPort:80error:&err]) {
NSLog(@"connect remote server failed,%@",err);
}
NSString *sendmMsg =@"POST /seconfigAT HTTP/1.1\r\nHost: 192.168.1.1\r\nConnection: keep-alive\r\nAuthorization: Basic YWRtaW46YWRtaW4=\r\nContent-Length: 11\r\n\r\nwifi_Scan=1\r\n\r\n";
[reqsocketwriteData:datawithTimeout:-1tag:0];
解释一下其中的参数,timeout就是超时时间,后面有一个tag刚开始始终搞不明白tag作用,简单说来就是为了区分是那一次读写,比如第一次写的时候你设置了一个tag=0那么在写的回调函数中你就可以通过tag来区分是那一次的写回调的。。//因为tcp消息包可能是连续发送为了区分返回的包可以对包进行分割,此处用</html>分割,这样的坏处是如果分隔符填写错误将不会返回。。。
NSData* sperateData = [@"</html>"dataUsingEncoding:NSUTF8StringEncoding];
[reqsocketreadDataToData:sperateDatawithTimeout:-1tag:0];
当然你还可以读取固定长度的
[reqsocket readDataToLength:<#(NSUInteger)#> withTimeout:<#(NSTimeInterval)#> buffer:<#(NSMutableData *)#> bufferOffset:<#(NSUInteger)#> tag:<#(long)#>]
也有更简单的形式,就不多说了有兴趣的看文档
4:主要回调函数
回调函数很多主要常用的有以下几个
//链接成功之后回调
-(void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString * )host port:(uint16_t)port;
//读成功之后回调
- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag;
//写成功后回调的函数
-(void)socket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag;
//链接断开的时候回调
- (void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err;
至于还有什么别的可以参考文档5:读数据的时候可以继续监听服务器返回的数据
[reqsocketreadDataToData:sperateDatawithTimeout:-1tag:0]
[reqsocketdisconnect];
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
重要的事情说三遍 ,千万不要随便从word复制字符串,千万不要随便从word复制字符串,千万不要随便从word复制字符串,这个错误让我调了两天,word复制的字符串中空格会包含不可见字符。
这一次的开发其实是一个http请求完全可以用mknetwork,更简单。。。。因为刚刚开始所以勿喷
<span style="font-size:14px;">-(void)createConnect{ //创建socket嵌套字 reqsocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()]; //建立连接 NSError *err=nil; if (![reqsocket connectToHost:@"192.168.17.254" onPort:80 error:&err]) { NSLog(@"connect remote server failed,%@",err); }}</span>然后我在创建成功之后需要向服务器发送一个写请求
//链接成功之后回调-(void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString * )host port:(uint16_t)port{ if (writeTag==0) { //链接成功之后会自动发送向服务器的写请求 NSString *sendmMsg = @"POST /goform/ser2netconfigAT HTTP/1.1\r\nHost: : keep-alive\r\nAuthorization: Basic YWRtaW46QzI5V1JBUlRKSUdXSDlHOUZCRUQ=\r\nContent-Length"; NSLog(@"%@",sendmMsg); NSData *data = [sendmMsg dataUsingEncoding:NSUTF8StringEncoding]; //向服务器发送写请求 [reqsocket writeData:data withTimeout:-1 tag:0]; } else if (writeTag==1){ NSData *data = [sendmMsgConnect dataUsingEncoding:NSUTF8StringEncoding]; //向服务器发送写请求 [reqsocket writeData:data withTimeout:-1 tag:1]; }}然后在写成功后的回调函数中我再向服务发送读请求
//写成功后回调的函数 -(void)socket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag{ if (tag==0) { NSData* sperateData = [@"</html>" dataUsingEncoding:NSUTF8StringEncoding]; //发送写请求 [reqsocket readDataToData:sperateData withTimeout:-1 tag:0]; } else if (tag==1){ }}
然后在读成功之后的回调函数中我在获取服务器返回的数据
- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag{ if (tag==0) { //获取读回的数据 scannerInfo = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; NSLog(@"scanner wifi datas is :%@",scannerInfo); NSData* sperateData = [@"</html>" dataUsingEncoding:NSUTF8StringEncoding]; //继续监听 [reqsocket readDataToData:sperateData withTimeout:-1 tag:0]; } else if(tag==1){}}
- iOS 通过GCDAsyncSocket建立tcp链接
- GCDAsyncSocket TCP 建立 socket 连接
- ios GCDAsyncSocket(Tcp)的使用
- iOS中使用GCDAsyncSocket建立长连接
- Swift代码使用GCDAsyncSocket库建立TCP连接失败。
- iOS GCDAsyncSocket
- GCDAsyncSocket类库,IOS下TCP通讯使用心得
- GCDAsyncSocket类库,IOS下TCP通讯使用心得
- GCDAsyncSocket类库,IOS下TCP通讯使用心得
- GCDAsyncSocket类库,IOS下TCP通讯使用心得
- GCDAsyncSocket类库,IOS下TCP通讯使用心得
- iOS Socket/Tcp编程 GCDAsyncSocket的实战(带回调)
- TCP UDP建立链接对比
- iOS Socket建立链接
- 通过UDP建立TCP连接
- IOS socket GCDAsyncSocket
- IOS socket GCDAsyncSocket
- IOS socket GCDAsyncSocket
- 当你在内核源码路径里敲下make 时会发生什么。
- 高并发的epoll+线程池,业务在线程池内
- HTML&CSS Learning Notes 3
- saltstack--job
- 第三周--顺序表的基本运算2
- iOS 通过GCDAsyncSocket建立tcp链接
- MySql安装及配置
- redis cluster主从复制
- MySQL 修改 root 密码
- Hadoop WritableComparable接口
- Python正则判断手机和邮箱
- 转载:天涯——散文天下——《一个人的悲剧人生》——作者:南方孤驴
- Swift UITabBarController 标签栏控制器
- Android EditText与第三方输入法删除键(退格键)冲突问题解决方案