Сервер Python и клиент Java: сервер получает сообщение, но клиент не получает ответа

Я сделал сервер Python и клиент Java. Моя проблема проста: Сервер получает сообщение от клиента, но клиент не получает ответа.

Клиент Java:

package fgd;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.Socket;



public class fdassd {


        public static void main(String[] args){





              new Thread(){
               public void run(){
                while (true)
                {
                 try {Socket socke=new Socket("censored",1977);  

                    DataOutputStream dout=new DataOutputStream(socke.getOutputStream());
                    DataInputStream din = new DataInputStream(socke.getInputStream());

                    dout.writeUTF("Heey");
                    dout.flush();

                    String str = din.readUTF();
                    System.out.println(str);



                    dout.close();  
                    socke.close();
                    }catch(Exception e){
                         e.printStackTrace();
                    } 




                try {
                    Thread.sleep(17000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                    }
                }
               }
              }.start();

}
}

Сервер Python:

            hosto = '0.0.0.0'
            porto = 1979
            soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

            print 'Socket created!'

            try:
                    soc.bind((hosto, porto))
            except socket.error as e:
                print(e)
                    sys.exit()

            print 'Socket bind complete'

            soc.settimeout(30)
            soc.listen(10)

            print 'Listening...'

            timeout = 8

            timeout_start = time.time()

            while time.time() < timeout_start + timeout:
                try:
                        conn, addr = soc.accept()
                    if addr[0] != opip:
                        conn.shutdown(socket.SHUT_RDWR)
                        conn.close()
                    else:
                        msg = conn.recv(1024)
                        print ('--------------------------------------')
                        print (msg)
                        conn.send((playername).encode('UTF-8'))
                        print ('Success! The following command has been                             sent to: ' + opip + ':' + playername )
                        print ('--------------------------------------')
                        soc.close()
                        break 
                except socket.timeout as e:
                    print(e,': Server not online or wrong ip')
                    soc.close()
                    break




        else:

Я видел очень похожий вопрос, где ответ заключался в добавлении строк перед conn.send (ссылка: Клиент Socket Java - Сервер Python). Но я не могу использовать решение в этом вопросе, потому что

conn.send(len(message_to_send).to_bytes(2, byteorder='big'))

похоже, не работает в python 2.x. Это означает, что мне нужно другое решение для отправки сообщения с UTF-8, но я не могу понять, что делать.

С Уважением

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
112
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Добавьте следующую строку перед отправкой playername. Это должно работать как в python2, так и в 3:

conn.send(struct.pack(">H", len(playername)))

Эта строка будет префиксом длины имени проигрывателя к сообщению, как того требует метод java DataInputStream#readUTF. Он закодирован как двухбайтовое целое число, отсюда и 'H' в вызове struct.pack.

Вам также понадобится выписка import struct.

См. Python 2,3 Преобразование целых чисел в «байты» чисто для получения дополнительной информации.

Другие вопросы по теме