java实现udp通讯的代码
需求:应用A(通常有多个)和应用B(1个)进行socket通讯,应用A必须知道应用B的ip地址(在应用A的配置文件中写死的),这个时候就必须把应用B的ip设成固定ip(但是某些时候如更换路由后要重新设置网络,但是操作人员不知道这个规则),就有可能造成应用A和应用B无法进行正常通讯,所以要改成应用A动态获取应用B的ip地址。
经过讨论决定采用udp协议实现,upd是一种无连接的传输层协议。应用A在不知道应用B的ip情况下可以使用广播地址255.255.255.255,将消息发送到在同一广播网络上的B。从而获取B的ip。
实现代码:
B应用为服务端:将udp监听放到一个线程中,当有客户端请求时就会进行响应
/** *udp连接,用于动态ip,pos向255.255.255.255:5060发送请求即可 ***/ publicclassUdpServerextendsThreadimplementsRunnable{ privatefinalintMAX_LENGTH=1024; privatefinalintPORT=5060; privateDatagramSocketdatagramSocket; publicvoidrun(){ try{ init(); while(true){ try{ byte[]buffer=newbyte[MAX_LENGTH]; DatagramPacketpacket=newDatagramPacket(buffer,buffer.length); receive(packet); StringreceStr=newString(packet.getData(),0,packet.getLength()); System.out.println("接收数据包"+receStr); byte[]bt=newbyte[packet.getLength()]; System.arraycopy(packet.getData(),0,bt,0,packet.getLength()); System.out.println(packet.getAddress().getHostAddress()+":"+packet.getPort()+":"+Arrays.toString(bt)); packet.setData(bt); response(packet); }catch(Exceptione){ e.printStackTrace(); LoggerUtil.error("udp线程出现异常:"+e.toString()); } } }catch(Exceptione){ e.printStackTrace(); } } publicvoidreceive(DatagramPacketpacket)throwsException{ datagramSocket.receive(packet); } publicvoidresponse(DatagramPacketpacket)throwsException{ datagramSocket.send(packet); } /** *初始化连接 */ publicvoidinit(){ try{ datagramSocket=newDatagramSocket(PORT); System.out.println("udp服务端已经启动!"); }catch(Exceptione){ datagramSocket=null; System.out.println("udp服务端启动失败!"); e.printStackTrace(); } } }
客户端:本来客户端是使用pb来实现的,但是这里使用java来模拟
/*** *UDPClient端 ***/ publicclassUdpClient{ privateStringsendStr="hello"; privateStringnetAddress="255.255.255.255"; privatefinalintPORT=5060; privateDatagramSocketdatagramSocket; privateDatagramPacketdatagramPacket; publicUdpClient(){ try{ datagramSocket=newDatagramSocket(); byte[]buf=sendStr.getBytes(); InetAddressaddress=InetAddress.getByName(netAddress); datagramPacket=newDatagramPacket(buf,buf.length,address,PORT); datagramSocket.send(datagramPacket); byte[]receBuf=newbyte[1024]; DatagramPacketrecePacket=newDatagramPacket(receBuf,receBuf.length); datagramSocket.receive(recePacket); StringreceStr=newString(recePacket.getData(),0,recePacket.getLength()); //获取服务端ip StringserverIp=recePacket.getAdress(); }catch(SocketExceptione){ e.printStackTrace(); }catch(UnknownHostExceptione){ e.printStackTrace(); }catch(IOExceptione){ e.printStackTrace(); }finally{ //关闭socket if(datagramSocket!=null){ datagramSocket.close(); } } } publicstaticvoidmain(String[]args){ for(inti=0;i<100;i++){ newThread(newRunnable(){ @Override publicvoidrun(){ UdpClientudpClient=newUdpClient(); } }).start(); } } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。