Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading JavaFX,客户端GUI,2个实例导致第二个套接字为空_Multithreading_Sockets_User Interface - Fatal编程技术网

Multithreading JavaFX,客户端GUI,2个实例导致第二个套接字为空

Multithreading JavaFX,客户端GUI,2个实例导致第二个套接字为空,multithreading,sockets,user-interface,Multithreading,Sockets,User Interface,我编写了一个与arduino服务器通信的客户端程序。它有一个swing按钮和一个运行循环检查服务器输入的方法。我尝试了从不同或/和同一IP运行多个实例,一切都很好。现在,我尝试在一个带有JavaFXGUI的应用程序中为套接字实现相同的方法。在我读到这里和那里,它需要在一个单独的线程,我做了指示,它似乎工作得很好。但是,如果我尝试启动它的第二个实例,它会立即在我检查socket.isConnected()&&的行上抛出NullPointerException!Socket.isClosed() 正

我编写了一个与arduino服务器通信的客户端程序。它有一个swing按钮和一个运行循环检查服务器输入的方法。我尝试了从不同或/和同一IP运行多个实例,一切都很好。现在,我尝试在一个带有JavaFXGUI的应用程序中为套接字实现相同的方法。在我读到这里和那里,它需要在一个单独的线程,我做了指示,它似乎工作得很好。但是,如果我尝试启动它的第二个实例,它会立即在我检查socket.isConnected()&&的行上抛出NullPointerException!Socket.isClosed()

正如我在同一个类中所做的,但不是在新线程和swing按钮上,我可以说问题不在服务器端

我需要能够启动尽可能多的程序实例,同时它们始终保持一个开放的套接字。有没有办法解决这个问题

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

以下是客户端的类:

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

}

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