powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Почему DatagramSocket принимает не всё ?
21 сообщений из 21, страница 1 из 1
Почему DatagramSocket принимает не всё ?
    #39783414
bobo96
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.
Есть сервер:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
public class Server {

    public static void main(String[] args) {

        ExecutorService executorService = Executors.newFixedThreadPool(10);

        try(DatagramSocket serverSocket = new DatagramSocket(8888)) {

            while(true) {

                byte[] receiveData =                        new byte[64];
                DatagramPacket receivePacket =              new DatagramPacket(receiveData, receiveData.length);
                serverSocket.receive(receivePacket);

                executorService.submit(new ConnectThread(receivePacket));

            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            executorService.shutdown();
        }

    }

    static class ConnectThread
        implements Runnable {

        private DatagramPacket receivePacket;

        ConnectThread(DatagramPacket receivePacket) {
            this.receivePacket = receivePacket;
        }

        @Override
        public void run() {
            System.out.println(new String(receivePacket.getData()));
        }
    }

}



Есть клиент:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
public class Client {

    public static void main(String[] args) {

        send("send1");
        send("send2");
        send("send3");
        send("send4");
        send("send5");
        send("send6");

    }

    private static void send(String str) {

        try(DatagramSocket clientSocket = new DatagramSocket()) {
            clientSocket.send(new DatagramPacket(str.getBytes(), str.getBytes().length,
                 InetAddress.getByName("127.0.0.1"), 8888));
        }
        catch (IOException e) {
            e.printStackTrace();
        }
    }

}



Запускал 100500 раз, на выходе всегда send1
Остальное почему теряется и как сделать, что бы не терялось ?
Спасибо!
...
Рейтинг: 0 / 0
Почему DatagramSocket принимает не всё ?
    #39783469
Фотография by-pass
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Серверный сокет Вы открываете один раз, а клиентский каждый раз.
Порт, скорее всего, еще занят.
...
Рейтинг: 0 / 0
Почему DatagramSocket принимает не всё ?
    #39783482
am_sasa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
bobo96,

UDP протокол без подтверждения.
Поставь задержку между send, хотя бы 50 млс.
...
Рейтинг: 0 / 0
Почему DatagramSocket принимает не всё ?
    #39783499
bobo96
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это было первое, на что я грешил.
Ставил задержку и по 3 сек. результат тот же.
...
Рейтинг: 0 / 0
Почему DatagramSocket принимает не всё ?
    #39783745
bobo96
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Больше вариантов ни у кого нет ? :(
...
Рейтинг: 0 / 0
Почему DatagramSocket принимает не всё ?
    #39783792
Sergunka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bobo96Больше вариантов ни у кого нет ? :(

А почему у Вас порты на клиенте и сервере совпадают?
...
Рейтинг: 0 / 0
Почему DatagramSocket принимает не всё ?
    #39783804
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bobo96,

В датаграмных сокетах нет буферизации и повторов. И если принимающая сторона не
Успела среагировать на следующий пакет то он будет потерян.

Почему у тебя происходят потери - пока неясно. Но думаю что детальное логгирование с точностью до микросекунд покажет что некоторые операции принимающая сторона делает не настолько быстро
Как необходимо.
...
Рейтинг: 0 / 0
Почему DatagramSocket принимает не всё ?
    #39783830
irbis_al
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bobo96,
Я может уже консервативен ...но вот в толк не возьму почему используете лишние элементы
Вот нафиг executorService.submit(new ConnectThread(receivePacket));
Вы же уже объявили Runnable
Почему не классически
Код: java
1.
(new Thread(new ConnectThread(receivePacket))).start();


Во вложении пример рабочий пример Sender Receiver
(Сфера приминения кода рассылать от сканированной сканером штрихкода(или вес от весов) по сети значение )
Используется гпупповой host 228.5.6.7 Чтоб кричало на всю сеть.
Типа Ис на одном компе весы на другом ,но тот другой получает вес.
Если хотите ограничить только локально в линуксе
Код: xml
1.
2.
3.
файл gedit /etc/sysconfig/network-scripts/route-lo
Добавить строчку
228.5.6.7 via 0.0.0.0 dev lo


Как в винде не знаю.Брэндмаэуром можно ограничить.(Правда в моем опыте иногда проскакивало)
...
Рейтинг: 0 / 0
Почему DatagramSocket принимает не всё ?
    #39783847
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В приёмнике датаграм-сокета надо в первую очередь принимать пакеты и складывать их в кольцевой буфер.
И эта операция должна быть максимально быстрой. Дальше - уже обрабатывать их как угодно с минимумом
блокировок. И executor даже с 100 и с 1000 потоками нам здесь не помошник.
...
Рейтинг: 0 / 0
Почему DatagramSocket принимает не всё ?
    #39783876
bobo96
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем огромное спасибо!
maytonВ приёмнике датаграм-сокета надо в первую очередь принимать пакеты и складывать их в кольцевой буфер.
И эта операция должна быть максимально быстрой.
Можно чутка подробнее про "принимать пакеты и складывать их в кольцевой буфер. И эта операция должна быть максимально быстрой." ?
...
Рейтинг: 0 / 0
Почему DatagramSocket принимает не всё ?
    #39783877
bobo96
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
irbis_alВот нафиг executorService.submit(new ConnectThread(receivePacket));
Как-то давненько один уважаемый человек с этого форума посоветовал подобные вещи вот таким вот образом обрабатывать.
...
Рейтинг: 0 / 0
Почему DatagramSocket принимает не всё ?
    #39783894
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bobo96Всем огромное спасибо!
maytonВ приёмнике датаграм-сокета надо в первую очередь принимать пакеты и складывать их в кольцевой буфер.
И эта операция должна быть максимально быстрой.
Можно чутка подробнее про "принимать пакеты и складывать их в кольцевой буфер. И эта операция должна быть максимально быстрой." ?
Давай пока отменим буферы.

Новый эксперимент. Давайте толкнем не 6 а 600 сообщений. И закомментарим executor. И добавим счётчик.
Далее по результатам посмотрим.
...
Рейтинг: 0 / 0
Почему DatagramSocket принимает не всё ?
    #39783925
Sergunka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТС,

разберитесь с портами для начала. Нельзя писать и читать в один порт по контракту для вебсокета на одном IP.

Для примера у меня есть задание, которое мне дали на 4 часа в Сан Франциско написать UDP сервер-клиент посмотрите найдете много для себя интересного - я сам в шоке было дело пять лет назад

https://github.com/SVyatkin/tcp-server-java-example

Код с нио я честно скомуниздил у кого-то крутого перца Вам видимо надо что-то подобное приписать в своем коде

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
	
               public void handleRead(SelectionKey key) throws IOException {
		// Client socket channel has pending data
		SocketChannel clientChannel = (SocketChannel) key.channel();
		ByteBuffer buf = (ByteBuffer) key.attachment();
		long bytesRead = clientChannel.read(buf);

		if (bytesRead == -1)
			clientChannel.close();
		else if (bytesRead > 0)  {
			System.out.println("bytes:" + bytesRead + ":Message: " + new String(buf.array()));
			key.interestOps(SelectionKey.OP_READ | SelectionKey.OP_WRITE);
		}
	}
...
Рейтинг: 0 / 0
Почему DatagramSocket принимает не всё ?
    #39783934
Фотография Пылинка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bobo96,
Я сегодня не поленился, копипастнул твой код в два проекта в двух окнах идеи паблик - всё работает.
...
Рейтинг: 0 / 0
Почему DatagramSocket принимает не всё ?
    #39784023
bobo96
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще раз всем огромное спасибо!
Sergunkaразберитесь с портами для начала. Нельзя писать и читать в один порт по контракту для вебсокета на одном IP.
Действительно, перенес клиента на andriod девайс, даже убрал таймаут, в итоге из 300т пакетов не пропал ни один!
А как локально тогда такую конструкцию тестировать, на одной машине и клиент, и сервер, если нет возможности плевать откуда то извне ?
...
Рейтинг: 0 / 0
Почему DatagramSocket принимает не всё ?
    #39784068
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Один на адресе 127.0.0.1, второй на 127.0.0.2 и т.д.
...
Рейтинг: 0 / 0
Почему DatagramSocket принимает не всё ?
    #39784202
Sergunka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bobo96Еще раз всем огромное спасибо!
Sergunkaразберитесь с портами для начала. Нельзя писать и читать в один порт по контракту для вебсокета на одном IP.
Действительно, перенес клиента на andriod девайс, даже убрал таймаут, в итоге из 300т пакетов не пропал ни один!
А как локально тогда такую конструкцию тестировать, на одной машине и клиент, и сервер, если нет возможности плевать откуда то извне ?

Поставьте разные порты. Контракт IP:port если изменить порт то все должно заработать для вебсокета на одном боксе.

Код: java
1.
try(DatagramSocket serverSocket = new DatagramSocket(8888))



Просто тупо поставьте

Код: java
1.
try(DatagramSocket serverSocket = new DatagramSocket(8886))
...
Рейтинг: 0 / 0
Почему DatagramSocket принимает не всё ?
    #39784210
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergunkaТС,

разберитесь с портами для начала. Нельзя писать и читать в один порт по контракту для вебсокета на одном IP.

Какой веб-сокет? Тут вообще тема не про веб-сокеты.

И пример с каналами для tcp-проткола тоже не в тему.
...
Рейтинг: 0 / 0
Почему DatagramSocket принимает не всё ?
    #39784214
Sergunka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonSergunkaТС,

разберитесь с портами для начала. Нельзя писать и читать в один порт по контракту для вебсокета на одном IP.

Какой веб-сокет? Тут вообще тема не про веб-сокеты.

И пример с каналами для tcp-проткола тоже не в тему.

https://docs.oracle.com/javase/7/docs/api/java/net/DatagramSocket.html

Не поленился открыл
...
Рейтинг: 0 / 0
Почему DatagramSocket принимает не всё ?
    #39784215
Sergunka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот пример про датасокет

https://www.geeksforgeeks.org/java-net-datagramsocket-class-java/

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Output : On the client side

IsBound : true
isConnected : true
InetAddress : localhost/127.0.0.1
Port : 5252
Remote socket address : localhost/127.0.0.1:5252
Local socket address : /127.0.0.1:59498
packet sent successfully
Received packet data : [13, 18]
Local Port : 59498
Local Address : /127.0.0.1
SO Timeout : 50



Порты у клиента и сервера разные хотя сидят на одном боксе.
...
Рейтинг: 0 / 0
Почему DatagramSocket принимает не всё ?
    #39784237
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но у автора с портом нет проблем. Так же как нет проблем с тем исходником на который ты ссылается.

Правда автору незачем на каждое сообщение клиента пересоздавать клиентский сокет. Он может
Использовать один разделяемый объект DatagramSocket и много выделенных DatagramPackets.
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Почему DatagramSocket принимает не всё ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]