2

让我首先声明这是我在 stackoverflow 上的第一篇文章。随时指出发布时犯的任何错误。

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

    java.net.SocketException:软件导致连接中止:套接字写入错误
        在 java.net.SocketOutputStream.socketWrite0(本机方法)
        在 java.net.SocketOutputStream.socketWrite(未知来源)
        在 java.net.SocketOutputStream.write(未知来源)
        在 sun.nio.cs.StreamEncoder.writeBytes(未知来源)
        在 sun.nio.cs.StreamEncoder.implFlushBuffer(未知来源)
        在 sun.nio.cs.StreamEncoder.implFlush(未知来源)
        在 sun.nio.cs.StreamEncoder.flush(未知来源)
        在 java.io.OutputStreamWriter.flush(未知来源)
        在 java.io.BufferedWriter.flush(未知来源)
        在 Server$1.run(Server.java:30)
        在 java.lang.Thread.run(未知来源)

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

(原型代码片段:)

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


    公共类服务器{
        公共静态无效主要(字符串[]参数){
            线程 thread = new Thread(new Runnable() {
                公共无效运行(){
                    ServerSocket 服务器 = null;
                    尝试 {
                        服务器 = 新的 ServerSocket(21);
                    } 捕捉(IOException e1){
                        e1.printStackTrace();
                    }
                    而(真){
                        尝试 {
                            套接字客户端 = server.accept();

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

                            字符串线=空;
                            while((line = reader.readLine()) != null) {
                                writer.write("227 \r\n");
                                writer.flush();
                            }
                        } 捕捉(IOException e){
                            e.printStackTrace();
                        }
                    }
                }
            });
            线程.start();
        }
    }

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

在对原型进行一些修改后,我发现这种行为仅在发送“ 227 ”和使用端口 21 时才会发生(例如,使用端口 4500 就可以了)。

现在当然明显的解决方法是避免使用端口 21,但我想知道为什么我会遇到这种情况。非常感谢您对此事的任何意见;)(只是为了确保,我使用的是 JavaSE-1.7)。

4

0 回答 0