【问题标题】:While loop in java thread doesn't runjava线程中的while循环不运行
【发布时间】:2021-02-09 12:21:49
【问题描述】:

我正在制作一个 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();


还有整个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!");
            }
        }
    }

}



我已经中断了整个代码,它似乎停止在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)

提前谢谢

【问题讨论】:

  • 我猜它正在等待一些输入,但它没有得到它。 sockIn 是什么?你是如何向它传递数据的?
  • 尝试对线程使用join方法,以便在main之后完成。
  • @Amongalen 它是一个连接到我的套接字的 BufferedReader :)
  • @DevParzival 我是java线程的新手,你能解释一下吗? :)
  • 尝试在python数据包有效载荷的末尾发送NewLine | CHR(10) | \n 字符,如果你使用socketIn.readLine()它在返回之前等待一个行分隔符。

标签: java multithreading minecraft-forge


【解决方案1】:

尝试在python数据包有效负载的末尾发送NewLine | CHR(10) | \n字符,如果您在接收端使用socketIn.readLine(),它会在返回之前等待行分隔符。

如果你想学习 Java NonBlocking NIO 套接字,你可以在这里学习我的示例程序,请注意 NIO 套接字需要完全不同的方法 https://stackoverflow.com/a/26312841/185565

【讨论】:

    猜你喜欢
    • 2021-09-14
    • 2020-03-06
    • 1970-01-01
    • 2021-10-26
    • 2010-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    相关资源
    最近更新 更多