首先iOS端用了一个第三方的框架

GCDAsyncSocket

当然这个是CocoaAsyncSocket框架里面的一部分

Github下载地址https://github.com/robbiehanson/CocoaAsyncSocket

首先这个框架不能直接使用,因为直接使用的话会收不到服务器发过来的信息代理方法会不响应;

原因似乎是因为内存管理方面的会释放掉代理,具体的不太清楚

所以自己写一个单列初始化GCDAsyncSocket实现其代理,然后自定义代理就可以接受消息了

单列代码.h文件如下

#import <Foundation/Foundation.h>

#import "GCDAsyncSocket.h"

@protocol TcpManagerDelegate <NSObject>

-(void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port;

-(void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err;

-(void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag;

-(void)socket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag;

@end

@interface TcpManager : NSObject

@property(strong,nonatomic) GCDAsyncSocket *asyncsocket;

@property(nonatomic,strong)id<TcpManagerDelegate>delegate;

+(TcpManager *)Share;

-(BOOL)destroy;

@end

.m文件如下

#import "TcpManager.h"

@interface TcpManager() <GCDAsyncSocketDelegate>

@end

@implementation TcpManager

+(TcpManager *)Share

{

static TcpManager *manager=nil;

static dispatch_once_t once;

dispatch_once(&once, ^{

manager=[[TcpManager alloc]init];

manager.asyncsocket=[[GCDAsyncSocket alloc]initWithDelegate:manager delegateQueue:dispatch_get_main_queue()];

});

return manager;

}

-(void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port

{

if ([self.delegate respondsToSelector:@selector(socket:didConnectToHost:port:)]) {

[self.delegate socket:sock didConnectToHost:host port:port];

}

}

-(void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err

{

if ([self.delegate respondsToSelector:@selector(socketDidDisconnect:withError:)]) {

[self.delegate socketDidDisconnect:sock withError:err];

}

}

-(void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag

{

if ([self.delegate respondsToSelector:@selector(socket:didReadData:withTag:)]) {

[self.delegate socket:sock didReadData:data withTag:tag];

}

//    [sock disconnect];

}

-(void)socket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag

{

if ([self.delegate respondsToSelector:@selector(socket:didWriteDataWithTag:)]) {

[self.delegate socket:sock didWriteDataWithTag:tag];

}

}

-(NSTimeInterval)socket:(GCDAsyncSocket *)sock shouldTimeoutWriteWithTag:(long)tag elapsed:(NSTimeInterval)elapsed bytesDone:(NSUInteger)length

{

NSLog(@"timeout");

return 0;

}

-(BOOL)destroy

{

[_asyncsocket disconnect];

return YES;

}

@end

具体的使用如下

TcpManager *tcp = [TcpManager Share];

tcp.delegate = self;

socket = tcp.asyncsocket;

if (![socket connectToHost:@"服务器IP" onPort:服务器监听端口号 error:nil]) {

NSLog(@"fail to connect");

}

刚才定义的代理方法如下

//链接服务器成功回调

- (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port{

if (self.time == nil) {

self.time = [NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(checkLongConnectByServe) userInfo:nil repeats:YES];

[self.time fire];

}

}

// 心跳连接

-(void)checkLongConnectByServe{

// 向服务器发送固定可是的消息,来检测长连接

NSString *longConnect = @"connect";

NSData   *data  = [longConnect dataUsingEncoding:NSUTF8StringEncoding];

[socket writeData:data withTimeout:3 tag:1];

[socket readDataWithTimeout:30 tag:2];

}

//收到信息回调

-(void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag{

NSString * string = [[NSString alloc]

initWithData:data encoding:NSUTF8StringEncoding];

NSLog(@"didReadData===========>%@",string);

}

-(void)socket:(GCDAsyncSocket *)sock didAcceptNewSocket:(GCDAsyncSocket *)newSocket{

NSLog(@"===========>didAcceptNewSocket");

}

-(void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err{

NSLog(@"===========>断开了");

}

//信息发送成功回调

-(void)socket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag{

NSLog(@"===========>写入成功");

}

iOS socket 实现tcp和服务器长链接的简单使用心得的更多相关文章

  1. IOS Socket 05-XMPP开始&安装服务器openfire&安装配置客户端

    1. 即时通讯技术简介(IM) 即时通讯技术(IM-Instant Messageing)支持用户在线实时交谈.如果要发送一条信息,用户需要打开一个小窗口,以便让用户及其朋友在其中输入信息并让交谈双方 ...

  2. iOS之 HTTP、Socket、TCP的区别(易混

    一.HTTP 是一种超文本传输协议,全名hypertext transfer protocol,从字面意思上可以看出该协议用于规定客户端与服务端之间的传输规则, 传输的内容不限于文本(任意类型的数据) ...

  3. 纯Socket(BIO)长链接编程的常见的坑和填坑套路

    本文章纯属个人经验总结,伪代码也是写文章的时候顺便白板编码的,可能有逻辑问题,请帮忙指正,谢谢. Internet(全球互联网)是无数台机器基于TCP/IP协议族相互通信产生的.TCP/IP协议族分了 ...

  4. 长链接转换成短链接(iOS版本)

    首先需要将字符串使用md5加密,添加NSString的md5的类别方法如下 .h文件 #import <CommonCrypto/CommonDigest.h> @interface NS ...

  5. python socket之tcp服务器与客户端demo

    python socket之tcp服务器与客户端demo 作者:vpoet mails:vpoet_sir@163.com server: # -*- coding: cp936 -*- ''' 建立 ...

  6. 通过Socket实现TCP编程,用户登录之服务器相应客户端,客户端和服务端之间的通信

    服务器端: 1.创建ServerSocket对象,绑定监听端口: 2.通过accept()方法监听客户端请求: 3.建立连接后通过输入流读取客户端发送的请求信息; 4.通过输出流向客户端发送响应信息; ...

  7. socket跟TCP/IP 的关系,单台服务器上的并发TCP连接数可以有多少

    常识一:文件句柄限制 在Linux下编写网络服务器程序的朋友肯定都知道每一个tcp连接都要占一个文件描述符,一旦这个文件描述符使用完了,新的连接到来返回给我们的错误是"Socket/File ...

  8. iOS Socket编程-C语言版(TCP)

    . TCP Socket编程 TCP是面向连接的,安全可靠的传输层协议.TCP的程序基本框架设计图: TCP的程序基本框架设计图.jpg 注意:Socket通信一定有要服务端和客户端. 1.1 TCP ...

  9. TCP长链接调试利器nc

    最近做了不少TCP长链接的开发,包括服务端和客户端.本人感觉服务器端与客户端通信时最好采用字符串形式,这样可以做要平台无关,跨语言.如果采用对象序列化机制通用性会较差.另外采用字符串形式用nc调试很方 ...

随机推荐

  1. Java基础知识强化之集合框架笔记01:集合的由来与数组的区别

    1. 集合的由来: 我们学习的是面向对象语言,而面向对象语言对事物的描述是通过对象体现的,为了方便对多个对象进行操作,我们就必须把这多个对象进行存储.而要想存储多个对象,就不能是一个基本的变量,而应该 ...

  2. linux性能调优概述

    - 什么是性能调优?(what) - 为什么需要性能调优?(why) - 什么时候需要性能调优?(when) - 什么地方需要性能调优?(where) - 什么人来进行性能调优?(who) - 怎么样 ...

  3. linux配置时间同步

    目标环境,5台linux centos 6.3, 一台作为NTPD服务与外部公共NTP服务同步时间,同时作为内网的NTPD服务器,其他机器与这台服务做时间同步.  服务器IP 角色   说明 同步方式 ...

  4. 【转】prufer编码

    既然有人提到了,就顺便学习一下吧,来源:http://greatkongxin.blog.163.com/blog/static/170097125201172483025666/ 一个含有n个点的完 ...

  5. 多重背包之 HDU -1171Big Event in HDU &HDU -2191悼念512汶川大地震遇难同胞——珍惜现在,感恩生活

    这两道题都是多重背包的基础题,前面的安格题意是:给出每个物体的价值和物体的数量,如何分使得A,B所得价值最接近并且A的价值不能小于B,就类似于NYOJ上的那个邮票分你一半那个意思,只不过这里不是一个而 ...

  6. mui实现退出当前应用

    var first = null; var showMenu = false; mui.back = function() { if(showMenu) { closeMenu();} else { ...

  7. JavaScript 浮点数运算 精度问题

    JavaScript小数在做四则运算时,精度会丢失,这会在项目中引起诸多不便,先请看下面脚本. //加减 <script type="text/javascript" lan ...

  8. (转)jquery.validator规则

      登录|注册     收藏成功 确定 收藏失败,请重新收藏 确定 标题 标题不能为空 网址 标签 摘要   公开 取消收藏             分享资讯 传PPT/文档 提问题 写博客 传资源 ...

  9. PL/SQL中的变量

    1.标量: ag1: declare v_ename emp.ename%type;--自己称为单变量 begin select ename into v_ename from emp where e ...

  10. UML中聚合和组合的区别

    聚合 聚合其实是关联的一个特例,表示了两个对象之间“part of(部分-整体)”的关系,是一种弱关联,部分的生命周期可以超越整体.在UML中,用整体端有空心菱形箭头的双向关联修饰聚合.聚合的示例如下 ...