iOS中的UDP通信

10 篇文章 0 订阅

      上一篇博文简述了TCP的通信,这里我们看看UDP如何通信,

1.前期工作

导入系统库、AsySocket和上文一致,注意头文件、代理和布局是不一样的。导入头文件


#import "AsyncUdpSocket.h"

UDP用 AsyncUdpSocketDelegate 代理。也用xib布局,不同之处就是页面内容了。

上边是两个TextField和一个Button,下边是一个TextView.。


2.代码实现

在ViewController.h里面声明成员变量

    IBOutlet UITextField* _ipField;
    IBOutlet UITextField* _textField;
    IBOutlet UITextView* _textView;
    //发送端 这里是用AsyncUdpSocket
    AsyncUdpSocket* _sendSocket;
    //接收端
    AsyncUdpSocket* _recvSocket;

注意要将对象上面的控件绑定一下

再为发送按钮声明方法

- (IBAction)sendText:(id)sender;

其余代码如下

- (void)viewDidLoad
{
    [super viewDidLoad];

    //接收端
    _recvSocket = [[AsyncUdpSocket alloc] initWithDelegate:self];
    [_recvSocket bindToPort:6789 error:nil];
    //开始监听接收消息
    [_recvSocket receiveWithTimeout:-1 tag:0];
    
    //发送端
    _sendSocket = [[AsyncUdpSocket alloc] initWithDelegate:self];
    [_sendSocket bindToPort:6788 error:nil];
}

//接收到消息 HOST 发送端ip
- (BOOL)onUdpSocket:(AsyncUdpSocket *)sock didReceiveData:(NSData *)data withTag:(long)tag fromHost:(NSString *)host port:(UInt16)port{
    /*
     <message>
        <name>
        <text>
     */
    GDataXMLDocument* doc = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil];
    GDataXMLElement* messageEle = [doc rootElement];
    GDataXMLElement* nameEle = [[messageEle elementsForName:@"name"] lastObject];
    GDataXMLElement* textEle = [[messageEle elementsForName:@"text"] lastObject];
    
    _textView.text = [NSString stringWithFormat:@"%@%@:%@\n", _textView.text, nameEle.stringValue, textEle.stringValue];
    
    //继续监听接收消息
    [_recvSocket receiveWithTimeout:-1 tag:0];
    return YES;
}


//发送消息
- (void)sendText:(id)sender
{
    GDataXMLElement* nameEle = [GDataXMLElement elementWithName:@"name" stringValue:@"gph"];
    GDataXMLElement* textEle = [GDataXMLElement elementWithName:@"text" stringValue:_textField.text];
    GDataXMLElement* messageEle = [GDataXMLElement elementWithName:@"message"];
    [messageEle addChild:nameEle];
    [messageEle addChild:textEle];
    
    GDataXMLDocument* doc = [[GDataXMLDocument alloc] initWithRootElement:messageEle];
    //发送
    [_sendSocket sendData:doc.XMLData toHost:_ipField.text port:6789 withTimeout:30 tag:0];
}

       这里我们为了美观起见,自定义了xml格式的消息来进行传递,并使用了第三方的GData来解析,关于这个库的使用后面文章将会细讲

  完整Demo在这里。如果没有积分请留邮箱。

3.总结

       TCP与UDP之间的区别体现在可靠性、快捷性等等方面,我们都知道TCP、UDP下层都是IP协议来实现的,但TCP是面向可靠的连接,先用三次握手来建立连接,提供了一条持续连接的链路,抽象意义上的链路。使用滑动窗口机制来保证可靠的传输,用流量控制和拥塞控制来保证网络的通畅。TCP(Transmission Control Protocol 传输控制协议)的报文段首部有20个字节的固定长度,而UDP(User Datagram Protocol用户数据报协议)只有8个,所以TCP的开销是比较大的,相比而言UDP则比较简单,不用创建链路,只要有目的IP和端口即可,将数据报的可靠性由IP协议来负责。拿我们生活中的例子,TCP就如同打电话,需要拨号来建立连接,再通话,最后结束通话,只要不挂断电话,连接就是存在的,对方一定能收到我们的信息。而UDP就像是发短信,发出去就不管了,对方收没收到不知道,什么时间收到也不知道,可靠性就靠运营商的网络质量了。在学生会时,只要用飞信或者短信发通知,都要加一句,收到请回复。因为我们不知道他什么时间收到,甚至收不到。而打电话则没有这种担忧。但是我们明白打电话与短信的费用是完全不同的,这一点就向TCP与UDP的开销是完全不同的。   

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值