让我首先声明这是我在 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)。