UDP简单的分析以及TCP和Socket之间的区别
UDP:面向非连接、传输不可靠、用于传输少量数据(数据包模式)、速度快。
UDP不是面向连接的,UDP传送数据不需要和服务器连接,只需要知道ip和监听端口,不需要链接没有目的的socket,只是将数据报投递出去,不管接收方是否成功接收到,因此是一种不可靠的传输。
但是UDP的开销更小数据传输速率更高,因为不必进行收发数据的确认,所以UDP的实时性更好。
TCP:
是一种面向连接的传输控制协议(transform contorl protocol),必须要和服务器交互,具有高安全性,可靠性,需要和服务器进行三次握手,能根据具体网络拥堵情况进行延时。
Socket:
Socket有两种连接操作方式,面向连接的和面向无连接的。使用UDP就是面向无连接的,使用TCP就是面向连接的。使用UDP无需要指定一个socket目的地,而是用TCP必须要指定一个socket目的地,需要进行预链接,否则连接不到。
socket就像是API,二UDP/TCP就是协议,使用scoket来实现内容的传送。
UDP的通讯,我用的是AsyncUdpSocket文件,文件下载在http://blog.csdn.net/zhuxb523/article/details/51097728这篇文章中有介绍
代码是用于两个手机之间通过UDP进行通信传输
代码如下:
#import "ViewController.h"
#import "AsyncUdpSocket.h"
@interface ViewController ()<AsyncUdpSocketDelegate>
@property (strong ,nonatomic) AsyncUdpSocket* udpServerSocket;
@property (strong ,nonatomic) AsyncUdpSocket* udpClientSocket;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//服务端创建
_udpServerSocket = [[AsyncUdpSocket alloc] initWithDelegate:self];
//与你的发送消息到对应手机客户端的端口号保持一致
[_udpServerSocket bindToPort:8089 error:nil];
[_udpServerSocket receiveWithTimeout:60 tag:200];
//客户端创建
_udpClientSocket = [[AsyncUdpSocket alloc] initWithDelegate:self];
UIButton* btn = [UIButton buttonWithType:UIButtonTypeCustom];
btn.frame = CGRectMake(100, 100, 60, 30);
btn.backgroundColor = [UIColor cyanColor];
[btn addTarget:self action:@selector(btnAction) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn];
// Do any additional setup after loading the view, typically from a nib.
}
//客户端
-(void)btnAction
{
NSData* data = [@"嗯,你好" dataUsingEncoding:NSUTF8StringEncoding];
NSString* host = @"192.168.2.170";//需要发送消息的对方手机的IP
UInt16 port = 9080;//与你的发送消息到对应手机的客户端的端口号保持一致
[_udpClientSocket sendData:data toHost:host port:port withTimeout:60 tag:100];
}
//监听客户端是否发送成功
-(void)onUdpSocket:(AsyncUdpSocket *)sock didSendDataWithTag:(long)tag
{
if (tag == 100) {
NSLog(@"数据成功");
}
}
//服务端收到数据后的回调
-(BOOL)onUdpSocket:(AsyncUdpSocket *)sock didReceiveData:(NSData *)data withTag:(long)tag fromHost:(NSString *)host port:(UInt16)port
{
NSString* message = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"----1----%@",message);
[_udpServerSocket receiveWithTimeout:60 tag:200];
return YES;
}
@end