Java 我在实现“活动FTP服务器”时遇到问题

Java 我在实现“活动FTP服务器”时遇到问题,java,ftp-server,Java,Ftp Server,我在使用java实现活动ftp服务器时遇到问题 我需要一个服务器,将发送一个文件到客户端。等待客户端发回响应文件。这是一个主从协议。客户端仅在收到带有命令的文件后才进行提交 当我运行代码时,我得到的文件是空的 我的服务器代码 导入java.io.BufferedInputStream; 导入java.io.File; 导入java.io.FileInputStream; 导入java.io.IOException; 导入java.io.OutputStream; 导入java.net.Serve

我在使用java实现活动ftp服务器时遇到问题

我需要一个服务器,将发送一个文件到客户端。等待客户端发回响应文件。这是一个主从协议。客户端仅在收到带有命令的文件后才进行提交

当我运行代码时,我得到的文件是空的

我的服务器代码

导入java.io.BufferedInputStream; 导入java.io.File; 导入java.io.FileInputStream; 导入java.io.IOException; 导入java.io.OutputStream; 导入java.net.ServerSocket; 导入java.net.Socket; 导入java.io.BufferedOutputStream; 导入java.io.FileOutputStream; 导入java.io.InputStream; 公共类FTP{ 公共最终静态int文件_SIZE=6022386; public final static int SOCKET_PORT=18901;//您可以更改它 公共最终静态字符串文件_TO_SEND=c:/workspace/test/sentfromserver.txt;//您可以更改此 公共最终静态字符串文件_TO_RECEIVED=c:/workspace/test/gotfromclient.txt; 公共静态void主字符串[]args引发IOException{ FileInputStream fis=null; BufferedInputStream bis=null; OutputStream os=null; ServerSocket servsock=null; FileOutputStream=null; BufferedOutputStream bos=null; 套接字sock=null; int字节读取; 电流; 试一试{ servsock=newserversocket18901; 虽然是真的{ 系统输出打印等待。。。; 试一试{ sock=servsock.accept; System.out.PRINTLN接受的连接:+sock; //发送文件 File myFile=要发送的新文件; 字节[]mybytearray=新字节[intmyFile.length]; fis=新文件InputStreamMyFile; bis=新的缓冲数据流FIS; bis.readmybytearray,0,mybytearray.length; os=sock.getOutputStream; System.out.printlsending+文件\u TO\u SEND++mybytearray.length+字节; os.writemybytearray,0,mybytearray.length; os.flush; 系统。输出。打印完成。; mybytearray=新字节[文件大小]; InputStream为=sock.getInputStream; fos=接收到的新文件OutputStreamFile_到_; bos=新的缓冲输出流; bytesRead=is.readmybytearray,0,mybytearray.length; 当前=字节读取; 做{ 拜读= is.readmybytearray,current,mybytearray.length-current; ifbytesRead>=0当前+=bytesRead; }当字节数大于-1时; bos.writemybytearray,0,当前; bos.flush; System.out.printlnFile+接收到的文件\u到\u +下载+当前+读取字节; } 最后{ 如果bis!=null bis.close; 如果os!=空os.close; 如果sock!=空sock.close; 如果bos!=空bos.close; } } } 最后{ 如果servsock!=null servsock.close; } } } 客户端

导入java.io.BufferedInputStream; 导入java.io.File; 导入java.io.FileInputStream; 导入java.io.IOException; 导入java.io.OutputStream; 导入java.net.Socket; 导入java.io.BufferedOutputStream; 导入java.io.FileOutputStream; 导入java.io.InputStream; 公共类ftpcc{ public final static int SOCKET_PORT=18901;//您可以更改它 public final static String SERVER=127.0.0.1;//localhost 公共最终静态字符串 FILE_TO_RECEIVED=c:/workspace/test/gotfromserver.txt;//您可以更改它,我给出一个 //不同的名字,因为我不想 //覆盖服务器使用的服务器。。。 公共最终静态字符串文件_TO_SEND=c:/workspace/test/sentfromclient.txt; public final static int FILE_SIZE=6022386;//文件大小临时硬编码 //应大于要下载的文件 公共静态void主字符串[]args引发IOException{ int字节读取; int电流=0; FileOutputStream=null; BufferedOutputStream bos=null; FileInputStream fis=null; BufferedInputStream bis=null; OutputStream os=null; 套接字sock=null; 试一试{ sock=新的SocketSERVER,18901; 系统输出打印连接。。。; //接收文件 byte[]mybytearray=新字节[文件大小]; InputStream为=sock.getInputStream; fos=接收到的新文件OutputStreamFile_到_; bos=新的缓冲输出流; bytesRead=is.readmybytearray,0,mybytearray.length; 当前=字节读取; 做{ 拜读= is.readmybytearray,current,mybytearray.length-current; ifbytesRead>=0当前+=bytesRead; }当 字节读取>-1; bos.writemybytearray,0,当前; bos.flush; System.out.printlnFile+接收到的文件\u到\u +下载+当前+读取字节; File myFile=要发送的新文件; mybytearray=新字节[intmyFile.length]; fis=新文件InputStreamMyFile; bis=新的缓冲数据流FIS; bis.readmybytearray,0,mybytearray.length; os=sock.getOutputStream; System.out.printlsending+文件\u TO\u SEND++mybytearray.length+字节; os.writemybytearray,0,mybytearray.length; os.flush; 系统。输出。打印完成。; } 最后{ 如果fos!=零fos.close; 如果bos!=空bos.close; 如果sock!=空sock.close; 如果bis!=null bis.close; } } } InputStream.readbyte[],int,int方法在返回任何内容之前等待输入,并且在循环之前您已经读取了整个文件,因此您的服务器和客户端都被困在do..while循环中。删除这些,你的代码就可以正常工作了


编辑:有关如何使用循环读取文件的详细信息,请查看此项。

您好,我上周才开始使用java,请原谅我回答这个问题。你的意思是我应该删除Do while循环吗。并将正文保持为一行?如果您的文件小于硬编码的文件大小值,则在do..while循环之前读取整个文件,因此循环是不必要的。如果您的文件大于该文件的大小,它将不适合mbytearray,并且您将在循环中得到异常。因此,是的-删除循环。此外,如果您是Java新手,我建议您研究某种库,它可以处理网络上的文件传输,而不管文件大小如何,而不是自己编写代码。我的代码现在可以根据需要工作。再次感谢您的帮助。如果这是一个“FTP服务器”,则协议已经定义,而不是“这是一个主从协议”。