Я отправляю очень большие (64000 байт) дейтаграммы . Я понимаю, что MTU намного меньше 64000 байт (типичное значение составляет около 1500 байт, исходя из моих данных), но я подозреваю, что произойдет одно из двух: либо дейтаграммы не пройдут (все, что больше 1500 байт) будет автоматически отброшен или вызовет ошибку / исключение), или дейтаграммы размером 64000 байт будут разбиты примерно на 43 сообщения по 1500 байт и переданы прозрачно.
В течение длительного периода времени (2000+ 64000 байт дейтаграмм) отбрасывается около 1% (что кажется ненормально высоким даже для LAN) дейтаграмм. Я мог бы ожидать этого в сети, где дейтаграммы могут приходить не по порядку, отбрасываться, фильтроваться и т. Д. Однако я не ожидал этого при работе на локальном хосте.
Что вызывает невозможность отправлять / получать данные локально? Я понимаю, что UDP ненадежен, но я не ожидал, что он будет настолько ненадежным на localhost. Мне интересно, не связана ли это просто с синхронизацией, поскольку и отправляющий, и получающий компоненты находятся на одном компьютере.
Для полноты я включил код для отправки / получения дейтаграмм.
Отправка:
DatagramSocket socket = new DatagramSocket(senderPort);
int valueToSend = 0;
while (valueToSend < valuesToSend || valuesToSend == -1) {
byte[] intBytes = intToBytes(valueToSend);
byte[] buffer = new byte[bufferSize - 4];
//this makes sure that the data is put into an array of the size we want to send
byte[] bytesToSend = concatAll(intBytes, buffer);
System.out.println("Sending " + valueToSend + " as " + bytesToSend.length + " bytes");
DatagramPacket packet = new DatagramPacket(bytesToSend,
bufferSize, receiverAddress, receiverPort);
socket.send(packet);
Thread.sleep(delay);
valueToSend++;
}
Получение:
DatagramSocket socket = new DatagramSocket(receiverPort);
while (true) {
DatagramPacket packet = new DatagramPacket(
new byte[bufferSize], bufferSize);
System.out.println("Waiting for datagram...");
socket.receive(packet);
int receivedValue = bytesToInt(packet.getData(), 0);
System.out.println("Received: " + receivedValue
+ ". Expected: " + expectedValue);
if (receivedValue == expectedValue) {
receivedDatagrams++;
totalDatagrams++;
}
else {
droppedDatagrams++;
totalDatagrams++;
}
expectedValue = receivedValue + 1;
System.out.println("Expected Datagrams: " + totalDatagrams);
System.out.println("Received Datagrams: " + receivedDatagrams);
System.out.println("Dropped Datagrams: " + droppedDatagrams);
System.out.println("Received: "
+ ((double) receivedDatagrams / totalDatagrams));
System.out.println("Dropped: "
+ ((double) droppedDatagrams / totalDatagrams));
System.out.println();
}