iphone --CocoaAsyncSocket(2)

来源:互联网 发布:网络终端机安装方法 编辑:程序博客网 时间:2024/05/22 06:25
 

编写简单的UDP应用

首先,编写发送UDP数据报的示例。这需要有个服务器端能接收到内容。用Java写了个简单的接收端:

1234567891011121314
public static void main(String[] args) throws IOException { InetSocketAddress address = new InetSocketAddress("0.0.0.0", 5555); DatagramSocket datagramSocket=new DatagramSocket(address);  System.out.println("start udp server");  byte[] buffer=new byte[1024]for(;;){ DatagramPacket datagramPacket=new DatagramPacket(buffer, buffer.length); datagramSocket.receive(datagramPacket); System.out.println("receive data:"+new String(datagramPacket.getData(),0,datagramPacket.getLength())); }}

下面写发送的代码:

12345
AsyncUdpSocket *socket=[[AsyncUdpSocket alloc]initWithDelegate:self]NSData *data=[@"Hello from iPhone" dataUsingEncoding:NSUTF8StringEncoding];[socket sendData:data toHost:@"192.168.0.165" port:5555 withTimeout:-1 tag:1];NSLog(@"send upd complete.");

执行后,在接收端成功输出如下内容:

下面,写个接收端的代码:

1234567891011
AsyncUdpSocket *socket=[[AsyncUdpSocket alloc] initWithDelegate:self]NSError *error = nil; [socket bindToPort:5555 error:&error]if (error) { NSLog(@"error: %@",error); }  [socket receiveWithTimeout:-1 tag:1]; NSLog(@"start udp server");

另外,至少写这个delegate方法:

12345678
- (BOOL)onUdpSocket:(AsyncUdpSocket *)sock didReceiveData:(NSData *)data withTag:(long)tag fromHost:(NSString *)host port:(UInt16)port{ NSLog(@"received data: %@",[[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease]); return YES; }

发送端,还是用java写个测试代码:

1234567
public static void main(String[] args) throws IOException { DatagramSocket datagramSocket = new DatagramSocket(); byte[] buffer = "Hello!".getBytes(); DatagramPacket datagramPacket = new DatagramPacket(buffer, buffer.length, new InetSocketAddress("192.168.0.144", 5555)); datagramSocket.send(datagramPacket); }

在iPhone日志中:

12
2011-07-20 15:23:33.571 SocketDemos[795:707] start udp server     2011-07-20 15:23:47.395 SocketDemos[795:707] received data: Hello

收到了数据报。

使用UDP发送和接收组播

这里主要关注的是接收,一方面是需求上要求,另一方面,碰到过Android Wifi获取组播问题,担心iOS也有类似的机制。后来测试发现没有那么麻烦(打开组播锁)。

为了测试,还是用java编写了个发送UDP广播的简单代码:

123456789
public static void main(String[] args) throws IOException { int port=3333; MulticastSocket socket=new MulticastSocket(port); InetAddress address=InetAddress.getByName("239.0.0.1"); socket.joinGroup(address); byte[] data="Hello everyone.".getBytes(); DatagramPacket datagramPacket=new DatagramPacket(data,data.length,address,port); socket.send(datagramPacket); System.out.println("send ok.");

编写的iOS代码:

12345678910111213
AsyncUdpSocket *socket=[[AsyncUdpSocket alloc] initWithDelegate:self]NSError *error = nil; [socket bindToPort:3333 error:&error]; [socket enableBroadcast:YES error:&error]; [socket joinMulticastGroup:@"239.0.0.1" error:&error]if (error) { NSLog(@"error: %@",error); }  [socket receiveWithTimeout:-1 tag:1]; NSLog(@"start udp server");

delegate和上面接收普通UDP一模一样:

12345678
- (BOOL)onUdpSocket:(AsyncUdpSocket *)sock didReceiveData:(NSData *)data withTag:(long)tag fromHost:(NSString *)host port:(UInt16)port{ NSLog(@"received data: %@",[[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease]); return YES;}

测试得到的日志:

12
2011-07-20 16:14:30.338 SocketDemos[860:707] start udp server     2011-07-20 16:14:42.829 SocketDemos[860:707] received data: Hello everyone.

说明是收到了。

发送组播和前面的UDP发送类似,只是多了要做join group的操作。这里就不多说了。

原创粉丝点击