#java #python #client #udp
#java #python #клиент #udp
Вопрос:
Я только начинаю узнавать об отправке UDP-пакетов, и я сталкиваюсь с проблемой. Я написал клиент Java и сервер, которые легко взаимодействуют друг с другом, и я создал комбинацию клиент / сервер Python, но я не уверен, как отправить UDP-пакет с Java и получить его на Python. Вот что у меня есть для Java-клиента:
import java.io.*;
import java.net.*;
public class testclient {
public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket();
byte[] buf = new byte[256];
InetAddress address = InetAddress.getLocalHost();
DatagramPacket packet = new DatagramPacket(buf, buf.length, address, Integer.parseInt(args[0]));
System.out.println("Sending...");
socket.send(packet);
System.out.println("Receiving...");
packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);
String received = new String(packet.getData(), 0, packet.getLength());
System.out.println(received);
System.out.println("Done!");
socket.close();
}
}
И сервер Python:
from sys import *
from socket import *
host = gethostname()
port = int(argv[1])
address = (host, port)
print "Binding..."
sock = socket(AF_INET, SOCK_DGRAM)
sock.bind(address)
print "Receiving..."
data, client = sock.recvfrom(256)
print "Sending to", client
sock.sendto("Hi", client)
print "Closing..."
sock.close()
print "Done!"
Все, что я пытаюсь здесь сделать, это отправить запрос от клиента Java на сервер Python, затем попросить сервер Python отправить «Hi» обратно клиенту Java и попросить клиента распечатать строку. Что происходит для меня, так это то, что клиент отправляет пакет, а сервер ожидает в sock.recvfrom(256)
и никогда не получает пакет (или, во всяком случае, так это выглядит).
Есть идеи? Я предполагаю, что есть некоторая разница между тем, как Java и Python обрабатывают пакеты, но я не уверен.
РЕДАКТИРОВАТЬ: Просто для пояснения, номер порта передается через аргументы командной строки для обоих этих приложений.
Комментарии:
1. Что
gethostname()
возвращает (попробуйте это на интерактивном интерпретаторе). Возможно, вы выполняете привязку к внешнему интерфейсу, а неlocalhost == 127.1
, как, похоже, вы намереваетесь сделать в приведенных выше фрагментах.2. Он возвращает имя моей машины.
Ответ №1:
Проблема, должно быть, в вашем коде, они должны иметь возможность обмениваться данными: это хороший пример написания пары клиент-сервер на java.
Комментарии:
1. Спасибо, но я уже следовал этому руководству. Следуя этому, я написал пару клиент-сервер, и она работает нормально. Но, как только я начинаю использовать сервер Python вместо этого, он больше не работает.
2. может быть, попробуйте указать порт, который он прослушивает, это помогло бы, вы уверены, что ваш клиент и сервер прослушивают один и тот же порт?
3. Кроме того, может быть полезно иметь свой код для клиента и сервера, каждый из которых выполняется в своем отдельном потоковом демоне (чтобы они умирали, когда ваша программа будет завершена). Также не похоже, что ваш сервер работает в цикле (т. Е. для (;;)), что может быть проблемой. Ваш сервер что-нибудь распечатывает при его запуске?
4. Да, это приводит к распечатке «Получение …» Я просто хочу, чтобы он получил пакет, отправил пакет клиенту, затем вышел. Таким образом, в этом случае цикл не требуется. Я уверен, что они прослушивают один и тот же порт, потому что я передаю номер порта через аргументы командной строки.
5. попробуйте распечатать порт и имя хоста от каждого клиента и сервера, просто чтобы убедиться, что они пытаются подключиться к одному и тому же. Кажется, не имеет смысла, что проблема будет заключаться в реализации протокола.
Ответ №2:
Итак, для начала, я на Ubuntu 10.10.
Я зашел в / etc / hosts, и похоже, что 127.0.0.1 был назначен localhost.localdomain, в то время как 127.0.1.1 был назначен имени моей машины. Итак, Python использовал адрес localhost, в то время как Java использовала адрес имени моего компьютера. Я изменил localhost на имя своего компьютера, и теперь все работает.
Спасибо всем за попытку помочь!
Ответ №3:
В Java я вижу, где вы создаете пакет, но я не вижу, чтобы вы фактически помещали какие-либо данные в пакет, используя setData
перед его отправкой.
Комментарии:
1. Просто попытался установить данные, это не исправляет. Но я подумал, что мне все равно не придется устанавливать данные в клиентском пакете, потому что это скорее запрос, чем фактическая отправка информации.