【发布时间】: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