11 - 网络编程之设备间通信原理

一、网络编程

1表现形式:一台机子上的应用程序和另外一个设备的程序之间能够互相交换数据。

2 7层网络结构

硬件层:解决硬件连接问题

数据链路层:解决硬件之间能够向指定设备传输数据

IP:为设备提供一个虚拟的网络逻辑地址(门牌号)

MAC:设备的物理地址(网卡)

3 TCP / UDP

是两个不同的数据传输协议,就是解析字节的方式不同

目的:保证数据在设备和设备之间能够传输

协议:有结构的字节串

TCP 一对一传输 可靠

UDP 一对多传输 不可靠(如电视机)

4 socket(套接字)

会话握手

设备与设备的基本通信原理

步骤:A->B

1B设置监听端口(大一点8000+因为小号已经被占用了)

2A->B要两大要素:

    ①、找到BIP地址

    ②、找到B的监听端口

3B监听到端口进行保留

4、进行传输和接收数据。。。

注意:传输的数据是以字节为单位(NSData

 

首先确认跟另一台机子试下能否ping成功

ping 192.168.1.xx

ctrl + c 停止

 

准备:(clientserver

导入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.支持二次搜索

你可能感兴趣的:(网络编程)