当前位置: 首页>移动开发>正文

iOS的udp阻塞 ios14 udp

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

1.前期工作

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

#import "AsyncUdpSocket.h"


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

iOS的udp阻塞 ios14 udp,iOS的udp阻塞 ios14 udp_UDP,第1张

上边是两个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来解析,关于这个库的使用后面文章将会细讲。

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的开销是完全不同的。   


https://www.xamrdz.com/mobile/4s71960431.html

相关文章: