由于程序要拿到不同的地区去展示,需要临时搭建服务器,所以需要写一段代码来实现动态获得局域网中测试服务器的IP地址。
这个需要一些网络知识,虽然毕业于网络专业,但是概念基本忘光,经查证,可以用组播实现,大概的意思就是在局域网中224.0.0.0-239.255.255.255这个范围的IP是保留地址,用于组播使用,当两个终端加入到同一个组播的IP(同一网段没有测试)时,可以进行收发数据;
而Java中对应实现多播的类是 MulticastSocket
具体实现代码
private MulticastSocket multicastSocket = null;
private static int BROADCAST_PORT = 9988;
private static String BROADCAST_IP = "224.0.0.1";
private InetAddress inetAddress = null;
private static String ip = "119.75.218.77";
/**
* 获得局域网的服务器地址
*/
private void getLANServerIP() {
try {
multicastSocket = new MulticastSocket(
BROADCAST_PORT);
inetAddress = InetAddress.getByName(BROADCAST_IP);
multicastSocket.joinGroup(inetAddress);
byte[] buf = new byte[1024];
DatagramPacket dp = null;
dp = new DatagramPacket(buf, buf.length, inetAddress, BROADCAST_PORT);
new Timer().schedule(new TimerTask() {
@Override
public void run() {
try {
multicastSocket.leaveGroup(inetAddress);
} catch (IOException e) {
e.printStackTrace();
}
multicastSocket.close();
}
}, 3*1000);
multicastSocket.receive(dp);
String str = new String(buf, 0, dp.getLength());
if("我是服务器".equals(str)){
InetAddress serverAdd = dp.getAddress();
ip = serverAdd.toString().substring(1);
}
System.out.println("服务器地址:" + ip);
} catch (IOException e) {
//e.printStackTrace();
System.out.println("未得到局域网服务器地址");
}
}
/**
* 服务器端
*/
private void mServer(){
final MulticastSocket socket = new MulticastSocket(9988);
try {
InetAddress address = InetAddress.getByName("224.0.0.1");
socket.joinGroup(address);
} catch (IOException e1) {
e1.printStackTrace();
}
byte[] buf = "我是服务器".getBytes();
DatagramPacket packet = new DatagramPacket(buf, buf.length, address, 9999);
Timer t = new Timer();
t.schedule(new TimerTask() {
@Override
public void run() {
try {
socket.send(packet);
} catch (IOException e) {
e.printStackTrace();
}
}
}, 0, 2 * 1000);
}
中间写有计时器,如果3秒得不到局域网地址,就使用广域网地址,由于服务器不归我管,服务器端的代码是直接手打上去的,可能会有问题。