Что произойдет, если сервер откроет соединение с портом, но клиент ничего не отправил? (разъем java-сервера)

Я использую java-сокет для передачи данных со стороны клиента на мой сервер, пользователь должен нажать кнопку, чтобы открыть соединение с определенным портом, и клиент должен был запустить исполняемый файл jar для отправки данных на открытый порт, но в некоторых случаях пользователь нажимает кнопку, а затем по какой-то причине закрывает вкладку браузера! Когда он пытается снова нажать кнопку, появляется

Address already in use: JVM_Bind

Есть ли способ преодолеть это ?!

Можно ли убить какой-либо процесс порта перед его использованием?

Мой код класса на стороне сервера на случай, если кому-то нужно проверить:

class Server {
private Socket socket = null;
private ServerSocket server = null;
private DataInputStream in = null;

public Server(Integer port) throws Exception {
    try {
        server = new ServerSocket(port);
        JSFUtils.addFacesInformationMessage("Waiting for a Data...");
        socket = server.accept();
        JSFUtils.addFacesInformationMessage("Done");
        in = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
        String line = in.readUTF();
        System.out.println("Data Scaned >> " + line);
    } catch (Exception i) {
            i.printStackTrace();
    } finally {
        // close connection
        if (socket != null)
            socket.close();
        if (in != null)
            in.close();
    }
}

}

Сокет на стороне сервера может обрабатывать несколько подключений к одному порту. Проверьте свой код или разместите его здесь.

Mladen Savić 10.09.2018 11:14

@ MladenSavić я добавил код на случай, если вам нужно проверить

Mon3iem 10.09.2018 12:38

Проблема с вашим кодом заключается в том, что сервер создает экземпляр и ожидает принятия клиента в конструкторе. Сначала в конструкторе создайте экземпляр. Не пишите в конструкторе весь цикл. Создайте другой метод, который будет делать следующее: pastebin.com/pdCanTQe

Mladen Savić 10.09.2018 12:46

Спасибо за совет ... но на самом деле он не ответил на мой вопрос ... я спросил, как отменить / убить ожидание на стороне сервера после вызова "server.accept ();", кстати, я не хочу, чтобы пользователь мог продолжить на сервере, если он не запустит банку.

Mon3iem 12.09.2018 09:35

Приношу свои извинения, полагаю, я не прочитал вопрос полностью.

Mladen Savić 12.09.2018 10:29
1
5
38
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Наконец, я мог решить эту проблему, используя server.setSoTimeout(10 * 1000);, вы можете установить тайм-аут с желаемым временем в мс ... после того, как указанное время истечет без ответа на стороне клиента, он вызовет «SocketTimeoutException», и пользователь может повторно щелкнуть кнопку на стороне сервера снова, вы можете реализовать эту логику примерно так

            try {
            server = new ServerSocket(port);
            server.setSoTimeout(10 * 1000);
            socket = server.accept();
            JSFUtils.addFacesInformationMessage("Scan Completed Successfully");
            // takes input from the client socket
            in = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
            String line = in.readUTF();
        } catch (Exception i) {
            if (i instanceof SocketTimeoutException)
                JSFUtils.addFacesErrorMessage("Scan Timeout, Please click Scan again!");
            else
                i.printStackTrace();
        }

Другие вопросы по теме