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();
}
}
2 番目のクラスをスキップすることもできます。それらはほとんど同じで、server.send を client.receive に置き換えるだけです。また、このクラスは実際に重要なことを行うようには設計されていません。そのため、多くのコード (例外処理など) は非常に単純化して記述されています。
パケットの損失を防ぐためにできることはありますか? 私は自分のコンピューターでポートを転送しています(問題ではありません。あなたが疑問に思っている場合は、App.Localであるローカルホストを使用しています)。
あと、横質問。私はもともと、パケットを送信し、向きを変えてパケットを受信するようにコード化された単一のクラスとしてセットアップしていました。しかし、「ICMP ポートに到達できない」ため、例外がスローされました。なぜこれが起こるのか誰か知っていますか?