Vòng lặp while trong chuỗi java không chạy

Oct 27 2020

Tôi đang tạo một bản mod Minecraft, trong đó tôi muốn có một máy chủ ổ cắm chạy trong nền để chờ thông báo từ ứng dụng khách python.

Máy chủ đang chạy trong một chuỗi.

Đây là đoạn mã mà tôi bắt đầu chuỗi:

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


Và toàn bộ lớp Máy chủ


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

}



Tôi đã phá vỡ toàn bộ mã và nó dường như dừng lại String response = sockIn.readLine();. Và Test!tin nhắn chỉ chạy một lần.

Ps: Tôi đã googled hàng giờ để tìm kiếm lý do! dường như không thể tìm thấy bất cứ điều gì liên quan!

Tôi biết nó có thể rất ngu ngốc và dễ dàng bị phát hiện :)

Chỉnh sửa: Như @DevParzival Đã nói, tôi đã thử sử dụng t.join();nhưng nó vẫn như vậy! Tôi đã chỉnh sửa mã trên để phù hợp với mã hiện tại của tôi.

Edit2: đây là mã máy khách (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 trước

Trả lời

Whome Oct 27 2020 at 16:29

Cố gắng gửi NewLine | CHR(10) | \nký tự ở cuối trọng tải gói python, nếu bạn sử dụng socketIn.readLine()ở phía nhận, ký tự đó sẽ đợi dấu phân cách dòng trước khi trả về.

Nếu bạn muốn nghiên cứu về ổ cắm NIO NonBlocking của Java, bạn có thể nghiên cứu chương trình ví dụ của tôi ở đây, xin lưu ý rằng ổ cắm NIO cần có một cách tiếp cận hoàn toàn khác https://stackoverflow.com/a/26312841/185565