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();
}
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。