Javaスレッドのwhileループが実行されない

Oct 27 2020

Pythonクライアントからのメッセージを待機するソケットサーバーをバックグラウンドで実行したいMinecraftmodを作成しています。

サーバーはスレッドで実行されています。

これが私がスレッドを開始するコードです:

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!メッセージは1回だけ実行されます。

追伸:私は何時間もグーグルで理由を探してきました!関連するものを見つけることができないようです!

私はそれが非常に愚かで簡単に見つけられるかもしれないことを知っています:)

編集:@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)

事前にThx

回答

Whome Oct 27 2020 at 16:29

NewLine | CHR(10) | \nPythonパケットペイロードの最後で文字を送信してみてください。socketIn.readLine()受信側で使用する場合は、行区切り文字を待ってから戻ります。

Java NonBlocking NIOソケットを学習したい場合は、ここで私のサンプルプログラムを学習できます。NIOソケットには、まったく異なるアプローチが必要であることに注意してください。 https://stackoverflow.com/a/26312841/185565