#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();
Я бы также рекомендовал прочитать следующую документацию о написании сервера и клиента дейтаграмм.