Podczas gdy pętla w wątku java nie działa
Tworzę mod do gry Minecraft, w którym chcę, aby serwer gniazda działał w tle i czekał na wiadomość od klienta Pythona.
Serwer działa w wątku.
Oto kod, w którym rozpoczynam wątek:
Thread t = new Thread(new Runnable() {
@Override
public void run() {
try {
InterPythonJavaCommunicatorServer.begin(socket, sockIn, sockOut);
}catch (IOException e){
System.out.println("Woah! Somethings gone wrong! ringing a alarm now!");
}
}
});
t.start();
t.join();
I cała klasa serwerów
package com.satyamedh.minecraft_ai_helper.communicator;
import com.satyamedh.minecraft_ai_helper.Movement;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.net.Socket;
public class InterPythonJavaCommunicatorServer{
public static void begin(Socket socket, BufferedReader sockIn, BufferedWriter sockOut) throws IOException {
boolean done = false;
while (true) {
System.out.println("Test!");
boolean ready = sockIn.ready();
if(!ready) {
return;
}
try {
String response = sockIn.readLine(); // Stops Here!
System.out.println(response);
//if (response == null) {
//System.out.println("Remote process closed the connection.");
//done=true;
//}
if (response.equals("forward\n")){
boolean o = Movement.forward(1);
if (o){
sockOut.write("done");
sockOut.flush();
}
}
} catch (IOException e) {
System.out.println("Welp! ALARM BOI!");
}
}
}
}
Złamałem cały kod i wydaje się, że się skończyło String response = sockIn.readLine();. A Test!komunikat działa tylko raz.
Ps: Google szukałem godzinami, dlaczego! nie mogę znaleźć niczego związanego!
Wiem, że to może być bardzo głupie i łatwe do złapania :)
Edycja: Jak powiedział @DevParzival, próbowałem użyć, t.join();ale nadal robi to samo! Powyższy kod zredagowałem, aby pasował do mojego obecnego.
Edit2: oto kod klienta (python)
import socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(("", 1243))
server_socket.listen(5)
print(
"TCPServer Waiting for client on port 1243")
while 1:
client_socket, address = server_socket.accept()
print(
"I got a connection from ", address)
while 1:
data = input("SEND( TYPE q or Q to Quit):")
if data == 'Q' or data == 'q':
client_socket.send(bytes(data, encoding='utf8'))
client_socket.close()
break
else:
client_socket.send(bytes(data, encoding='utf8'))
data = client_socket.recv(512)
if data == 'q' or data == 'Q':
client_socket.close()
break
else:
print("RECEIVED:", data)
Dzięki z góry
Odpowiedzi
Spróbuj wysłać NewLine | CHR(10) | \nznak na końcu ładunku pakietu Pythona, jeśli używasz socketIn.readLine()po stronie odbierającej, czeka na separator linii przed powrotem.
Jeśli chcesz studiować gniazdo Java NonBlocking NIO, możesz przestudiować mój przykładowy program tutaj, zwróć uwagę, że gniazdo NIO wymaga zupełnie innego podejścia https://stackoverflow.com/a/26312841/185565