Ошибка сокетов при запуске программы с использованием jar-файла - PullRequest
0 голосов
/ 01 июня 2019

Я делаю проект клиент-сервер с использованием сокетов в 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)

В чем может быть проблема? Заранее спасибо, с уважением ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...