java 线程中的 while 循环不 运行
While loop in java thread doesn't run
我正在制作一个 Minecraft mod,我想在其中有一个套接字服务器 运行 在后台等待来自 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();
以及整个服务器class
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)
提前致谢
尝试在 python 数据包负载末尾发送 NewLine | CHR(10) | \n
字符,如果您在接收端使用 socketIn.readLine()
,它会在 return 之前等待行定界符.
如果你想学习Java NonBlocking NIO socket 你可以在这里学习我的示例程序,请注意NIO socket需要完全不同的方法
我正在制作一个 Minecraft mod,我想在其中有一个套接字服务器 运行 在后台等待来自 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();
以及整个服务器class
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)
提前致谢
尝试在 python 数据包负载末尾发送 NewLine | CHR(10) | \n
字符,如果您在接收端使用 socketIn.readLine()
,它会在 return 之前等待行定界符.
如果你想学习Java NonBlocking NIO socket 你可以在这里学习我的示例程序,请注意NIO socket需要完全不同的方法