因爲程序要拿到不一樣的地區去展現,須要臨時搭建服務器,因此須要寫一段代碼來實現動態得到局域網中測試服務器的IP地址。java
這個須要一些網絡知識,雖然畢業於網絡專業,可是概念基本忘光,經查證,能夠用組播實現,大概的意思就是在局域網中224.0.0.0-239.255.255.255這個範圍的IP是保留地址,用於組播使用,當兩個終端加入到同一個組播的IP(同一網段沒有測試)時,能夠進行收發數據;服務器
而Java中對應實現多播的類是 MulticastSocket 網絡
具體實現代碼socket
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秒得不到局域網地址,就使用廣域網地址,因爲服務器不歸我管,服務器端的代碼是直接手打上去的,可能會有問題。ide