Я пытаюсь использовать дейтаграммы 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-порт недоступен».Кто-нибудь знает, почему это происходит?