Отправка пакетов Java на сервер Python?

#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. Просто попытался установить данные, это не исправляет. Но я подумал, что мне все равно не придется устанавливать данные в клиентском пакете, потому что это скорее запрос, чем фактическая отправка информации.