所以我有一份来自学校的家庭作业,其中客户必须向服务器发送无限量的文件。我的想法是这样的。
我有工作代码,但此代码只能从客户端向服务器发送1个文件。我还希望增加上传文件的文件名,因为在我的代码中它只使用1个文件名,所以如果更多客户上传了他们的文件,他们将覆盖旧文件名。
例如:file01.rar接下来上传file02.rar等。
这是我的服务器代码:
public void run() {
filePath = "C:/wamp/www/file.rar";
byte[] aByte = new byte[1];
int bytesRead;
InputStream is = null;
try {
is = clientSocket.getInputStream();
} catch (IOException ie) {
ie.printStackTrace();
}
ByteArrayOutputStream baos = new ByteArrayOutputStream();
if (is != null) {
FileOutputStream fos = null;
BufferedOutputStream bos = null;
try {
fos = new FileOutputStream(filePath);
bos = new BufferedOutputStream(fos);
bytesRead = is.read(aByte, 0, aByte.length);
do {
baos.write(aByte);
bytesRead = is.read(aByte);
} while (bytesRead != -1);
bos.write(baos.toByteArray());
bos.flush();
bos.close();
} catch (IOException ie) {
ie.printStackTrace();
}
}
}
这是我的客户代码:
BufferedOutputStream bos = null;
try {
bos = new BufferedOutputStream(s.getOutputStream());
} catch (IOException ie) {
ie.printStackTrace();
}
if (bos != null) {
File uploadFile = new File(clientFacultyUploadTextField.getText());
byte[] myFileSize = new byte[(int)uploadFile.length()];
FileInputStream fis = null;
try {
fis = new FileInputStream(uploadFile);
} catch (FileNotFoundException fife) {
fife.printStackTrace();
}
BufferedInputStream bis = new BufferedInputStream(fis);
try {
bis.read(myFileSize, 0, myFileSize.length);
bos.write(myFileSize, 0, myFileSize.length);
bos.flush();
bos.close();
clientFacultyUploadTextField.setText("Upload complete...");
} catch (IOException ie) {
ie.printStackTrace();
}
}
答案 0 :(得分:0)
当您发送多个文件时,您需要在一个文件停止并且另一个文件开始时告诉服务器,以便它可以单独处理它们。
有多种方法可以解决这个问题。这里有一些,从简单但有限但有限但令人印象深刻的命令:
a)为每个文件使用新连接,并在传输完成后将其关闭。这告诉服务器文件已结束。这样做的好处是您可以轻松扩展它以允许同时上载多个文件。缺点:当传输由于某种原因而中断时,服务器可能不会将此检测为错误并将部分文件保存为完成。
b)使用相同的连接,但告诉服务器每个文件的长度。您可以通过以文件的长度(以字节为单位)启动每个文件传输来完成此操作。这样服务器就可以读取这个字节数,然后启动一个新文件。当然,这仅在事先知道文件大小时才有效。当您在上传过程中流式传输仍在创建的文件时,无法使用它。
c)使用成帧协议。将文件分隔成块,并在每个块前面加上一个标题,告诉服务器块的长度,以及它是否是最后一个块,或者是否会有更多的块。此方法有一些开销,但它是一个非常可扩展的体系结构,允许您通过向标头添加更多信息来轻松添加新功能。例如,您可以通过将传输ID添加到标头,通过添加序列号和控制代码来中止和恢复上载,允许通过一个连接多路复用多个传输,特殊命令帧告诉服务器删除或重命名它已经拥有的文件等等。有关灵感,请查看HTTP和FTP的工作原理。