附上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'异常。