Пока цикл в потоке Java не запускается

Oct 27 2020

Я делаю мод Minecraft, в котором я хочу, чтобы сервер сокетов работал в фоновом режиме, ожидая сообщения от клиента python.

Сервер работает в потоке.

Вот код, в котором я запускаю поток:

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();


И весь класс Сервера


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!");
            }
        }
    }

}



Я остановил весь код и, кажется, остановился String response = sockIn.readLine();. И Test!сообщение запускается только один раз.

Ps: Я часами гуглил, ища почему! не могу найти ничего связанного!

Я знаю, что это может быть очень глупо и легко поймать :)

Изменить: как сказал @DevParzival, я пробовал использовать, t.join();но он все равно делает то же самое! Я отредактировал приведенный выше код, чтобы он соответствовал моему текущему.

Edit2: вот клиентский код (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)

Спасибо заранее

Ответы

Whome Oct 27 2020 at 16:29

Попробуйте отправить NewLine | CHR(10) | \nсимвол в конце полезной нагрузки пакета python, если вы используете socketIn.readLine()на принимающей стороне, он ждет разделителя строки перед возвратом.

Если вы хотите изучить Неблокирующий сокет Java NIO, вы можете изучить мой пример программы здесь, обратите внимание, что сокет NIO требует совершенно другого подхода. https://stackoverflow.com/a/26312841/185565