【问题标题】:JavaFX, client GUI, 2 instances causes second socket to be NULLJavaFX,客户端 GUI,2 个实例导致第二个套接字为 NULL
【发布时间】:2016-01-28 07:17:44
【问题描述】:

我编写了一个与我的 arduino 服务器通信的客户端程序。它有一个摇摆按钮和一个运行循环检查来自服务器的任何输入的方法。我尝试了从不同或/和相同 IP 运行的多个实例,一切都很好。现在我尝试在带有 JavaFX GUI 的应用程序中为套接字实现相同的方法。在我在这里和那里阅读它需要在一个单独的线程上之后,我按照指示做了它,它似乎工作得很好。如果我尝试启动它的第二个实例,它会立即在我检查 socket.isConnected() && !Socket.isClosed() 的行上抛出 NullPointerException。 第一个实例继续正常工作,但另一个只是保持 GUI 处于打开状态。

因为我已经使用同一个类但不是在新线程和摆动按钮上完成了它,我可以说问题不在服务器端。

我需要能够启动尽可能多的程序实例,同时它们都始终保持打开的套接字。关于如何解决这个问题的任何想法?

更新:当套接字丢失时,我尝试在循环中调用启动。似乎套接字在打开后立即关闭。

这是客户端的类:

package panelSouth;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;


public class Networking implements Runnable{

    static Socket socket;
    static OutputStreamWriter out;

    public void run() {

        //Initializing socket - IP/PORT
        String host = "192.168.1.178";
        int port = 2015;

        boolean connected=true;
        do{
            try{
                socket = new Socket(host,port);
            }
            catch(Exception unknownHostException){
                connected=false;
                System.out.println("Connecting to host...");
            }
        }while(connected==true);
        System.out.println("Connection is a success!");

        System.out.println("Requesting pin states...");

        //Requesting pin states on startup.
        try{
            out = new OutputStreamWriter(socket.getOutputStream());
            out.write("r;");
            out.flush();

        }catch(Exception ex){
            System.out.println(ex);
        }
        listen();
    }


    //Listening for incoming commands from host
    public static void listen(){
        try{
            BufferedReader in = new BufferedReader(
                    new InputStreamReader(
                            socket.getInputStream() ) );
            while(socket.isConnected() && !socket.isClosed()){
                States.commandProcess(in.readLine());
            }
        }catch(Exception ex){
            System.out.println(ex);
        }


    }

    //send commands.
    static public void send(String command){
        try{
            out.write(command);
            out.flush();
        }catch(Exception ex){
            System.out.println(ex);
        }
    }
    //closing the socket and resetting the pins on host on close up.
    static public void close(){
        try{
            OutputStreamWriter out = new OutputStreamWriter(socket.getOutputStream());
            out.write("x;");
            out.flush();
            socket.close();
        }catch(Exception exception){
        }

    }
}

这里是主要的:

public static void main(String[] args) throws Exception{

    Thread network = new Thread(new Networking());
    network.setDaemon(true);
    network.start();
    launch(args);

}

【问题讨论】:

    标签: multithreading sockets user-interface


    【解决方案1】:

    我删除了套接字定义中的循环,并且只在 catch{} 部分中调用了函数。似乎循环定义了多个套接字或其他东西,当我实际向套接字发送数据时,它是另一个套接字。此外,我更改了线程处理并使用 Task 进行处理,这似乎在 JavaFX 场景中工作得更好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-24
      • 1970-01-01
      • 1970-01-01
      • 2018-08-12
      • 1970-01-01
      • 2016-01-05
      相关资源
      最近更新 更多