У меня проблема с сокетом Java-Python. Моя цель - отправить объект Json из приложения java в сценарий python через сокет tcp и получить ответ, но сокет заблокирован после отправки Json. Ниже приведен мой код:
try {
Socket socket = new Socket(dstAddress, dstPort);
is = new DataInputStream(socket.getInputStream());
os = new DataOutputStream(socket.getOutputStream());
PrintWriter pw = new PrintWriter(os, true);
pw.println(jsonObject.toString());
System.out.println("Send to the socket jsonObject.");
BufferedReader in = new BufferedReader(new InputStreamReader(is));
String response = in.readLine();
System.out.println("Response: " + response);
is.close();
os.close();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
В следующих строках код Python:
HOST = "192.168.1.101" #localhost
PORT = 7011
s = socket(AF_INET, SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
while (1):
print("\n\nAttending for client.....\n\n")
conn, addr = s.accept()
print("Connected by: " , addr)
data = ""
while 1:
temp = conn.recv(1024).decode()
if not temp:
break
data = data + temp
print("JSON Received!!!!!")
imageJson = {}
imageJson = json.loads(data)
# responding to the client
response = DbImages[elem[0]]
resp = "Prova"
conn.send(resp.encode())
Если я завершу код java (ctrl + C), сокет выйдет из блока, и json поступит на python. В чем проблема? Кажется, проблема в.readLine (). Если я удалю этот оператор, сокет будет работать без блоков.




Ваш ответ не является строкой, поскольку кажется, что он не содержит окончания строки.
Это означает, что readLine будет читать вечно.
Попробуйте добавить новую строку в свой ответ, чтобы обрадовать readLine:
resp = "Prova\n"
Ваш код Python ожидает завершения Java-стороны и отправляет EOF перед ответом (это то, что это означает для recv, пока вы не получите пустые байты).
Ваш код Java ожидает ответа от стороны Python перед закрытием сокета.
Итак, они оба ждут друг друга.
Удаление readLine означает, что код Java больше ничего не ждет, поэтому он просто зависает на коде Python, как только он завершает отправку, что решает проблему, но это не является большим решением, если вы на самом деле нужен был ответ.
Итак, что они должны делать? Что ж, есть несколько разных вариантов.
makefile в сокете и вызывать readline вместо того, чтобы перебирать recv.raw_decode (см. Документацию модуля json) после каждого приема до тех пор, пока он не будет успешным.