编写简单的UDP应用
首先,编写发送UDP数据报的示例。这需要有个服务器端能接收到内容。用Java写了个简单的接收端:
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()));
}
}
下面写发送的代码:
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.");
执行后,在接收端成功输出如下内容:
下面,写个接收端的代码:
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方法:
- (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写个测试代码:
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日志中:
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广播的简单代码:
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代码:
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一模一样:
- (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;
}
测试得到的日志:
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的操作。这里就不多说了。
社区原帖:http://www.cocoachina.com/bbs/read.php?tid=125575&fpage=3