我正在尝试使用 Java 数据报在服务器和客户端之间创建数据包流。问题是,虽然我收到了正在发送数据包的确认信息,但它们在到达我设置的客户端侦听器之前都丢失了。我现在拥有它,因此 5 秒后会出现超时,每次运行时都会发生这种情况。
class DGServer extends Thread
{
private DatagramSocket server;
public DGServer() throws IOException
{
server = new DatagramSocket();
}
public void run()
{
try
{
server.connect(App.Local, 4200);
System.out.println("Server starting...");
int i = 0;
while (server.isConnected() && (i < 256))
{
byte[] buffer = new byte[1];
buffer[0] = (byte) ++i;
DatagramPacket packet = new DatagramPacket(buffer, buffer.length, App.Local, 4200);
System.out.println("Sedning " + i + " to client...");
server.send(packet);
Thread.sleep(500);
}
}
catch (Exception e)
{
e.printStackTrace();
}
System.out.println("Server Finished!");
if (! server.isClosed())
server.close();
}
}
class DGClient extends Thread
{
private DatagramSocket client;
public DGClient() throws SocketException
{
client = new DatagramSocket();
}
public void run()
{
try
{
client.connect(App.Local, 4200);
client.setSoTimeout(5000);
System.out.println("Client starting...");
int i = 0;
while (client.isConnected() && (i < 256))
{
byte[] buffer = new byte[1];
DatagramPacket packet;
packet = new DatagramPacket(buffer, 1, App.Local, 4200);
//System.out.println("Sedning " + i + " to server...");
client.receive(packet);
buffer = packet.getData();
System.out.println("Client Received:\t" + packet.getData()[0]);
Thread.sleep(500);
}
}
catch (Exception e)
{
e.printStackTrace();
}
System.out.println("Client Finished!");
if (! client.isClosed())
client.close();
}
}
你可以选择略读第二课。它们大体相同,只是将 server.send 替换为 client.receive。此外,这个类并不是为了真正做任何重要的事情而设计的。所以,很多代码(比如异常处理)都写得很简单。
我能做些什么来防止数据包丢失吗?我在我的计算机上转发了端口(没关系,我使用的是我的本地主机,如果你想知道它是 App.Local)。
另外,边问。我最初将它设置为一个单独的类,编码为发送一个数据包,然后转身接收一个数据包。但它抛出了一个异常,因为“ICMP 端口无法访问”。有谁知道为什么会这样?