Пока цикл в потоке Java не запускается
Я делаю мод 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)
Спасибо заранее
Ответы
Попробуйте отправить NewLine | CHR(10) | \nсимвол в конце полезной нагрузки пакета python, если вы используете socketIn.readLine()на принимающей стороне, он ждет разделителя строки перед возвратом.
Если вы хотите изучить Неблокирующий сокет Java NIO, вы можете изучить мой пример программы здесь, обратите внимание, что сокет NIO требует совершенно другого подхода. https://stackoverflow.com/a/26312841/185565