Socket下的UDP协议简介(小案例解说)

猛练自然强

本文介绍UDP协议的简单模拟场景demo.

首先介绍一下每个字眼:
HTTP/XMPP: 都是数据传输格式的协议.(这里不作累述)
TCP和UDP: 都是数据传输方式的协议.比如说我要给你钱, 我是以手把手的方式拿给你呢还是以快递的方式寄给你呢.

TCP(传输控制协议)

  • 需要经过三次握手建立连接,形成一条传输通道,不断传输数据
  • 传输数据的大小不受限制
  • 是安全可靠的协议,但是速度稍慢

UDP(用户数据报协议)

  • 不需要建立连接, 把数据封装成数据包扔给对面
  • 每个数据包大小限制在64K内
  • 因为不建立连接,所以对方可能收到也可能收不到数据(丢包),因此是不安全的协议, 但是速度比较快

什么时候用TCP,什么时候用UDP:##

对速度要求比较高的时候使用UDP, 对数据安全要求比较高的时候使用TCP.
比如说视频聊天, QQ聊天, 就用UDP; 数据传输,文件下载,就用TCP.
假如对于视频聊天来说,如果画质优先那就选用TCP, 如果流畅度优先那就选用UDP.

什么是Socket###

Socket应用于两个不同客户端之间的通信及数据传输.中文名字叫套接字.
编程源于生活. 打个活生生的例子来说, 汽车和加油机.我们如果想把加油机里面的油输到汽车上, 那么汽车这边需要有一个端口, 加油机这边也要有一个端口, 两边端口各加一个套接头套着(好比adaptor),然后中间连上管道来输油. 我认为Socket的角色就是这个套接头.
简单来说, 要想在两个客户端之间传数据, 那么两个客户端各自都要有一个Socket.

UDP协议下,一个客户端如何发数据给另一个客户端

如果客户端B想给客户端A发数据, 那么就需要知道两个东西, 一个是客户端A的IP地址, 一个是端口号.就好像你让我给一部车加油, 我需要知道是哪部车(IP)和这部车的哪个洞是加油洞(端口号).

下面我们用demo模拟两个客户端间通过UDP协议来发送数据.

思路如下:
客户端A:
1.用Xcode新建一个OC工程clientA作为客户端A, 它是接收方.
2.导入socket框架(把下载好的GCDAsyncUdpSocket.h和.m拖进工程即可)并import头文件

Paste_Image.png

3.创建Socket对象
4.连接端口号
5.开启接收数据
6.遵守GCDAsyncUdpSocketDelegate协议,实现didReceiveData的代理方法,在里面拿到接收的数据.

客户端B:
1.用Xcode新建一个命令行工程clientB作为客户端B,它是发送方.
2.导入socket框架并import头文件(同上)
3.创建Socket对象
4.调用方法发送数据给客户端A(需要知道clientA的IP和端口号)

代码如下:

客户端A(clientA):

#import "ViewController.h"
#import "GCDAsyncUdpSocket.h"

@interface ViewController ()<GCDAsyncUdpSocketDelegate>

@property(nonatomic, strong) GCDAsyncUdpSocket *udpSocket;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //创建套接字socket
    self.udpSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
    
    //绑定端口号
    NSError *error = nil;
    [self.udpSocket bindToPort:5555 error:&error];
    if (!error) {
        NSLog(@"绑定端口成功");
    }else {
        NSLog(@"绑定端口失败");
    }
    
    //开启监听数据接收
    [self.udpSocket beginReceiving:&error];
    if (!error) {
        NSLog(@"开启监听数据成功");
    }else {
        NSLog(@"开启监听数据失败");
    }
}

//实现代理方法接收数据
-(void)udpSocket:(GCDAsyncUdpSocket *)sock didReceiveData:(NSData *)data fromAddress:(NSData *)address withFilterContext:(id)filterContext{
    
    //把接收到的data转化为NSString
    NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    
    //打印string
    NSLog(@"接收到数据 %@", string);
    
}

@end

客户端B(clientB):

#import <Foundation/Foundation.h>
#import "GCDAsyncUdpSocket.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        //创建udpSocket对象
        GCDAsyncUdpSocket *udpSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:nil delegateQueue:dispatch_get_main_queue()];
        
        //创建要发送的data
        NSString *string = @"Wales万岁,Wales永垂不朽!";
        NSData *sentData = [string dataUsingEncoding:NSUTF8StringEncoding];
        
        //发送data到clientA
        //Host: 要发送到的IP地址
        //port:要发送到的端口号
        [udpSocket sendData:sentData toHost:@"127.0.0.1" port:5555 withTimeout:-1 tag:0];
        
        //为了防止该程序一启动就挂掉
        [[NSRunLoop mainRunLoop] run];
        
    }
    return 0;
}

两个工程(客户端)一起运行后, 客户端B给A发送了一个数据,在客户端A中打印的结果如下:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容

  • 个人认为,Goodboy1881先生的TCP /IP 协议详解学习博客系列博客是一部非常精彩的学习笔记,这虽然只是...
    贰零壹柒_fc10阅读 5,019评论 0 8
  • 1.这篇文章不是本人原创的,只是个人为了对这部分知识做一个整理和系统的输出而编辑成的,在此郑重地向本文所引用文章的...
    SOMCENT阅读 12,979评论 6 174
  • 1.1 TCP/IP协议组 TCP/IP协议(传输控制协议)由网络层的IP协议和传输层的TCP协议组成 IP层负责...
    F麦子阅读 2,755评论 0 25
  • 参考:http://www.2cto.com/net/201611/569006.html TCP HTTP UD...
    F麦子阅读 2,903评论 0 14
  • 假设有两个表,订单表和产品表,订单跟产品的关系是一对多的关系,那么在JPA中怎样表示一对多的关系呢?实体关系一对多...
    姜小码阅读 16,963评论 0 3