我在实施 "Active FTP server" 时遇到问题
I am having issues implementing an "Active FTP server"
我在使用 java 实现活动 ftp 服务器时遇到问题。
我需要一个将文件发送到客户端的服务器。等待客户端发回响应文件。 (这是一个主从协议。客户端只有在收到带有命令的文件后才进行通信。)
当我运行代码时,我得到的文件是空的。
我的服务器代码。
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
public class ftps {
public final static int FILE_SIZE=6022386;
public final static int SOCKET_PORT = 18901; // you may change this
public final static String FILE_TO_SEND = "c:/workspace/test/sentfromserver.txt"; // you may change this
public final static String FILE_TO_RECEIVED="c:/workspace/test/gotfromclient.txt";
public static void main (String [] args ) throws IOException {
FileInputStream fis = null;
BufferedInputStream bis = null;
OutputStream os = null;
ServerSocket servsock = null;
FileOutputStream fos = null;
BufferedOutputStream bos = null;
Socket sock = null;
int bytesRead;
int current;
try {
servsock = new ServerSocket(18901);
while (true) {
System.out.println("Waiting...");
try {
sock = servsock.accept();
System.out.println("Accepted connection : " + sock);
// send file
File myFile = new File (FILE_TO_SEND);
byte [] mybytearray = new byte [(int)myFile.length()];
fis = new FileInputStream(myFile);
bis = new BufferedInputStream(fis);
bis.read(mybytearray,0,mybytearray.length);
os = sock.getOutputStream();
System.out.println("Sending " + FILE_TO_SEND + "(" + mybytearray.length + " bytes)");
os.write(mybytearray,0,mybytearray.length);
os.flush();
System.out.println("Done.");
mybytearray = new byte [FILE_SIZE];
InputStream is = sock.getInputStream();
fos = new FileOutputStream(FILE_TO_RECEIVED);
bos = new BufferedOutputStream(fos);
bytesRead = is.read(mybytearray,0,mybytearray.length);
current = bytesRead;
do {
bytesRead =
is.read(mybytearray, current, (mybytearray.length-current));
if(bytesRead >= 0) current += bytesRead;
} while(bytesRead > -1);
bos.write(mybytearray, 0 , current);
bos.flush();
System.out.println("File " + FILE_TO_RECEIVED
+ " downloaded (" + current + " bytes read)");
}
finally {
if (bis != null) bis.close();
if (os != null) os.close();
if (sock!=null) sock.close();
if (bos!=null) bos.close();
}
}
}
finally {
if (servsock != null) servsock.close();
}
}
}
客户端
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
public class ftpcc {
public final static int SOCKET_PORT = 18901; // you may change this
public final static String SERVER = "127.0.0.1"; // localhost
public final static String
FILE_TO_RECEIVED = "c:/workspace/test/gotfromserver.txt"; // you may change this, I give a
// different name because i don't want to
// overwrite the one used by server...
public final static String FILE_TO_SEND="c:/workspace/test/sentfromclient.txt";
public final static int FILE_SIZE = 6022386; // file size temporary hard coded
// should bigger than the file to be downloaded
public static void main (String [] args ) throws IOException {
int bytesRead;
int current = 0;
FileOutputStream fos = null;
BufferedOutputStream bos = null;
FileInputStream fis = null;
BufferedInputStream bis = null;
OutputStream os = null;
Socket sock = null;
try {
sock = new Socket(SERVER, 18901);
System.out.println("Connecting...");
// receive file
byte [] mybytearray = new byte [FILE_SIZE];
InputStream is = sock.getInputStream();
fos = new FileOutputStream(FILE_TO_RECEIVED);
bos = new BufferedOutputStream(fos);
bytesRead = is.read(mybytearray,0,mybytearray.length);
current = bytesRead;
do {
bytesRead =
is.read(mybytearray, current, (mybytearray.length-current));
if(bytesRead >= 0) current += bytesRead;
} while(bytesRead > -1);
bos.write(mybytearray, 0 , current);
bos.flush();
System.out.println("File " + FILE_TO_RECEIVED
+ " downloaded (" + current + " bytes read)");
File myFile = new File (FILE_TO_SEND);
mybytearray = new byte [(int)myFile.length()];
fis = new FileInputStream(myFile);
bis = new BufferedInputStream(fis);
bis.read(mybytearray,0,mybytearray.length);
os = sock.getOutputStream();
System.out.println("Sending " + FILE_TO_SEND + "(" + mybytearray.length + " bytes)");
os.write(mybytearray,0,mybytearray.length);
os.flush();
System.out.println("Done.");
}
finally {
if (fos != null) fos.close();
if (bos != null) bos.close();
if (sock != null) sock.close();
if (bis !=null) bis.close();
}
}
}
InputStream.read(byte[], int, int)
方法在返回任何内容之前等待输入,并且您在循环之前已经读取了整个文件,因此您的服务器和客户端都陷入了 do..while
循环。删除它们,您的代码将正常工作。
编辑:检查此 question 了解如何使用循环读取文件的详细信息。
我在使用 java 实现活动 ftp 服务器时遇到问题。
我需要一个将文件发送到客户端的服务器。等待客户端发回响应文件。 (这是一个主从协议。客户端只有在收到带有命令的文件后才进行通信。)
当我运行代码时,我得到的文件是空的。
我的服务器代码。
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
public class ftps {
public final static int FILE_SIZE=6022386;
public final static int SOCKET_PORT = 18901; // you may change this
public final static String FILE_TO_SEND = "c:/workspace/test/sentfromserver.txt"; // you may change this
public final static String FILE_TO_RECEIVED="c:/workspace/test/gotfromclient.txt";
public static void main (String [] args ) throws IOException {
FileInputStream fis = null;
BufferedInputStream bis = null;
OutputStream os = null;
ServerSocket servsock = null;
FileOutputStream fos = null;
BufferedOutputStream bos = null;
Socket sock = null;
int bytesRead;
int current;
try {
servsock = new ServerSocket(18901);
while (true) {
System.out.println("Waiting...");
try {
sock = servsock.accept();
System.out.println("Accepted connection : " + sock);
// send file
File myFile = new File (FILE_TO_SEND);
byte [] mybytearray = new byte [(int)myFile.length()];
fis = new FileInputStream(myFile);
bis = new BufferedInputStream(fis);
bis.read(mybytearray,0,mybytearray.length);
os = sock.getOutputStream();
System.out.println("Sending " + FILE_TO_SEND + "(" + mybytearray.length + " bytes)");
os.write(mybytearray,0,mybytearray.length);
os.flush();
System.out.println("Done.");
mybytearray = new byte [FILE_SIZE];
InputStream is = sock.getInputStream();
fos = new FileOutputStream(FILE_TO_RECEIVED);
bos = new BufferedOutputStream(fos);
bytesRead = is.read(mybytearray,0,mybytearray.length);
current = bytesRead;
do {
bytesRead =
is.read(mybytearray, current, (mybytearray.length-current));
if(bytesRead >= 0) current += bytesRead;
} while(bytesRead > -1);
bos.write(mybytearray, 0 , current);
bos.flush();
System.out.println("File " + FILE_TO_RECEIVED
+ " downloaded (" + current + " bytes read)");
}
finally {
if (bis != null) bis.close();
if (os != null) os.close();
if (sock!=null) sock.close();
if (bos!=null) bos.close();
}
}
}
finally {
if (servsock != null) servsock.close();
}
}
}
客户端
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
public class ftpcc {
public final static int SOCKET_PORT = 18901; // you may change this
public final static String SERVER = "127.0.0.1"; // localhost
public final static String
FILE_TO_RECEIVED = "c:/workspace/test/gotfromserver.txt"; // you may change this, I give a
// different name because i don't want to
// overwrite the one used by server...
public final static String FILE_TO_SEND="c:/workspace/test/sentfromclient.txt";
public final static int FILE_SIZE = 6022386; // file size temporary hard coded
// should bigger than the file to be downloaded
public static void main (String [] args ) throws IOException {
int bytesRead;
int current = 0;
FileOutputStream fos = null;
BufferedOutputStream bos = null;
FileInputStream fis = null;
BufferedInputStream bis = null;
OutputStream os = null;
Socket sock = null;
try {
sock = new Socket(SERVER, 18901);
System.out.println("Connecting...");
// receive file
byte [] mybytearray = new byte [FILE_SIZE];
InputStream is = sock.getInputStream();
fos = new FileOutputStream(FILE_TO_RECEIVED);
bos = new BufferedOutputStream(fos);
bytesRead = is.read(mybytearray,0,mybytearray.length);
current = bytesRead;
do {
bytesRead =
is.read(mybytearray, current, (mybytearray.length-current));
if(bytesRead >= 0) current += bytesRead;
} while(bytesRead > -1);
bos.write(mybytearray, 0 , current);
bos.flush();
System.out.println("File " + FILE_TO_RECEIVED
+ " downloaded (" + current + " bytes read)");
File myFile = new File (FILE_TO_SEND);
mybytearray = new byte [(int)myFile.length()];
fis = new FileInputStream(myFile);
bis = new BufferedInputStream(fis);
bis.read(mybytearray,0,mybytearray.length);
os = sock.getOutputStream();
System.out.println("Sending " + FILE_TO_SEND + "(" + mybytearray.length + " bytes)");
os.write(mybytearray,0,mybytearray.length);
os.flush();
System.out.println("Done.");
}
finally {
if (fos != null) fos.close();
if (bos != null) bos.close();
if (sock != null) sock.close();
if (bis !=null) bis.close();
}
}
}
InputStream.read(byte[], int, int)
方法在返回任何内容之前等待输入,并且您在循环之前已经读取了整个文件,因此您的服务器和客户端都陷入了 do..while
循环。删除它们,您的代码将正常工作。
编辑:检查此 question 了解如何使用循环读取文件的详细信息。