Я сделал сервер 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, но я не могу понять, что делать.
С Уважением




Добавьте следующую строку перед отправкой playername. Это должно работать как в python2, так и в 3:
conn.send(struct.pack(">H", len(playername)))
Эта строка будет префиксом длины имени проигрывателя к сообщению, как того требует метод java DataInputStream#readUTF. Он закодирован как двухбайтовое целое число, отсюда и 'H' в вызове struct.pack.
Вам также понадобится выписка import struct.
См. Python 2,3 Преобразование целых чисел в «байты» чисто для получения дополнительной информации.