Я делаю проект клиент-сервер с использованием сокетов в Java .
«Сервер-приложение» написано с использованием платформы JavaFX и находится на рабочем столе. Есть этот код:
public class Server {
private int PORT = 50656;
private final int COUNT_OF_CONNECTIONS = 5;
private static boolean isStarted = false;
private static ServerSocket server;
private static NetworkServiceManager serviceManager;
public synchronized void start(ServerStartingListener listener) {
FutureTask<Boolean> serverTask = new FutureTask<Boolean>(new Callable<Boolean>(){
@Override
public Boolean call() {
try {
server = new ServerSocket(PORT);
serviceManager = new NetworkServiceManager();
serviceManager.setPort(server.getLocalPort());
listener.onBeginning();
serviceManager.registerService();
listener.onEstablished();
isStarted = true;
Semaphore block = new Semaphore(COUNT_OF_CONNECTIONS);
while (true) {
block.acquire();
Socket accept = server.accept();
Thread session = new Thread(()-> {
try (
InputStream inputStream = accept.getInputStream();
OutputStream outputStream = accept.getOutputStream();
BufferedReader readerStream = new BufferedReader(new InputStreamReader(inputStream, "cp1251"));
PrintWriter writerStream = new PrintWriter(outputStream, true);
){
Gson gson = new Gson();
String jsonInstanceString;
while((jsonInstanceString = readerStream.readLine()) != null){
NetworkNode node = gson.fromJson(jsonInstanceString, NetworkNode.class);
writerStream.println(Validator.check(node));
}
accept.close();
} catch (IOException ex) {
ex.printStackTrace();
} catch (NullPointerException ex){
ex.printStackTrace();
} finally {
block.release();
}
});
session.start();
session.setName("Session " + String.valueOf(block.getQueueLength()));
}
} catch (IOException ex) {
Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
return false;
} catch (InterruptedException ex) {
Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
}
return true;
}
});
Thread process = new Thread(serverTask);
process.setName("ServerThread");
process.start();
}
}
«Клиент-приложение» на Android и имеет следующий код:
public class ClientSocketConnection {
private final String TAG = "ClientSocketConnection";
private int port = 49150;
private String host;
public Socket client;
public ClientSocketConnection(String host){
this.host = host;
}
public boolean connect(){
Boolean isConnected = false;
FutureTask<Boolean> task = new FutureTask(new Callable<Boolean>() { //line 48
@Override
public Boolean call() {
try {
client = new Socket();
client.connect(new InetSocketAddress(host, port), 500); //line 53
} catch (IOException ex) {
Log.d(TAG, "Client socket exception", ex);
return false;
}
return true;
}
});
Thread flow = new Thread(task);
flow.start();
try {
isConnected = task.get();
} catch (ExecutionException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
return isConnected;
}
}
Ну, а теперь о самой проблеме ...
Когда я запускаю «Server-application» из IDE (в моем случае NetBeans) или через командную строку (используя «java -jar blah_blah.jar»), все хорошо, и клиент успешно устанавливает соединение. Но как только я пытаюсь запустить "server-app" , используя jar-file"двойным щелчком", а затем я пытаюсь установить соединение с клиентом " -app ", я получаю следующую ошибку:
java.net.SocketTimeoutException: failed to connect to /192.168.3.104 (port 50656) from /192.168.3.101 (port 41037) after 500ms
at libcore.io.IoBridge.connectErrno(IoBridge.java:185)
at libcore.io.IoBridge.connect(IoBridge.java:130)
at java.net.PlainSocketImpl.socketConnect(PlainSocketImpl.java:129)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:356)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:357)
at java.net.Socket.connect(Socket.java:616)
at com.example.username.remotecontrol.connections.ClientSocketConnection$1.call(ClientSocketConnection.java:53)
at com.example.username.remotecontrol.connections.ClientSocketConnection$1.call(ClientSocketConnection.java:48)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.lang.Thread.run(Thread.java:764)
В чем может быть проблема?
Заранее спасибо, с уважением ...