Multithreading JavaFX,客户端GUI,2个实例导致第二个套接字为空
我编写了一个与arduino服务器通信的客户端程序。它有一个swing按钮和一个运行循环检查服务器输入的方法。我尝试了从不同或/和同一IP运行多个实例,一切都很好。现在,我尝试在一个带有JavaFXGUI的应用程序中为套接字实现相同的方法。在我读到这里和那里,它需要在一个单独的线程,我做了指示,它似乎工作得很好。但是,如果我尝试启动它的第二个实例,它会立即在我检查socket.isConnected()&&的行上抛出NullPointerException!Socket.isClosed() 正如我在同一个类中所做的,但不是在新线程和swing按钮上,我可以说问题不在服务器端 我需要能够启动尽可能多的程序实例,同时它们始终保持一个开放的套接字。有没有办法解决这个问题 更新:当套接字丢失时,我尝试在循环中调用初始化。插座似乎在打开后立即关闭 以下是客户端的类:Multithreading JavaFX,客户端GUI,2个实例导致第二个套接字为空,multithreading,sockets,user-interface,Multithreading,Sockets,User Interface,我编写了一个与arduino服务器通信的客户端程序。它有一个swing按钮和一个运行循环检查服务器输入的方法。我尝试了从不同或/和同一IP运行多个实例,一切都很好。现在,我尝试在一个带有JavaFXGUI的应用程序中为套接字实现相同的方法。在我读到这里和那里,它需要在一个单独的线程,我做了指示,它似乎工作得很好。但是,如果我尝试启动它的第二个实例,它会立即在我检查socket.isConnected()&&的行上抛出NullPointerException!Socket.isClosed() 正
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场景中工作得更好