Почему DatagramSocket capture() отбрасывает пакеты, а MulticastSocket — нет? На удаленном сервереJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Почему DatagramSocket capture() отбрасывает пакеты, а MulticastSocket — нет? На удаленном сервере

Сообщение Anonymous »

Я пытаюсь
  • понять, как мне следует работать с серверными сокетами для получения данных от удаленного клиента.
  • почему, когда данные клиента по VPN не теряются.
У меня есть клиентское и серверное приложение с сокетами UDP.
Когда я тестирую его в локальной сети, все работает без проблем. Но при запуске сервера на удаленном хостинге данные теряются.
Дело в том, что при подключении клиента к VPN клиент и сервер отправляют и получают правильно.
Клиентский код такой.
var serverConnection = new DatagramSocket();
// send registration to static ip (main server socket)
String portStr = String.valueOf(serverConnection.getLocalPort());
DatagramPacket registration = new DatagramPacket(
portStr.getBytes(),
portStr.getBytes().length,
remoteServerIP,
8560
);
serverConnection.send(registration);
// receiving information about new "client manager" socket on server
serverConnection.receive(response);
int port = Integer.parseInt(new String(response.getData()));
var group = new InetSocketAddress(remoteServerIP, port);
// code for open streams...
// Thread for sending
DatagramPacket packet = new DatagramPacket(audioBuffer, sampleRate, group);
while (true) {
if (micIsOn && micro.available() > 0) {
micro.read(audioBuffer, 0, audioBuffer.length);
serverConnection.send(packet);
}
}
// Thread for receiving
DatagramPacket packet = new DatagramPacket(audioBuffer, outputLine.getBufferSize());
while (true) {
try {
serverConnection.receive(packet);
outputLine.write(
audioBuffer,
0,
outputLine.getBufferSize()
);
outputLine.drain();
outputLine.flush();
} catch (IOException e) {
logger.log(ERROR, "End output audio!", e);
}
}

Код сервера, который я пробовал и работал в локальной сети:
// When start create main server soket this.serverAudio = new MulticastSocket(8560);
// after start Thread for register client and start receiving for other
serverAudio.receive(clientRegistration);
var client = new Client(
clientRegistration.getAddress(),
clientRegistration.getPort()
);
**DatagramSocket sender = new DatagramSocket();** // client manager on server side. Not work when DatagramSocket.
String portStr = String.valueOf(sender.getLocalPort());
serverAudio.send(new DatagramPacket(
portStr.getBytes(),
portStr.getBytes().length,
client.address(),
client.port()
));
startResend(sender, client, socketGroup);

Серверный код, который частично работает на удаленном хосте. Просто измените Datagram на Multicast.
// When start create main server soket this.serverAudio = new MulticastSocket(8560);
// after start Thread for register client and start receiving for other
serverAudio.receive(clientRegistration);
var client = new Client(
clientRegistration.getAddress(),
clientRegistration.getPort()
);
**MulticastSocket sender = new MulticastSocket ();** // client manager on server side. Receive but lost data when send to client.
String portStr = String.valueOf(sender.getLocalPort());
serverAudio.send(new DatagramPacket(
portStr.getBytes(),
portStr.getBytes().length,
client.address(),
client.port()
));
startResend(sender, client, socketGroup);

Метод повторной отправки
// resend method
private void startResend(
DatagramSocket sender,
Client client,
SocketGroup socketGroup
)
throws IOException
{
byte[] buffer = new byte[BUFFER_SIZE];
var packet = new DatagramPacket(
buffer,
BUFFER_SIZE
);
var toGroup = new DatagramPacket(
buffer,
BUFFER_SIZE,
socketGroup.mcastaddr() // 225.x.x.x
);
var toClient = new DatagramPacket(
buffer,
BUFFER_SIZE,
client.address(),
client.port()
);
new Thread(() -> {
while (true) {
try {
sender.receive(packet); // never receive when 'sender' is instance of DatagramSocket. But receive when MulticastSocket
if (packet.getAddress().equals(client.address())
&& packet.getPort() == client.port()
) {
sender.send(toGroup);
continue;
}
sender.send(toClient);
} catch (IOException e) {
log.error("Error", e);
throw new RuntimeException(e);
}
}
}).start();
}


Подробнее здесь: https://stackoverflow.com/questions/792 ... -is-not-on
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»