一、网络编程
1表现形式:一台机子上的应用程序和另外一个设备的程序之间能够互相交换数据。
2 7层网络结构
硬件层:解决硬件连接问题
数据链路层:解决硬件之间能够向指定设备传输数据
IP:为设备提供一个虚拟的网络逻辑地址(门牌号)
MAC:设备的物理地址(网卡)
3 TCP / UDP
是两个不同的数据传输协议,就是解析字节的方式不同
目的:保证数据在设备和设备之间能够传输
协议:有结构的字节串
TCP 一对一传输 可靠
UDP 一对多传输 不可靠(如电视机)
4 socket(套接字)
会话握手
设备与设备的基本通信原理
步骤:A->B
1、B设置监听端口(大一点8000+因为小号已经被占用了)
2、A->B要两大要素:
①、找到B的IP地址
②、找到B的监听端口
3、B监听到端口进行保留
4、进行传输和接收数据。。。
注意:传输的数据是以字节为单位(NSData)
首先确认跟另一台机子试下能否ping成功
ping 192.168.1.xx
ctrl + c 停止
准备:(client、server)
导入AsyncSocket类
在AsyncSocket.m 标记为 -fno-objc-arc
导入CFNetWork框架
server代码:
// // MXViewController.m // day1102_TCPSocketServer // // Created by tarena on 14-3-7. // Copyright (c) 2014年 tarena. All rights reserved. // #import "MXViewController.h" #import "AsyncSocket.h" @interface MXViewController () <AsyncSocketDelegate> @property (nonatomic, strong) AsyncSocket *serverSocket; @property (nonatomic, strong) AsyncSocket *inSocket; - (IBAction)tap:(id)sender; @end @implementation MXViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } - (IBAction)tap:(id)sender { self.serverSocket = [[AsyncSocket alloc] init]; self.serverSocket.delegate = self; // 监听端口 [self.serverSocket acceptOnPort:8000 error:Nil]; } -(void)onSocket:(AsyncSocket *)sock didAcceptNewSocket:(AsyncSocket *)newSocket{ self.inSocket = newSocket; NSLog(@"连接成功"); // 读取数据 [self.inSocket readDataWithTimeout:-1 tag:0]; // -1表示没有时间限制 一直接收 } -(void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag{ // NSString *text = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; // NSLog(@"%@", text); // // 对象反归档 NSKeyedUnarchiver *unarc = [[NSKeyedUnarchiver alloc] initForReadingWithData:data]; id playerObj = [unarc decodeObjectForKey:@"player"]; } @end
client代码:
// // MXViewController.m // day1101_TCPSocketClient // // Created by tarena on 14-3-7. // Copyright (c) 2014年 tarena. All rights reserved. // #import "MXViewController.h" #import "AsyncSocket.h" #import "MXPlayer.h" @interface MXViewController () @property (nonatomic, strong) AsyncSocket *clientSocket; - (IBAction)tap:(id)sender; - (IBAction)send:(id)sender; @property (weak, nonatomic) IBOutlet UITextField *textField; - (IBAction)sendMessage:(id)sender; @end @implementation MXViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } - (IBAction)tap:(id)sender { self.clientSocket = [[AsyncSocket alloc] init]; // 连接服务器 [self.clientSocket connectToHost:@"192.168.1.202" onPort:8000 withTimeout:-1 error:Nil]; } - (IBAction)send:(id)sender { NSData *data = [@"hello" dataUsingEncoding:NSUTF8StringEncoding]; [self.clientSocket writeData:data withTimeout:-1 tag:0]; } - (IBAction)sendMessage:(id)sender { MXPlayer *player = [[MXPlayer alloc] init]; player.name = self.textField.text; // 对象归档 对象->data NSMutableData *data = [NSMutableData data]; NSKeyedArchiver *arc = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data]; // 编码 [arc encodeObject:player forKey:@"player"]; [arc finishEncoding]; [self.clientSocket writeData:data withTimeout:-1 tag:0]; } @end
传输数据
对象 -> NSString ->Data 跨平台
对象 -> Data
用途:
和服务器进行数据交互
调用远程服务器应用程序的api,并传输对象
传输图像
client端有一个textField和一个获取按钮
server端什么都没有
在server端的程序上的documents目录下,存放图片到documents下
在client端输入图片名称,发送到server端
server端将同样名称的图片返回给client端
1.如果图片不再,
在客户端的另外一个label上显示没有这张图片
2.支持二次搜索