Enquanto o loop no thread java não executa

Oct 27 2020

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

Whome Oct 27 2020 at 16:29

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