Отличия при открытии сокетов в Python и Java - PullRequest
0 голосов
/ 28 декабря 2011

У меня действительно странная проблема при открытии и закрытии нескольких последовательных подключений к одному и тому же хосту с использованием Java.

Я пытаюсь запустить цикл for, чтобы открыть сокет tcp, отправить некоторые данные, получите ответ и закройте соединение.После третьей итерации этого цикла он перестает работать.Открытие и запись в сокет все еще работает, но не чтение.

Сначала я предположил, что это проблема с моим удаленным хостом, но я написал небольшой скрипт на python для отладки, и он отлично работает, скрипт легковыполняет мой цикл for для более чем 50 итераций, и удаленный хост всегда отвечает, как и ожидалось.

Есть ли что-то отличное в том, как python открывает и закрывает сокеты по сравнению с тем, как это делает Java?Как я могу отладить это?

Спасибо.

ОБНОВЛЕНИЕ:

вот код, который я использую в обоих случаях:

Python:

for i in range(0, 10):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((HOST, PORT))
    s.send(command)
    data = s.recv(1024)
    data = data[2:]
    print 'Received', "--->%s<--" % data.decode()

Java

   for (int i = 0; i < 10; i++) {
        Socket socket = new Socket("localhost", 9998);

        OutputStream bos = socket.getOutputStream();
        InputStream bis = socket.getInputStream();

        byte[] raw = "XX0000NC".getBytes();
        raw[0] = 0x0;
        raw[1] = 0x6;

        bos.write(raw);
        bos.flush();

        byte[] buffer = new byte[1024];
        int readCount = bis.read(buffer);

        System.out.println(new String(Arrays.copyOfRange(buffer, 2, readCount)));

        socket.shutdownOutput();
        socket.shutdownInput();
        socket.close();
    }

1 Ответ

0 голосов
/ 28 декабря 2011

Вы не показываете значение command, используемое в коде Python.Может быть, вы отправляете разные команды?

Единственное другое отличие, которое я вижу, состоит в том, что в Python вы используете socket.send' while in java you use OutputStream.write`:

Другое поведение происходит, когда недостаточно буфераместо для записи всех данных:

  • send отправляет только тот объем данных, который он может отправить без блокировки, и возвращает количество отправленных байтов.Если никакие байты не могут быть отправлены, то он блокируется.
  • write блокируется, пока не будут отправлены все байты.

По общему признанию, я нахожу это маловероятным, потому что вы отправляете очень короткийкоманда ...

Вы можете легко проверить это событие, изменив свой код Python на:

for i in range(0, 10):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((HOST, PORT))
    sent = s.send(command)
    if sent != len(command):
        print 'Some bytes not sent!!!\n'
    data = s.recv(1024)
    data = data[2:]
    print 'Received', "--->%s<--" % data.decode()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...