文档章节

IOS Socket编程

SoulJa
 SoulJa
发布于 2015/06/22 08:19
字数 613
阅读 297
收藏 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
武汉
程序员
私信 提问
OSChina 技术专题之 Swift 苹果全新开发语言

Swift 是苹果新推出的编程语言,专门针对 OS X 和 iOS 的应用开发。Swift 在各个方面优于 Objective-C,也不会有那么多复杂的符号和表达式。同时,Swift 更加快速、便利、高效、安全。除此之...

OSC编辑部
2014/11/10
4.2K
4
Android Socket 与 IOS Socket

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

postdep
2014/11/01
0
0
现代传播集团招募iOS高级工程师

现代传播集团招募 高级iOS开发工程师 工作地点:北京 三里屯 薪水:10k-20k 简历请发到 linyize@modernmedia.com.cn 岗位职责: 1. 负责现代传播集团 iphone/ipad 客户端应用软件开发与维护;...

linyize
2013/05/07
305
0
IOS学习,最简单的表格应用程序,学习,列出博客

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

andy521zhu
2015/01/17
0
0
如何判断你是合格的高级iOS开发工程师?

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

_小迷糊
05/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

线下工坊|Blockchain Coding Day:零基础教你开发DAPP(北京)

我们的目标是通过编程学习让你更了解区块链技术。这将对区块链开发初学者一次很好的体验。这里需要强调一下,编程零基础也能学会。 我们将以小组的形式,由教练带领学员完成DAPP开发。每位学...

HiBlock
17分钟前
1
0
查看内存情况

jinfo:可以输出并修改运行时的java 进程的opts。 jps:与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程号。 jstat:一个极强的监视VM内存工具。...

Canaan_
18分钟前
2
0
基于对象特征的推荐

(本实验选用数据为真实电商脱敏数据,仅用于学习,请勿商用) 在上一期基于协同过滤的的推荐场景中,我们介绍了如何通过PAI快速搭建一个基于协同过滤方案的推荐系统,这一节会介绍一些如何基...

阿里云官方博客
26分钟前
1
0
Ugly Number(leetcode263)

Write a program to check whether a given number is an ugly number. Ugly numbers are positive numbers whose prime factors only include 2, 3, 5. Example 1: Input: 6Output: true......

woshixin
49分钟前
2
0
深度模型从研者 眼里的 似然估计 & Hessain 海森矩阵 & Fisher Information (费雪信息)

深度模型的训练的基本依据是最小化模型拟合数据的误差。旨在不仅知其然(如何构建和训练一个深度模型),还应知其所以然(为什么这样训练,可以做哪些优化)。我们就会发现,有很多研究者,在...

刘小米_思聪
53分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部