Требуется ли для UDP-соединения сервер / клиент?

#java #android #networking #server #udp

#java #Android #сеть #сервер #udp

Вопрос:

Я хочу отправить UDP-пакет / сообщение на другое устройство по тому же Ethernet-соединению, но я не уверен, где здесь будут отношения сервер / клиент.

Принимающее сообщение настроено на автоматическую отправку ответа обратно при получении сообщения, поэтому оба устройства будут просто обмениваться данными друг с другом…

Я что-то упускаю?

Я в замешательстве, потому что код, который я использовал для отправки сообщения от клиента на сервер, имеет параметры «ip сервера» и «порт сервера», поэтому я не уверен, смогу ли я 1) просто заменить параметры и использовать тот же код и 2) если это возможно, что добавитьэти параметры, номер порта исходного устройства и ip? Или второго устройства?

Спасибо!

Фрагмент кода:

 new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        InetAddress SERVERIP = InetAddress.getByName(SERVER_IP);
                        DatagramSocket socket = new DatagramSocket();
                        socket.setBroadcast(true);
                        byte[] msg = message.getBytes();
                        DatagramPacket packet = new DatagramPacket(msg, message.length(), 
                                SERVERIP, SERVERPORT);
                        socket.send(packet);
                        socket.close();
                    } catch(Exception e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        
  

Комментарии:

1. Вы могли бы заменить фразу «клиент» на «источник», а «сервер» на «назначение» соединения.

2. Итак, я должен заменить ServerIP и ServerPort на ip и порт моего назначения? @SteffenUllrich

3. UDP явно не имеет соединения,, поэтому такой вещи, как UDP-соединение, не существует. Кроме того, клиент / сервер — это концепция прикладного уровня, о которой UDP ничего не знает. UDP не имеет клиентов или серверов. UDP — это протокол «запустить и забыть», который просто отправляет дейтаграммы, не ожидая, что другая сторона даже получит дейтаграммы.

4. @RonMaupin: и да, и нет. Хотя нет «реального» соединения, как в TCP, С выделенным началом соединения (SYN и т. Д.) И завершением соединения (FIN и т. Д.), Количество пакетов с одного и того же исходного ip порта На один и тот же ip порт назначения обычно считается соединением. Такие соединения также имеют явную поддержку в NAT, и connect функции также доступны для сокетов UDP. И в UDP тоже есть клиент / сервер, например, DNS-сервер, веб-сервер, реализующий протокол QUIC (который является UDP) и т.д. В общем случае клиент и сервер — это концепция прикладного уровня.

5. @SteffenUllrich, да, именно поэтому я сделал комментарий. Сетевое программирование намного, намного проще, если вы понимаете сетевые концепции, включая уровни сетевого стека, и идею абстракции и инкапсуляции за слоями, прежде чем пытаться использовать сетевые API.

Ответ №1:

Я не совсем уверен, что вопрос, на который вы хотите получить ответ, заключается в том, как реагировать на устройство, отправившее сообщение, с устройства, получившего сообщение.

Если это так, то следующий код является базовым примером того, как вы могли бы ответить первоначальному устройству-отправителю, получив адрес и порт из пакета, который был получен через сокет.

 // Receive and respond thread.
new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        // Receive

                        DatagramSocket socket = new DatagramSocket(4445);
                        byte[] buf = new byte[256];
                        DatagramPacket packet = new DatagramPacket(buf, buf.length);
                        socket.receive(packet);

                        // Respond

                        // Get sender's/return address from the packet that was received.
                        InetAddress address = packet.getAddress();
                        // Get sender's/return port from the packet that was received.
                        int port = packet.getPort();
                        packet = new DatagramPacket(buf, buf.length, address, port);
                        socket.send(packet);
                        socket.close();

                } catch(Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();
  

Я бы также рекомендовал прочитать следующую документацию о написании сервера и клиента дейтаграмм.