Отправка "227 \r\n" на порт 21 прерывает соединение

Позвольте мне вначале заявить, что это мой первый пост здесь, посвященный stackru. Не стесняйтесь указывать на любые ошибки, сделанные при публикации.

Итак, проблема под рукой немного странная. В настоящее время я реализую протокол FTP для моего проекта, но столкнулся со следующей проблемой. Каждый раз, когда мое приложение должно возвращать сообщение "227 Вход в пассивный режим (,,,,,)." Соединение прерывается. Трассировка стека:

    java.net.SocketException: программное обеспечение вызвало прерывание соединения: ошибка записи в сокет
        в java.net.SocketOutputStream.socketWrite0(собственный метод)
        в java.net.SocketOutputStream.socketWrite(Неизвестный источник)
        на java.net.SocketOutputStream.write(неизвестный источник)
        at sun.nio.cs.StreamEncoder.writeBytes(неизвестный источник)
        at sun.nio.cs.StreamEncoder.implFlushBuffer(Неизвестный источник)
        at sun.nio.cs.StreamEncoder.implFlush(неизвестный источник)
        at sun.nio.cs.StreamEncoder.flush(неизвестный источник)
        at java.io.OutputStreamWriter.flush(Неизвестный источник)
        at java.io.BufferedWriter.flush(неизвестный источник)
        на сервере $1.run(Server.java:30)
        на java.lang.Thread.run(неизвестный источник)

Чтобы повторить поведение, я решил создать прототип, который принимает соединение через порт 21 и отправляет сообщение "227" после получения произвольного сообщения от клиента. Это также приводит к разрыву соединения.

(Фрагмент кода прототипа:)

    импорт java.io.BufferedReader;
    импорт java.io.BufferedWriter;
    импорт java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.net.ServerSocket;
    импорт java.net.Socket;


    публичный сервер класса {
        public static void main(String[] args) {
            Тема потока = новая тема (новая Runnable() {
                public void run() {
                    ServerSocket server = ноль;
                    пытаться {
                        сервер = новый ServerSocket(21);
                    } catch (IOException e1) {
                        e1.printStackTrace();
                    }
                    while(true) {
                        пытаться {
                            Socket client = server.accept();

                            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
                            BufferedReader reader = new BufferedReader(новый InputStreamReader(client.getInputStream()));

                            Строка line = null;
                            while((line = reader.readLine())!= null) {
                                writer.write("227 \r\n");
                                writer.flush();
                            }
                        } catch(IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            });
            Thread.start ();
        }
    }

(Я знаю, что приведенный выше код не является самой хорошей реализацией, но он достаточно адекватен для представления проблемы).

После некоторых экспериментов с прототипом я понял, что такое поведение происходит только при отправке "227" в сочетании с использованием порта 21 (например, использование порта 4500 работает просто отлично).

Теперь, конечно, очевидный обходной путь - избегать использования порта 21, но я хотел бы знать, почему я испытываю это. Любая информация по этому вопросу высоко ценится;) (просто чтобы убедиться, что я использую JavaSE-1.7).

0 ответов

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