作者:谷智精源 | 来源:互联网 | 2023-07-30 10:21
在相同的局域网内,可以通过Udp协议进行数据的传输和接收,Udp协议与Http协议不同,Udp更加方便快捷,省去了很多步骤,但是也有很多传输问题,在局域网内小范围传输数据时Udp还
在相同的局域网内,可以通过Udp协议进行数据的传输和接收,Udp协议与Http协议不同,Udp更加方便快捷,省去了很多步骤,但是也有很多传输问题,在局域网内小范围传输数据时Udp还是非常能够胜任的。
在iOS开发环境下,就要通过AsyncUdpSocket这个框架来进行Udp协议下的数据传输。
1.要添加AsyncUdpSocket框架文件到项目,并在需要使用Udp协议的类中加入其头文件
>(这两个文件在网上可以搜到)
2.对Socket进行实例化,并初始化
NSError * error =
Nil;
> //使用IPv4Heiti SC Light";‘>初始化一个Socket
> activeSocket
= [[AsyncUdpSocket>alloc]
initIPv4];
>
//设置委托为自身
>
[activeSocketsetDelegate>:self>];
> //PORT_ACTIVEHeiti SC Light";‘>为发送端口
>
[activeSocketbindToPort>:PORT_ACTIVEerror>:& error];
> //允许广播信息
>
[activeSocketenableBroadcast>:YESerror>:& error];
> //允许接受信息
>
[activeSocketreceiveWithTimeout>:-1tag>:0>];
3.在类中加入AsyncUdpSocket的委托
#pragma
mark - AsyncUdpSocket Delegate
- (BOOL)onUdpSocket:(>AsyncUdpSocket *)sock
didReceiveData:(NSData *)data
withTag:(long)tag fromHost:(>NSString *)host port:(UInt16)port
{
> returnYES;
}
- (void)onUdpSocket:(>AsyncUdpSocket *)sock
didNotReceiveDataWithTag:(>long)tag dueToError:(NSError
*)error
{
}
- (void)onUdpSocket:(>AsyncUdpSocket *)sock
didSendDataWithTag:(long)tag
{
}
- (void)onUdpSocket:(>AsyncUdpSocket *)sock
didNotSendDataWithTag:(long)tag
dueToError:(NSError *)error
{
}
- (void)onUdpSocketDidClose:(>AsyncUdpSocket *)sock
{
}
4.发送数据
> //theMessageHeiti SC Light";‘>为NSString,为需要发送的数据
> NSData
* data = [theMessage dataUsingEncoding:NSASCIIStringEncoding>] ;
>BOOL result = NO;
> //开始发送
> //pcHostHeiti SC Light";‘>为接收方的ip地址,255.255.255.255Heiti SC Light";‘>为向全域广播
> //thePort为发送端口
result = [theSocket >sendData:data
toHost:>pcHost
>port:thePort
withTimeout:>1000
tag:0];
>if (!result) {
> >NSLog(@"send
failed");
}
>else{
> >NSLog(@"send
succeed");
}
5.接收数据
接收数据的实现在委托中
- (BOOL)onUdpSocket:(>AsyncUdpSocket *)sock
didReceiveData:(NSData *)data
withTag:(long)tag fromHost:(>NSString *)host port:(UInt16)port
{
>//重新设置接收时间
> [sock
receiveWithTimeout:->1tag:>0];
>//info就为接收到的数据
> NSString
*info=[[NSStringalloc]
initWithData:data
encoding:
NSUTF8StringEncoding>];
> returnYES;
}