Podczas gdy pętla w wątku java nie działa

Oct 27 2020

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

Whome Oct 27 2020 at 16:29

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