让我首先说明这是我在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” . 这也导致连接终止 .

(原型代码片段:)

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();
        }
    }

(我知道上面的代码不是最好的实现,但是它足以代表手头的问题 . )

在对原型进行一些修补之后,我已经发现只有在使用端口21发送“227”时才会出现这种情况(例如,使用端口4500工作正常) .

当然,对此明显的解决方法是避免使用端口21,但我想知道为什么我遇到这个 . 关于此事的任何意见都受到高度赞赏;)(只是为了确保,我正在使用JavaSE-1.7) .