在端口21上发送“227 \ r \ n”会终止连接

时间:2015-03-06 13:05:04

标签: java ftp termination passive-mode

首先我要说明这是我在stackoverflow上发表的第一篇文章。随意指出发布时所犯的任何错误。

好的,所以手头的问题有点奇怪。我目前正在为我的项目实现FTP协议,但遇到了以下问题。每次我的应用程序必须返回消息" 227进入被动模式(< ip1>,< ip2>,< ip3>,< ip4>,< port1>,< port2> 。)"连接已终止。堆栈跟踪是:


    java.net.SocketException: Software caused connection abort: socket write error
        at java.net.SocketOutputStream.socketWrite0(Native Method)
        at java.net.SocketOutputStream.socketWrite(Unknown Source)
        at java.net.SocketOutputStream.write(Unknown Source)
        at sun.nio.cs.StreamEncoder.writeBytes(Unknown Source)
        at sun.nio.cs.StreamEncoder.implFlushBuffer(Unknown Source)
        at sun.nio.cs.StreamEncoder.implFlush(Unknown Source)
        at sun.nio.cs.StreamEncoder.flush(Unknown Source)
        at java.io.OutputStreamWriter.flush(Unknown Source)
        at java.io.BufferedWriter.flush(Unknown Source)
        at Server$1.run(Server.java:30)
        at java.lang.Thread.run(Unknown Source)

为了复制行为,我决定构建一个原型,它接受端口21上的连接并发送消息" 227 "收到客户端的任意消息后。这也会导致连接终止。

(Prototype Code snippet:)


    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.net.ServerSocket;
    import java.net.Socket;


    public class Server {
        public static void main(String[] args) {
            Thread thread = new Thread(new Runnable() {
                public void run() {
                    ServerSocket server = null;
                    try {
                        server = new ServerSocket(21);
                    } catch (IOException e1) {
                        e1.printStackTrace();
                    }
                    while(true) {
                        try {
                            Socket client = server.accept();

                            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
                            BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream()));

                            String 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 个答案:

没有答案