编写简单的UDP应用
編寫(xiě)簡(jiǎn)單的UDP應(yīng)用
首先,編寫(xiě)發(fā)送UDP數(shù)據(jù)報(bào)的示例。這需要有個(gè)服務(wù)器端能接收到內(nèi)容。用Java寫(xiě)了個(gè)簡(jiǎn)單的接收端:
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()));
??? }
}
下面寫(xiě)發(fā)送的代碼:
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.");
執(zhí)行后,在接收端成功輸出如下內(nèi)容:
下面,寫(xiě)個(gè)接收端的代碼:
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");
另外,至少寫(xiě)這個(gè)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;
}
發(fā)送端,還是用java寫(xiě)個(gè)測(cè)試代碼:
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!
收到了數(shù)據(jù)報(bào)。
使用UDP發(fā)送和接收組播
這里主要關(guān)注的是接收,一方面是需求上要求,另一方面,碰到過(guò)Android Wifi獲取組播問(wèn)題,擔(dān)心iOS也有類似的機(jī)制。后來(lái)測(cè)試發(fā)現(xiàn)沒(méi)有那么麻煩(打開(kāi)組播鎖)。
為了測(cè)試,還是用java編寫(xiě)了個(gè)發(fā)送UDP廣播的簡(jiǎn)單代碼:
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.");
編寫(xiě)的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;
}
測(cè)試得到的日志:
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.
說(shuō)明是收到了。
發(fā)送組播和前面的UDP發(fā)送類似,只是多了要做join group的操作。這里就不多說(shuō)了。
?
?
?
社區(qū)原帖:http://www.cocoachina.com/bbs/read.php?tid=125575&fpage=3
轉(zhuǎn)載于:https://www.cnblogs.com/zhuchangsheng/p/5681974.html
總結(jié)
以上是生活随笔為你收集整理的编写简单的UDP应用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 阿里云中间件团队首次解密企业级分布式应用
- 下一篇: android 布局滑动中scrollT