Java Datagramsを使用してサーバーとクライアントの間にパケットストリームを作成しようとしています。問題は、パケットが送信されているという確認を受け取ったにもかかわらず、設定したクライアントリスナにパケットが届く前にパケットが失われていることです。私は今すぐ持っているので、5秒後にタイムアウトが発生します。これは実行するたびに発生します。Java Datagramソケットがパケットを受信しない
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();
}
}
2番目のクラスをスキムオーバーすることもできます。それらは広く同じで、単にserver.sendをclient.receiveに置き換えます。また、このクラスは本当に重要なことをするようには設計されていませんでした。だから、多くのコード(Exception handlingなど)は非常に単純化されて書かれています。
パケットの損失を防ぐためにできることはありますか?私はポートを自分のコンピュータに転送しました(それは問題ではありません、私はlocalhostを使用しています、あなたが疑問に思った場合にはApp.Localです)。
また、サイド質問です。私はもともとそれが単一のクラスとして設定されていて、パケットを送信するようにコード化されていて、振り返って受信しました。しかし、「ICMPポートに到達できないため」例外がスローされました。誰がなぜこれが起こるのか知っていますか?
どのようにそれらが失われていることを知っていますか? wiresharkのようなパケットトレーサを設定して、どこに行くのか見てみましたか? – javamonkey79