Enquanto o loop no thread java não executa
Estou fazendo um mod do Minecraft no qual quero ter um servidor de soquete rodando em segundo plano, esperando por uma mensagem do cliente python.
O servidor está sendo executado em um thread.
Aqui está o código no qual eu inicio o tópico:
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();
E toda a classe Server
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!");
}
}
}
}
Eu decifrei todo o código e ele parece parar String response = sockIn.readLine();. E a Test!mensagem só é executada uma vez.
Ps: Eu pesquisei por horas no Google procurando por quê! não consigo encontrar nada relacionado!
Eu sei que pode ser muito estúpido e facilmente descoberto :)
Edit: Como @DevParzival disse, tentei usar, t.join();mas ainda faz o mesmo! Eu editei o código acima para corresponder ao meu atual.
Edit2: aqui está o código do cliente (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)
Thx antecipadamente
Respostas
Tente enviar o NewLine | CHR(10) | \ncaractere no final da carga útil do pacote python, se você usar socketIn.readLine()em um lado receptor, ele espera por um delimitador de linha antes de retornar.
Se você quiser estudar o soquete NIO Java NonBlocking, você pode estudar meu programa de exemplo aqui, observe que o soquete NIO precisa de uma abordagem bastante diferente https://stackoverflow.com/a/26312841/185565