Android. 开启udp广播,【报Bug】android调用系统api实现udp广播不能获取ip地址

附上java原生代码:

client.java

package client;

import java.io.IOException;

import java.io.InterruptedIOException;

import java.net.DatagramPacket;

import java.net.DatagramSocket;

import java.net.InetAddress;

public class Client {

private static final int TIMEOUT = 5000; // 设置接收数据的超时时间

private static final int MAXNUM = 5; // 设置重发数据的最多次数

public static void main(String args[]) throws IOException {

String str_send = "Hello UDPserver";

byte[] buf = new byte[1024];

DatagramSocket ds = new DatagramSocket();

InetAddress loc = InetAddress.getByName("255.255.255.255");

// 定义用来发送数据的DatagramPacket实例

DatagramPacket dp_send = new DatagramPacket(str_send.getBytes(),

str_send.length(), loc, 8080);

// 定义用来接收数据的DatagramPacket实例

DatagramPacket dp_receive = new DatagramPacket(buf, 1024);

ds.setSoTimeout(TIMEOUT); // 设置接收数据时阻塞的最长时间

int tries = 0; // 重发数据的次数

boolean receivedResponse = false; // 是否接收到数据的标志位

// 直到接收到数据,或者重发次数达到预定值,则退出循环

while (!receivedResponse && tries < MAXNUM) {

// 发送数据

ds.send(dp_send);

try {

// 接收从服务端发送回来的数据

ds.receive(dp_receive);

// 如果接收到数据。则将receivedResponse标志位改为true,从而退出循环

receivedResponse = true;

} catch (InterruptedIOException e) {

// 如果接收数据时阻塞超时,重发并减少一次重发的次数

tries += 1;

System.out.println("Time out," + (MAXNUM - tries)

+ " more tries...");

}

}

if (receivedResponse) {

// 如果收到数据,则打印出来

System.out.println("client received data from server:");

String str_receive = new String(dp_receive.getData(), 0,

dp_receive.getLength())

+ " from "

+ dp_receive.getAddress().getHostAddress() // 可以获取IP

+ ":"

+ dp_receive.getPort();

System.out.println(str_receive);

// 由于dp_receive在接收了数据之后,其内部消息长度值会变为实际接收的消息的字节数,

// 所以这里要将dp_receive的内部消息长度重新置为1024

dp_receive.setLength(1024);

} else {

// 如果重发MAXNUM次数据后,仍未获得服务器发送回来的数据,则打印如下信息

System.out.println("No response -- give up.");

}

ds.close();

}

}

server.java

package server;

import java.io.IOException;

import java.net.DatagramPacket;

import java.net.DatagramSocket;

public class Server {

public static void main(String[] args) throws IOException {

String str_send = "Hello UDPclient";

byte[] buf = new byte[1024];

DatagramSocket ds = new DatagramSocket(8080);

// 接收从客户端发送过来的数据

DatagramPacket dp_receive = new DatagramPacket(buf, 1024);

System.out

.println("server is on,waiting for client to send data......");

boolean f = true;

while (f) {

// 服务器端接收来自客户端的数据

ds.receive(dp_receive);

System.out.println("server received data from client:");

String str_receive = new String(dp_receive.getData(), 0,

dp_receive.getLength())

+ " from "

+ dp_receive.getAddress().getHostAddress()

+ ":"

+ dp_receive.getPort();

System.out.println(str_receive);

DatagramPacket dp_send = new DatagramPacket(str_send.getBytes(),

str_send.length(),dp_receive.getAddress(),dp_receive.getPort());

ds.send(dp_send);

// 由于dp_receive在接收了数据之后,其内部消息长度值会变为实际接收的消息的字节数,

// 所以这里要将dp_receive的内部消息长度重新置为1024

dp_receive.setLength(1024);

}

ds.close();

}

}

java原生代码getAddress().getHostAddress()方法获取数据正常,native.js返回Uncaught TypeError: Object # has no method 'getHostAddress'异常。

你可能感兴趣的:(Android.,开启udp广播)