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

Java “发送”;227\r\n“;在端口21上终止连接,java,ftp,termination,passive-mode,Java,Ftp,Termination,Passive Mode,让我首先声明这是我在stackoverflow上的第一篇文章。请随时指出发帖时所犯的任何错误 好吧,现在的问题有点奇怪。我目前正在为我的项目实现FTP协议,但遇到了以下问题。每次我的应用程序必须返回消息“227进入被动模式(,,,,,)”时,连接就会终止。堆栈跟踪是: java.net.SocketException: Software caused connection abort: socket write error at java.net.SocketOutputStre

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

好吧,现在的问题有点奇怪。我目前正在为我的项目实现FTP协议,但遇到了以下问题。每次我的应用程序必须返回消息“227进入被动模式(,,,,,)”时,连接就会终止。堆栈跟踪是:

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) java.net.SocketException:软件导致的连接中止:套接字写入错误 位于java.net.SocketOutputStream.socketWrite0(本机方法) 位于java.net.SocketOutputStream.socketWrite(未知源) 位于java.net.SocketOutputStream.write(未知源) 位于sun.nio.cs.streamncoder.writeBytes(未知源) 位于sun.nio.cs.streamncoder.implFlushBuffer(未知源) 位于sun.nio.cs.streamncoder.implFlush(未知源) 在sun.nio.cs.streamncoder.flush处(未知源) 位于java.io.OutputStreamWriter.flush(未知源) 位于java.io.BufferedWriter.flush(未知源) 服务器$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; 公共类服务器{ 公共静态void main(字符串[]args){ Thread Thread=新线程(new Runnable(){ 公开募捐{ serversocketserver=null; 试一试{ 服务器=新服务器套接字(21); }捕获(IOE1异常){ e1.printStackTrace(); } while(true){ 试一试{ Socket client=server.accept(); BufferedWriter writer=new BufferedWriter(new OutputStreamWriter(client.getOutputStream()); BufferedReader=new BufferedReader(new InputStreamReader(client.getInputStream()); 字符串行=null; 而((line=reader.readLine())!=null){ writer.write(“227\r\n”); writer.flush(); } }捕获(IOE异常){ e、 printStackTrace(); } } } }); thread.start(); } } (我知道上面的代码不是最好的实现,但是imho足以表示当前的问题。)

在对原型进行了一些修补之后,我发现只有在发送“227”并使用端口21时才会出现这种行为(例如,使用端口4500就可以了)


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

如果它与端口4500一起工作,而不是与端口21一起工作,这是否表明可能存在网络问题?使用
tcpdump
或类似工具查看网络级别上发生的情况。看起来确实有防火墙正在检查端口21上的流量并终止连接。好的,正如Kayaman所建议的,我想查看tcp端口21上的网络流量(使用wireshark)。。。。。当从远程设备连接到服务器时,它突然不再断开连接。到目前为止,该问题仅在使用“localhost”作为主机名连接到端口时发生。出于某些原因,使用“127.0.0.1”作为主机也可以工作。我对此感到高兴。。。。但我感到困惑。这也是因为这是几周来它第一次真正起作用。使用原型代码,我已经能够找出断开连接是由从主机发送到客户端设备的TCP RST数据包引起的。我倾向于相信这与实际应用程序(过去)失败的原因相同。有人知道为什么机器在通过端口21发送“227\r\n”时会决定发送TCP RST数据包吗? 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(); } }