ServerSocket принимает поведение - PullRequest
0 голосов
/ 14 января 2011

У меня есть следующий фрагмент кода:

if (servsock == null) {
    System.out.println("HELLO1!");
    servsock = new ServerSocket(63456, 10);
    System.out.println("HELLO2!");
}
try {
    System.out.println("HELLO3!");
    sock = servsock.accept();
} catch (Exception ex) {
    if (servsock != null && !servsock.isClosed()) {
        System.out.println("PICO1!");
        servsock.close();
    }
    if (servsock != null && servsock.isClosed()) {
        System.out.println("PICO2!");
        manager.log("SERVER SOCKET closed and nulled.");
        servsock = null;
    }
    sock = servsock.accept();
}
System.out.println("HELLO4!");
is = sock.getInputStream();
System.out.println("HELLO5!");
bis = new BufferedInputStream(is);
System.out.println("HELLO6!");

Этот код запускается в методе run() исполняемого файла, и, когда файл был передан, он должен прервать каждое соединение.

Любопытно, что это не петля.Код принимает, выполняет передачу файлов, но я не понимаю, почему HELLO1 снова на моем экране.Таким образом, во второй раз, когда я пытаюсь снова запустить этот код, выдается сообщение «Отказано в соединении».

«10» было хаком с моей стороны, но оригинальный код также никогда не использует отставание.

Любое предложение, пожалуйста?

Код, выполняющийся при выполнении предыдущего кода, таков:

final IClientInterface clientInterface = client.getClient();
final prgHolder = new ProgHolder();
Pong ftppong = new Pong();
ftppong.setFileNames(bout64.toByteArray());
ftppong.setDstFolder(dstFolder);
prgHolder.setName("pong");
prgHolder.setTask(pong);
Thread t = new Thread(new Runnable() {
    public void run() {
        try {
            IClientInterface.execute(prgHolder);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
});
t.start();

Точная проблема заключается в том, что когда я достигаю нового ServerSocket (63456)По команде клиент получает «Отказано в соединении», но программа на удаленном ПК широко открыта и широко слушает!«netstat» подтверждает это!

Итак, я перезапускаю (второй раз) программу из альтернативного окна, пропускаю все сообщения HELLO и завершаю работу!

Затем поток останавливается на удаленном ПК и отсоединяет порт 63456!

Почему он не работает как код, но принимает входящие запросы?

1 Ответ

1 голос
/ 14 января 2011

Исходя из этого кода, вы должны видеть HELLO1 только один раз. Однако весьма вероятно, что вызывающий этот код находится в цикле, иначе не будет смысла проверять предыдущее значение servsock.

Что это будет делать?

servsock = null;
}
sock = servsock.accept();

Когда вы получаете исключение, не продолжайте, как если бы оно не произошло.

Если вы хотите понять, что делает ваш код, я предлагаю вам использовать отладчик для просмотра кода.

...