套接字似乎在按钮按下之间关闭,我该如何保持打开状态? JavaFX的

时间:2018-01-31 15:30:09

标签: java javafx

我已经编写了一个小概念证明代码,应该执行以下操作:

  1. 按下按钮1打开套接字到服务器并传递身份验证详细信息并收集服务器响应以供显示。 (这是100%工作,auth成功。)

  2. 按下按钮2应该发送请求服务器状态的命令,这是不起作用的部分。我可以从服务器返回的唯一响应是“等待验证”,尽管我通过按下按钮1成功地做到了这一点 按下初始按钮1后套接字似乎正在关闭,因此忽略按钮2代码而是等待再次进行认证。

  3. 问题:如何使用按钮1打开套接字,然后使用按钮2在服务器上激活其他命令。

    我已经尝试了s.setKeepAlive(true);s.setSoTimeout(60000);,并且还将socket方法放在一个线程中,但没有任何乐趣。

    我的Controller.java(观看按钮1和按2)

    public class Controller {
    
    @FXML public Button auth;
    @FXML public Button status;
    
    
    public void balls(ActionEvent event) throws IOException{
    
        (new Thread(new helloRunnable())).start();
    }
    
    public void balls2(javafx.event.ActionEvent event)throws IOException {
    
        sample.Main.status();
    }
    }//end class
    

    我的helloRunnable.Java(效果很好)

    public class helloRunnable implements Runnable {
    
    public void run() {
    
        try {
            Socket s = new Socket("192.168.16.230", 63333);
            s.setKeepAlive(true);
            s.setSoTimeout(60000);
    
            PrintStream p = new PrintStream(s.getOutputStream(), true);
            BufferedReader bufRd = new BufferedReader(new InputStreamReader(s.getInputStream()));
    
            p.println("{\"method\":\"authentication\",\"server_password\":\"g4t3w4y1\"}");
    
            String response = bufRd.readLine();
            System.out.println(response);
    
            p.println("");
            response = bufRd.readLine();
            System.out.println(response);
    
        } //end try block
        catch (IOException e) {
           System.err.println(e.getMessage());
        } //end catch
    
     }//end runnable
    }//end class
    

    My Main.Java(这是等待身份验证,因为它显示套接字重置/关闭)

    public class Main extends Application {
    
    
    @Override
    public void start(Stage primaryStage) throws Exception{
        Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
        primaryStage.setTitle("Button Test");
        primaryStage.setScene(new Scene(root));
        primaryStage.show();
    }
    
    public static void status() throws IOException{
    
        Socket s = new Socket("192.168.16.230", 63333);
    
        PrintWriter p = new PrintWriter(s.getOutputStream(), true);
        BufferedReader bufRd = new BufferedReader(new InputStreamReader(s.getInputStream()));
    
        p.println("");
        p.println("{ \"method\":\"get_server_status\" }");
    
        String response = bufRd.readLine();
        //Object obj = JSONValue.parse(response);
        //JSONObject jsonObject = (JSONObject) obj;
    
        //String reply = (String) jsonObject.get("reply");
        //System.out.println("Reply: " + reply + "\n");
    
        System.out.println(response);
     }
    }//end main class
    

    我已经尝试过在这里和其他地方找到的各种修复但似乎无法修复它。请指出我正确的方向。令人沮丧的是,基于CLi的这个版本的范围要大得多,完美无缺。我进行身份验证,套接字保持打开状态。我可以整天在服务器上发出不同的命令。

    无论如何,请提前感谢您提供的任何帮助。

2 个答案:

答案 0 :(得分:1)

当然它再次要求进行身份验证,因为您在每次运行时都会创建一个新的套接字 相反,你想要创建一次套接字(或者至少在一定时间内)并在每次运行时重复使用它...所以..你需要存储你的套接字并配置它

答案 1 :(得分:1)

这就是我走向全球的意思。你应该这样做。

public class Controller {

    @FXML public Button auth;
    @FXML public Button status;

    // go back and capitalize your class name
    HelloRunnable helloRunnable = new HelloRunnable();//Now the scope of this is the whole class and not just within the Button's handler. I am not sure if this code is 100% correct, but the idea is to widen the Runnable's scope.

    public void balls(ActionEvent event) throws IOException{

        (new Thread(helloRunnable)).start();//Now start your runnable
    }

    public void balls2(javafx.event.ActionEvent event)throws IOException {

        sample.Main.status();
    }
}//end