文档章节

IOS Socket编程

SoulJa
 SoulJa
发布于 2015/06/22 08:19
字数 613
阅读 296
收藏 2

一、 OSITCP/IP参考模型

IOS参考模型七层的作用

同一节点相邻层次间通过接口通信

各节点相同层次通过协议实现

TCP/IP参考模型简化



二、网络通讯要素

使用端口号的范围

ping的回环地址(网上没问题)Ping IP(网络没问题),域名、DNS

本地域名缓存/etc/hosts (画图演示DNS hosts)

TCP/UDP

URL ftp:http

演示telnet 解决工作中常见问题


iVincent:~ Vincent_Guo$ telnet 220.181.111.188 80


Trying 220.181.111.188...


Connected to 220.181.111.188.


Escape character is '^]'.


GET /more/ HTTP/1.1


host:www.baidu.com




三、 socket聊天

启动聊天服务器 Python chatserver.py

键盘动画[self.view layoutIfNeeded];

连接到主机,分配输入输出流空间

建立长连接CFStreamCreatePairWithSocketToHost

将语言的输入输出流转成OC对象

设置代表监听输入输出流的状态

添加到主运行循环,否理代理不工作

[_inputStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];


打开输入输出流

登录发送

NSString *loginStr = [NSString stringWithFormat:@"iam:zhangsan"];


NSData *data = [loginStr dataUsingEncoding:NSUTF8StringEncoding];


[_outputStream write:data.bytes maxLength:data.length];


数据读取

//建立个缓冲区来保存读取到的数据


uint8_t buffer[1024];


//返回实际读取的数据长度


NSInteger len = [_inputStream read:buffer maxLength:sizeof(buffer

                                                           

//有数据


if (len > 0) {

   

   NSString *reveiver =  [[NSString alloc] initWithBytes:buffer length:len encoding:NSUTF8StringEncoding];

   

}


断开连接要关闭输入输出流并移除主运行循环

回顾

netstat -an -p tcp 查看所有开放的端口查看连接状态

#import "ViewController.h"
#define host @"192.168.95.102"
#define port 12345
@interface ViewController ()<NSStreamDelegate>{
    NSInputStream *inputStream;
    NSOutputStream *outputStream;
}

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    
}


-(void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode{
      NSLog(@"%@",aStream);
//    NSStreamEventOpenCompleted = 1UL << 0,
//    NSStreamEventHasBytesAvailable = 1UL << 1,
//    NSStreamEventHasSpaceAvailable = 1UL << 2,
//    NSStreamEventErrorOccurred = 1UL << 3,
//    NSStreamEventEndEncountered = 1UL << 4
    switch (eventCode) {
        case NSStreamEventOpenCompleted://数据流打开完成
            NSLog(@"数据流打开完成");
            break;
        case NSStreamEventHasBytesAvailable://有可读字节
            NSLog(@"有可读字节");
            [self readBytes];
            break;
        case NSStreamEventHasSpaceAvailable:// 可发送字节
            NSLog(@"可发送字节");
            break;
        case NSStreamEventErrorOccurred://连接错误
            NSLog(@"连接错误");
            break;
        case NSStreamEventEndEncountered://到达流未尾,要关闭输入输出流
            NSLog(@"到达流未尾,要关闭输入输出流");
            [outputStream close];
            [inputStream close];
            [outputStream removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
            [inputStream removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
            break;
        default:
            break;
    }
}
- (IBAction)connect:(id)sender {
    //连接服务器
    CFReadStreamRef readStream;
    CFWriteStreamRef writeStream;
    CFStreamCreatePairWithSocketToHost(NULL,(__bridge CFStringRef) host, port, &readStream, &writeStream);
    
    
    inputStream = (__bridge NSInputStream *)(readStream);
    outputStream = (__bridge NSOutputStream *)(writeStream);
    
    
    inputStream.delegate = self;
    outputStream.delegate = self;
    
    [inputStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
    [outputStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
    
    [inputStream open];
    [outputStream open];
}
- (IBAction)login:(id)sender {
    NSString *str = @"iam:zhangsan";
    NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
    
    [outputStream write:data.bytes maxLength:data.length];
}


-(void)readBytes{
    uint8_t buffer[1012];
    NSInteger len = [inputStream read:buffer maxLength:sizeof(buffer)];
    
    NSData *data = [NSData dataWithBytes:buffer length:len];
    NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    
    NSLog(@"%@",str);
    
}
@end


© 著作权归作者所有

共有 人打赏支持
SoulJa
粉丝 31
博文 183
码字总数 32359
作品 0
武汉
程序员
IOS学习,最简单的表格应用程序,学习,列出博客

IOS编程浅蓝教程,这是博客地址http://www.cnblogs.com/haichao/category/425378.html IOS编程浅蓝教程:锲子 IOS编程浅蓝教程(一)先决条件:开始iOS编程的必要准备 IOS编程浅蓝教程(二) Hel...

andy521zhu
2015/01/17
0
0
Android Socket 与 IOS Socket

最近做了一个项目,支持Android和ios两个平台。 这个项目中会用到一些简单的Socket通信,所以就有机会接触到了Android和ios两个平台的Socket实现。 现在将android和ios的Socekt做一些总结: ...

postdep
2014/11/01
0
0
如何判断你是合格的高级iOS开发工程师?

前言 随着移动互联网的高速发展泄洪而来,有意学习移动开发的人越来越多了,竞争也是越来越大,需要学习的东西很多。如何才能在激烈的移动开发者竞争中一枝独秀,成为一名真正合格的高级iOS...

_小迷糊
05/26
0
0
AFNetworking是一个为 iOS 和 Mac OSX 制作的令人愉快的网络库

AFNetworking是一个为 iOS 和 Mac OSX 制作的令人愉快的网络库,它建立在URL 装载系统框架的顶层,内置在Cocoa里,扩展了强有力的高级网络抽象。它的模块架构被良好的设计,拥有丰富的功能,...

lewis-180
2015/04/02
0
0
10个优秀Objective-C和iOS开发在线视频教程

如果你自己开发iOS应用,你肯定会发现网上有很多资源。学习编程的一个最好的方法就是自己写代码,而开始写代码的最快的方式就是看其他人怎么写。我们从海量视频和学习网站中整理出了我们认为...

mingxun
2014/05/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

jetbrains系产品IDEA:mac上面提示快捷键设置

原因 由于Mac上面的Ctrl+空格变成输入法切换的快捷键,在使用IDEA的过程中,代码提示很不方便,需要使用option+/这种传统eclipse上面的代码提示快捷键作为主要快捷键。 怎么修改? 移除【opt...

亚林瓜子
31分钟前
0
0
Exclipse 输出结果时换行

System.out.println(f1 + "\n" + d1 + "\n" + d2);

笑丶笑
31分钟前
1
0
怎样治疗标签不能触发onblur事件

I realize this was over a year ago, but it showed up for me in Google while trying to solve this same issue. It seems Chrome does not consider some elements, like body and ancho......

Weijuer
34分钟前
0
0
vue常见库安装

移动设备上的浏览器默认会在用户点击屏幕大约延迟300毫秒后才会触发点击事件,这是为了检查用户是否在做双击。为了能够立即响应用户的点击事件,才有了FastClick。 安装fastclick npm insta...

林夏夕
36分钟前
0
0
kafka 教程(三) kafka Java API 编程

下午写

MrPei
37分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部