iOS -- 原生NSStream实现socket
- (void)startSocket:(NSString *)address andPort:(int)port
{
CFReadStreamRef readRef;
CFWriteStreamRef writeRef; CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)address, port, &readRef, &writeRef); _inputStream = (__bridge NSInputStream *)readRef;
_outputStream = (__bridge NSOutputStream *)writeRef; // 设置流属性
[_inputStream setProperty:NSStreamNetworkServiceTypeVoIP forKey:NSStreamNetworkServiceType];
[_outputStream setProperty:NSStreamNetworkServiceTypeVoIP forKey:NSStreamNetworkServiceType]; // 设置代理
_inputStream.delegate = self;
_outputStream.delegate = self; // 放到runloop中
[_inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[_outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; [_inputStream open];
[_outputStream open];
} // 断开 scoket 连接
- (void)closeSocket {
if(_inputStream){
_inputStream.delegate = nil;
[_inputStream close];
[_inputStream removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
_inputStream = nil;
}
if(_outputStream){
_outputStream.delegate = nil;
[_outputStream close];
[_outputStream removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
_outputStream = nil;
[SVProgressHUD showSuccessWithStatus:@"断开连接成功"];
}
// 通知给界面
[[NSNotificationCenter defaultCenter] postNotificationName:@"closeSocket" object:nil userInfo:nil];
} // 代理的回调是在主线程
#pragma mark - <NSStreamDelegate>代理方法
- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode
{
switch (eventCode) {
case NSStreamEventNone:
break;
case NSStreamEventOpenCompleted:
[SVProgressHUD showSuccessWithStatus:@"连接成功"];
NSLog(@"成功建立连接, 形成输入输出管道");
break;
case NSStreamEventHasBytesAvailable:
NSLog(@"有数据可读");
{
uint8_t buf[];
NSInteger len = ;
NSInputStream *inputStream = (NSInputStream *)aStream;
len = [inputStream read:buf maxLength:]; if (len) {
_tempString = [NSMutableString string];
// 将16进制字符拼接起来
for (int i = ; i < len; i++) {
NSMutableString *str = [NSMutableString stringWithFormat:@"%x", buf[i]];
if (str.length < ) {
[str insertString:@"" atIndex:];
}
[_tempString appendString:str];
}
// 进行分包丶 粘包处理, 同时进行KVO监听可用的包 [_stick_Subcontract_Package HandleResultOnReceiveData:_tempString]; }
break;
}
case NSStreamEventHasSpaceAvailable:
NSLog(@"可以发送数据");
break;
case NSStreamEventErrorOccurred:
NSLog(@"有错误发生, 连接失败");
[SVProgressHUD showErrorWithStatus:@"连接错误"];
{
[aStream close];
break;
}
case NSStreamEventEndEncountered:
[SVProgressHUD showErrorWithStatus:@"正常断开连接"];
NSLog(@"正常断开连接"); {
[aStream close];
[aStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
aStream = nil;
break;
} default:
break;
}
}
有个问题, 就是这个没有实现异步接受消息.所以最好用asynSocket
iOS -- 原生NSStream实现socket的更多相关文章
- iOS 网络编程:socket
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...
- [深入浅出Cocoa]iOS网络编程之Socket
http://blog.csdn.net/kesalin/article/details/8798039 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] [深入浅出Co ...
- JS调用Android、Ios原生控件
在上一篇博客中已经和大家聊了,关于JS与Android.Ios原生控件之间相互通信的详细代码实现,今天我们一起聊一下JS调用Android.Ios通信的相同点和不同点,以便帮助我们在进行混合式开发时, ...
- [调整] Firemonkey iOS 原生 Edit 透明框, 改变框色
说明:iOS 原生 Edit 透明框 适用:Berlin Firemonkey 方法:在 StyleLookup 输入 transparentedit 效果: 如果有图片 Image 在这二个 Edi ...
- unity导出工程导入到iOS原生工程中详细步骤
一直想抽空整理一下unity原生工程导入iOS原生工程中的详细步骤.做iOS+vuforia+unity开发这么长时间了.从最初的小小白到现在的小白.中间趟过了好多的坑.也有一些的小小收货.做一个喜欢 ...
- iOS原生地图开发指南续——大头针与自定义标注
iOS原生地图开发指南续——大头针与自定义标注 出自:http://www.sxt.cn/info-6042-u-7372.html 在上一篇博客中http://my.oschina.net/u/23 ...
- iOS原生项目中集成React Native
1.本文的前提条件是,电脑上已经安装了CocoaPods,React Native相关环境. 2.使用Xcode新建一个工程.EmbedRNMeituan [图1] 3.使用CocoaPods安装Re ...
- Cordova - 与iOS原生代码交互2(使用Swift开发Cordova的自定义插件)
在前一篇文章中我介绍了如何通过 js 与原生代码进行交互(Cordova - 与iOS原生代码交互1(通过JS调用Swift方法)),当时是直接对Cordova生成的iOS工程项目进行编辑操作的(添加 ...
- cocos2d-x + Lua接入iOS原生SDK的实现方案[转]
相信很多朋友在使用cocos2d-x+lua开发游戏时都遇到过接入iOS原生SDK的问题,比如常见的接应用内支付SDK,广告SDK或是一些社交平台SDK等等,我也没少接过这类SDK.这篇文章主要是对我 ...
随机推荐
- Alpha版(内部测试版)发布
首先通过微信扫吗下载我们的软件校园服务,首先进去登录界面没账号点击注册,注册完就可以登录了,进去界面我们在二手交易这项功能里我们即可以事卖家又可以是买家如果我们卖东西点击商品出售,填写商品信息,商品图 ...
- 玩App怎么赚钱(二)
紧接上篇文章,谈到App前赚钱的一些门道,其实还有很多了,需要你自己去挖掘App到底有什么价值.有价值的东西就能形成交易,而交易的过程中是用金钱作为流通手段,所以说赚钱没那么高大上,它的本质就是价值的 ...
- Zend Framework 2中如何使用Service Manager
end Framework 2 使用ServiceManager(简称SM)来实现控制反转(IoC).有很多资料介绍了service managers的背景,我推荐大家看看this blog post ...
- matlab 初级画图
matlab 初级画图 1.plot() plot(x,y) plots each vector pairs (x,y) 画图函数画出每个点 每组变量 plot (y) plots eac ...
- linux内核代码注释 赵炯 第三章引导启动程序
linux内核代码注释 第三章引导启动程序 boot目录中的三个汇编代码文件 bootsect.s和setup.s采用近似intel的汇编语法,需要8086汇编器连接器as86和ld86 head ...
- List容器——LinkedList及常用API,实现栈和队列
LinkedList及常用API ① LinkedList----链表 ② LinkedList类扩展AbstractSequentialList并实现List接口 ③ LinkedLis ...
- list 类
题外:len = sizeof(a)/sizeof(a[0]); 求出数组长度 1.list是一种以双向链表方式实现的一种顺序容器.list容器中,存放元素的存储单元可以是连续的也可以是不连续的. 2 ...
- Dango notes II: class-based views
A view is a callable which takes a request and returns a response. A view can be function (function- ...
- 浅谈android反调试之 签名校验
反调试原理 很多时候,我们都需要进行修改修改应用程序的指令,然后重打包运行,重新打包就需要充签名. 利用签名的变化我们用于反调试.反调试实现代码如下: 为了更加隐藏,比较函数可能在SO层进行实现,如下 ...
- bzoj 1137 [POI2009]Wsp 岛屿
题目大意 Byteotia岛屿是一个凸多边形.城市全都在海岸上.按顺时针编号1到n.任意两个城市之间都有一条笔直的道路相连.道路相交处可以自由穿行.有一些道路被游击队控制了,不能走,但是可以经过这条道 ...