我编写了一个小型UDP客户端,它将数据包发送到某个本地地址,另一个小型UDP客户端将接收它们并在控制台上打印其包含。他们目前没有工作,我不知道为什么。
这是发送代码:
import java.io.*;
import java.net.*;
class ClienteUDPtx {
static final String HOST = "192.168.1.201";
static final int PUERTO=20001;
/**
UDP Client which will send some UDP packets
to local network address 192.168.1.201 on port 20001
*/
public ClienteUDPtx( ) {
try{
int i = 0;
String[] ip_parts = HOST.split(".");
byte[] ip_num = {0, 0, 0, 0};
for (String string : ip_parts) {
ip_num[i++] = Byte.valueOf(string);
}
InetAddress ip = InetAddress.getByAddress(ip_num);
DatagramSocket skCliente = new DatagramSocket(PUERTO, ip);
DatagramPacket packet;
File testFile = new File("test.txt");
BufferedReader input = new BufferedReader(new FileReader(testFile));
String line;
while((line=input.readLine())!=null) {
System.out.println("Sending: " + line);
byte message[] = line.getBytes();
packet = new DatagramPacket(message, message.length, ip, PUERTO);
skCliente.send(packet);
Thread.currentThread().sleep(1000);
}
line = "END";
System.out.println("Sending: " + line);
byte message[] = line.getBytes();
packet = new DatagramPacket(message, message.length, ip, PUERTO);
skCliente.send(packet);
input.close();
skCliente.close();
} catch( Exception e ) {
System.out.println( e.getMessage() );
}
}
public static void main( String[] arg ) {
new ClienteUDPtx();
}
}
这是接收代码:
import java.io.*;
import java.net.*;
class ClienteUDPrx {
static final String HOST = "192.168.1.101";
static final int PUERTO=20001;
/**
UDP Client which will listen for incoming UDP packets
from local network address 192.168.1.101 on port 20001
and will print its content on console
*/
public ClienteUDPrx( ) {
try{
int i = 0;
String[] ip_parts = HOST.split(".");
byte[] ip_num = {0, 0, 0, 0};
for (String string : ip_parts) {
ip_num[i++] = Byte.valueOf(string);
}
InetAddress ip = InetAddress.getByAddress(ip_num);
DatagramSocket skCliente = new DatagramSocket(PUERTO, ip);
byte[] buffer = new byte[2048];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
while(true){
// Wait to receive a datagram
skCliente.receive(packet);
String lineaLeida = new String(buffer, 0, packet.getLength());
System.out.println(packet.getAddress().getHostName() + ": "+ lineaLeida);
if(lineaLeida.equals("END")) break;
}
skCliente.close();
System.out.println( "Transmission ended" );
} catch( Exception e ) {
System.out.println( e.getMessage() );
}
}
public static void main( String[] arg ) {
new ClienteUDPrx();
}
}
有什么想法吗?
答案 0 :(得分:1)
这里有一些错误。
第一个是创建InetAddress。而不是尝试将字节分离并从数组中重新创建它,您可以这样做:
InetAddress.getByName(HOST);
它刚刚失败,因为当您拆分HOST时,您将其拆分为正则表达式并使用“。”具有特殊含义所以实际上并不是基于'。'来拆分字符串。字符。
实际将它拆分为'。'你会这样做:
HOST.split("\\.")
但是你的字节解析失败了,因为字节在-128到+127之间(不是0到255)。
无论如何,这可能是因为你的错误打印造成混淆的原因。
这一行:
System.out.println( e.getMessage() );
正在打印出异常错误(在这种情况下只是'0' - “ArrayIndexOutOfBoundsException:0”)。
相反,你应该这样做:
e.printStackTrace();
获取有关出错的更多信息。
除了这些事情,我看不出任何明显的问题。
我还要指出UDP 检查消息的完整性。它不保证交付或交付顺序,因此您可能会错过数据包或有时将它们排除在序列之外,但它确实有一个校验和,其中包括消息的标题+有效负载。
答案 1 :(得分:0)
udp
并不能保证在[{1}} 收到数据包。
。Thread.currentThread()睡眠(1000); //如果你想收到消息,这是非常糟糕的
如果你真的想在另一边接收消息,你应该实现以下逻辑:
不检查消息的迭代性!
可能的解决方案是在消息之前发送消息的哈希并检查相等性。