Java - FTP程序在传输过程中损坏文件(Java - FTP program corrupting file during transfer)
我使用套接字创建了一个基本的客户端服务器FTP程序,但由于某些原因,文件在传输过程中被破坏了。 在下面的例子中,我正在从客户端将文件推送到服务器。 它几乎可以工作,因为一些文件(如.png)传输和打开罚款,但其他文件(.docx)则不然。 我传输的任何文件都与我发送的MD5不同。
客户代码:
File file = null; FTPDataBlock transferBlock; int numBytesRead = 0; int blockNumber = 1; int blockSize = 1024; byte[] block = new byte[blockSize]; fc = new JFileChooser(); // select file to upload int returnVal = fc.showOpenDialog(Client.this); if (returnVal == JFileChooser.APPROVE_OPTION) { file = fc.getSelectedFile(); try { // get total number of blocks and send to server int totalNumBlocks = (int)Math.ceil((file.length()*1.0) / blockSize); System.out.println("File length is: " + file.length()); FTPCommand c = new FTPCommand("PUSH", Integer.toString(totalNumBlocks)); oos = new ObjectOutputStream(sock.getOutputStream()); oos.writeObject(c); oos.flush(); // send to server block by block FileInputStream fin = new FileInputStream(file); while ((numBytesRead = fin.read(block)) != -1){ transferBlock = new FTPDataBlock(file.getName(), blockNumber, block); blockNumber++; System.out.println("Sending block " + transferBlock.getBlockNumber() + " of " + totalNumBlocks); oos = new ObjectOutputStream(sock.getOutputStream()); oos.writeObject(transferBlock); oos.flush(); } fin.close(); System.out.println("PUSH Complete"); // get response from server ois = new ObjectInputStream(sock.getInputStream()); FTPResponse response = (FTPResponse)ois.readObject(); statusArea.setText(response.getResponse()); } catch (IOException | ClassNotFoundException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } }
服务器代码:
else if (cmd.getCommand().equals("PUSH")){ // get total number of file blocks int totalNumBlocks = Integer.parseInt(cmd.getParameters()); // get first block in = new ObjectInputStream(sock.getInputStream()); FTPDataBlock currentBlock = (FTPDataBlock)in.readObject(); // create file and write first block to file File file = new File (workingDirectory + File.separator + currentBlock.getFilename()); FileOutputStream fOut = new FileOutputStream(file); fOut.write(currentBlock.getData()); fOut.flush(); // get remaining blocks while(currentBlock.getBlockNumber()+1 <= totalNumBlocks){ in = new ObjectInputStream(sock.getInputStream()); currentBlock = (FTPDataBlock)in.readObject(); fOut.write(currentBlock.getData()); fOut.flush(); } fOut.close(); // send response FTPResponse response = new FTPResponse("File Received OK"); out = new ObjectOutputStream(sock.getOutputStream()); out.writeObject(response); }
FTPDataBlock类:
public class FTPDataBlock implements Serializable{ private static final long serialVersionUID = 1L; private String filename; private int blockNumber; // current block number private byte[] data; //constructors & accessors }
我确定这是我在这里失踪的小事。 有任何想法吗?
I've made a basic client server FTP program using sockets, but for some reason files are getting corrupted during the transfer. In the case below, I'm pushing a file to the server from the client. It almost works, since some files (such as a .png) transfer and open fine, but others (a .docx) don't. Any file that I transfer has a different MD5 to the one I sent.
Client code:
File file = null; FTPDataBlock transferBlock; int numBytesRead = 0; int blockNumber = 1; int blockSize = 1024; byte[] block = new byte[blockSize]; fc = new JFileChooser(); // select file to upload int returnVal = fc.showOpenDialog(Client.this); if (returnVal == JFileChooser.APPROVE_OPTION) { file = fc.getSelectedFile(); try { // get total number of blocks and send to server int totalNumBlocks = (int)Math.ceil((file.length()*1.0) / blockSize); System.out.println("File length is: " + file.length()); FTPCommand c = new FTPCommand("PUSH", Integer.toString(totalNumBlocks)); oos = new ObjectOutputStream(sock.getOutputStream()); oos.writeObject(c); oos.flush(); // send to server block by block FileInputStream fin = new FileInputStream(file); while ((numBytesRead = fin.read(block)) != -1){ transferBlock = new FTPDataBlock(file.getName(), blockNumber, block); blockNumber++; System.out.println("Sending block " + transferBlock.getBlockNumber() + " of " + totalNumBlocks); oos = new ObjectOutputStream(sock.getOutputStream()); oos.writeObject(transferBlock); oos.flush(); } fin.close(); System.out.println("PUSH Complete"); // get response from server ois = new ObjectInputStream(sock.getInputStream()); FTPResponse response = (FTPResponse)ois.readObject(); statusArea.setText(response.getResponse()); } catch (IOException | ClassNotFoundException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } }
Server Code:
else if (cmd.getCommand().equals("PUSH")){ // get total number of file blocks int totalNumBlocks = Integer.parseInt(cmd.getParameters()); // get first block in = new ObjectInputStream(sock.getInputStream()); FTPDataBlock currentBlock = (FTPDataBlock)in.readObject(); // create file and write first block to file File file = new File (workingDirectory + File.separator + currentBlock.getFilename()); FileOutputStream fOut = new FileOutputStream(file); fOut.write(currentBlock.getData()); fOut.flush(); // get remaining blocks while(currentBlock.getBlockNumber()+1 <= totalNumBlocks){ in = new ObjectInputStream(sock.getInputStream()); currentBlock = (FTPDataBlock)in.readObject(); fOut.write(currentBlock.getData()); fOut.flush(); } fOut.close(); // send response FTPResponse response = new FTPResponse("File Received OK"); out = new ObjectOutputStream(sock.getOutputStream()); out.writeObject(response); }
FTPDataBlock class:
public class FTPDataBlock implements Serializable{ private static final long serialVersionUID = 1L; private String filename; private int blockNumber; // current block number private byte[] data; //constructors & accessors }
I'm sure it's something small that I'm missing here. Any ideas?
原文:https://stackoverflow.com/questions/21606473
最满意答案
我不是100%肯定我理解你的问题。 是
#wrapper
上的白色背景没有降到页面底部吗?如果是这样:
- 在
#wrapper
的结束标记#wrapper
,添加:<br style="clear: both" />
。- 从
#forumStats
中删除height: 50px
并添加overflow: auto
。这在Firefox中修复了它。
I'm not 100% certain I understand your problem. Is is that the white background on
#wrapper
does not come down to the bottom of the page?If so:
- Just before the closing tag for
#wrapper
, add:<br style="clear: both" />
.- From
#forumStats
, removeheight: 50px
and addoverflow: auto
.This fixes it in Firefox.
相关问答
更多-
根据您的需要,2个选项可以工作。 #main { overflow: hidden } 这会在渲染时导致对容器边界的某种重置,然后它将识别浮动的子节点。 要么... #main { float: left } 如果一个项目浮动,它将在形成框的边界时识别其浮动的子项。 浮动:权利也会起作用; 一方无所谓。 Thought i would mention as Ricky Goldman stated,a container using position:absolute will not have the ...
-
height:100%对于CSS来说是不可能的,因为height属性并不是指浏览器的视口,而是父元素的高度(在你的情况下是div或body)。 身体再次不会扩展到浏览器视口,其高度会自动缩小到您的内容。 我会强烈建议为此任务使用JavaScript。 它会为你节省很多PITA。 例如使用jQuery,你可以做类似的事情 $(document).height() - $('body').offset().top $(window).height() 或者使用“原生”JavaScript: http : ...
-
在包含div上设置overflow:auto :
- item 1
- item 2
我不是100%肯定我理解你的问题。 是#wrapper上的白色背景没有降到页面底部吗? 如果是这样: 在#wrapper的结束标记#wrapper ,添加:
。 从#forumStats中删除height: 50px并添加overflow: auto 。 这在Firefox中修复了它。 I'm not 100% certain I understand your problem. Is is that the white background on #w ...如果你添加一个 overflow: hidden; 对于您的类父级,这将启动一个新的“块格式化上下文”。 然后父级将跨越所有子元素的完整高度。 http://colinaarts.com/articles/the-magic-of-overflow-hidden/ If you add an overflow: hidden; to your class parent, this will start a new "block formatting context". Then the parent w ...通常,当你想让html和body占据视口的高度但是也允许它们随内容扩展时,你只在html上设置height: 100% ,而在body上设置min-height: 100%而不是height 。 在我对以下问题的回答中可以找到进一步的解释: 高度:100%或最小高度:100%的HTML和身体元素? 将背景应用于和/或 不幸的是,因为html是根元素,你不能单独设置min-height ,否则一切都会崩溃。 你需要height: 100%因为否则body高度及其内容没有父高; html ...相关文章
更多- 使用java实现ftp的上传与下载功能
- 基于HDFS的FTP
- 关于java ftp服务
- 《编程之道 Java》(Program JAVA)[ISO]
- Java 流(Stream)、文件(File)和IO
- jsp程序在服务器上运行,如何将本地文件上传到ftp上
- ftp登陆远程linux机器,并执行shell脚本,如何处理
- linux下可以限制IP地址对FTP功能的访问吗?
- Hadoop HDFS Wrong FS: hdfs:/ expected file:///
- 无法启动Hbase hbase-default.xml file seems to be for and old version of HBase
最新问答
更多- 获取MVC 4使用的DisplayMode后缀(Get the DisplayMode Suffix being used by MVC 4)
- 如何通过引用返回对象?(How is returning an object by reference possible?)
- 矩阵如何存储在内存中?(How are matrices stored in memory?)
- 每个请求的Java新会话?(Java New Session For Each Request?)
- css:浮动div中重叠的标题h1(css: overlapping headlines h1 in floated divs)
- 无论图像如何,Caffe预测同一类(Caffe predicts same class regardless of image)
- xcode语法颜色编码解释?(xcode syntax color coding explained?)
- 在Access 2010 Runtime中使用Office 2000校对工具(Use Office 2000 proofing tools in Access 2010 Runtime)
- 从单独的Web主机将图像传输到服务器上(Getting images onto server from separate web host)
- 从旧版本复制文件并保留它们(旧/新版本)(Copy a file from old revision and keep both of them (old / new revision))
- 西安哪有PLC可控制编程的培训
- 在Entity Framework中选择基类(Select base class in Entity Framework)
- 在Android中出现错误“数据集和渲染器应该不为null,并且应该具有相同数量的系列”(Error “Dataset and renderer should be not null and should have the same number of series” in Android)
- 电脑二级VF有什么用
- Datamapper Ruby如何添加Hook方法(Datamapper Ruby How to add Hook Method)
- 金华英语角.
- 手机软件如何制作
- 用于Android webview中图像保存的上下文菜单(Context Menu for Image Saving in an Android webview)
- 注意:未定义的偏移量:PHP(Notice: Undefined offset: PHP)
- 如何读R中的大数据集[复制](How to read large dataset in R [duplicate])
- Unity 5 Heighmap与地形宽度/地形长度的分辨率关系?(Unity 5 Heighmap Resolution relationship to terrain width / terrain length?)
- 如何通知PipedOutputStream线程写入最后一个字节的PipedInputStream线程?(How to notify PipedInputStream thread that PipedOutputStream thread has written last byte?)
- python的访问器方法有哪些
- DeviceNetworkInformation:哪个是哪个?(DeviceNetworkInformation: Which is which?)
- 在Ruby中对组合进行排序(Sorting a combination in Ruby)
- 网站开发的流程?
- 使用Zend Framework 2中的JOIN sql检索数据(Retrieve data using JOIN sql in Zend Framework 2)
- 条带格式类型格式模式编号无法正常工作(Stripes format type format pattern number not working properly)
- 透明度错误IE11(Transparency bug IE11)
- linux的基本操作命令。。。