
本文共 2755 字,大约阅读时间需要 9 分钟。
上一篇博文简述了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{ /**/ 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的开销是完全不同的。
发表评论
最新留言
关于作者
