【JAVA】實現動態得到局域網中測試服務器地址

因爲程序要拿到不一樣的地區去展現,須要臨時搭建服務器,因此須要寫一段代碼來實現動態得到局域網中測試服務器的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

相關文章
相關標籤/搜索