जबकि जावा धागे में लूप नहीं चलता है

Oct 27 2020

मैं एक Minecraft मॉड बना रहा हूं, जिसमें मैं बैकग्राउंड क्लाइंट में एक संदेश के इंतजार में बैकग्राउंड में चल रहा सॉकेट सर्वर रखना चाहता हूं।

सर्वर थ्रेड में चल रहा है।

यहां वह कोड है जिसमें मैं धागा शुरू करता हूं:

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: मैं क्यों खोज घंटे के लिए googled है! खिचड़ी भाषा से संबंधित कुछ भी नहीं लगता है!

मुझे पता है कि यह बहुत बेवकूफी भरा हो सकता है और आसानी से पकड़ा जा सकता है :)

संपादित करें: जैसा कि @DevParzival ने कहा कि मैंने उपयोग करने की कोशिश की, t.join();लेकिन यह अभी भी वही करता है! मैंने अपने वर्तमान से मेल खाने के लिए उपरोक्त कोड संपादित किया है।

Edit2: यहाँ ग्राहक कोड है (अजगर)

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) | \nअजगर पैकेट पेलोड के अंत में चरित्र भेजने की कोशिश करें , यदि आप socketIn.readLine()एक प्राप्त पक्ष में उपयोग करते हैं तो यह वापसी से पहले एक लाइन सीमांकक की प्रतीक्षा करता है।

यदि आप जावा नॉनब्लॉकिंग एनआईओ सॉकेट का अध्ययन करना चाहते हैं तो आप यहां मेरे उदाहरण कार्यक्रम का अध्ययन कर सकते हैं, कृपया ध्यान दें कि एनआईओ सॉकेट को एक अलग दृष्टिकोण की आवश्यकता है https://stackoverflow.com/a/26312841/185565