Что произойдет, если сервер откроет соединение с портом, но Клиент ничего не отправил?(Сокет сервера Java) - PullRequest
0 голосов
/ 10 сентября 2018

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

Адрес уже используется: 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();
    }
}

}

1 Ответ

0 голосов
/ 12 сентября 2018

Наконец, я мог бы обойти эту проблему, используя 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();
        }
...