Java使用Socket传输文件遇到的问题(转)

 

1.写了一个socket传输文件的程序,发现传输过去文件有问题。找了一下午终于似乎找到了原因,记录下来警示一下:

                                             接受文件的一端,向本地写文件之前使用Thread.sleep(time)休息一下就解决了问题。

                                                   个人认为可能是传输过程中,接收端向磁盘写速度有点慢,被后面的覆盖导致错误。

//--------------------------------------------------------------------------------------------------------------------

12-29:最近看了本书<<Java Tcp/IP Socket 编程>>,似乎了解了如题这个问题的原因:

           不能假设在连接的一端将数据写入输出流和在另一端从输入流读入的数据间有任何的一致性。虽然发送端都是1024bytes为单位发送的,但是由于网速问题接收端不一定是按照1024bytes为单位接受的,可能小于1024。所以buf[0]=5这种手段是行不通的,接受方收到的buff的第一个字符可不一定是5。

            注:若以1024bytes为发送和接受缓冲区的话。

//---------------------------------------------------------------------------------------------------------------------

12-29晚:我彻底知道了原因。就是网络传输的问题,发送端以1024byte为单位发送,接收端以1024byte为单位接受。但是由于网络传输速度的限制,发送端发送出去的1024byte不能同时到达接收端,而接收端使用read独到的可能少于1024byte。下次从上次读到的下一个位置继续读,所以以1024byte数组的开头设为标识位的做法是行不通的,是错误的。解决办法是在接收端每次read之前,Thread.sleep(mileseconds);一会。这样就有足够的时间等待发送端发送的数据完全到达接受端后再接受,这样的话buff[0]的值就可以最为标示位了。

       但是还是不提倡这种设置buff[0]为表示位的做法。好的做法是,接收端收到发送文件的请求收,接受文件,不考虑标识,就没有标识位,发送端发送完文件后调用close(),以发送结束标识,接收端会通过read()收到-1。接收端关闭接受流。则,文件传输过程结束。

 

http://www.cnblogs.com/wangjiyuan/p/3493186.html

 

时间: 2024-11-05 06:12:57

Java使用Socket传输文件遇到的问题(转)的相关文章

浅析Java基于Socket的文件传输案例_java

本文实例介绍了Java基于Socket的文件传输案例,分享给大家供大家参考,具体内容如下 1.Java代码 package com.wf.demo.socket.socketfile; import java.net.*; import java.io.*; /** * 2.socket的Util辅助类 * * @author willson * */ public class ClientSocket { private String ip; private int port; private

Java基于Socket的文件传输实现方法_java

本文实例讲述了Java基于Socket的文件传输实现方法.分享给大家供大家参考,具体如下: 1. Java代码如下: package sterning; import java.io.BufferedInputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.net.Ser

java cxf webservice 传输文件异常

问题描述 java cxf webservice 传输文件异常 利用cxf传输大文件会报如下异常,请高手帮忙: [org.apache.cxf.phase.PhaseInterceptorChain]Interceptor for {http://impl.ws.zr.com/}zfFileService#{http://service.ws.zr.com/}getWsUser has thrown exception, unwinding now org.apache.cxf.intercep

套接字编程-socket传输文件时遇到的问题!

问题描述 socket传输文件时遇到的问题! 先给出代码. 客户端: SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0); SOCKADDR_IN addrSrv; addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); addrSrv.sin_family = AF_INET; addrSrv.sin_port = htons(4444); HANDLE fp =CreateFi

java socket传输文件夹出问题,帮忙修改?应该是服务器端有问题(读取文件那里有问题)

问题描述 服务器端mportjava.net.*;importjava.io.*;publicclassFolderServer{ServerSocketserver;Socketclient;DataInputStreamdis;FileOutputStreamfos;intlength;byte[]b=newbyte[1024];publicstaticvoidmain(String[]args){newFolderServer().ServerStart();}publicvoidServ

关于用Socket 传输文件的问题, 代码有点问题, 求指点

问题描述 packagetextField;importjava.net.*;importjava.io.*;publicclassFileSend{publicstaticvoidmain(String[]args){//TODO自动生成的方法存根Socketsocket;FileInputStreamfis;OutputStreamos;try{socket=newSocket("127.0.0.1",5000);os=socket.getOutputStream();fis=ne

java web-JavaWeb上传文件内存问题

问题描述 JavaWeb上传文件内存问题 问题一:JavaWeb上传文件后(几个20,30M)然后插入到数据库中,内存升高.上传完毕后,内存不会释放,内存还是那么高.用360一键加速后内存降低.有什么办法可以让上传完后就立刻释放内存? 问题二:JavaWeb上传的一个类DiskFileItemFactory(commons.fileupload包的)设置了缓存大小和临时目录,内存还是这么高,这是为什么? 问题三:用Socket传输文件(几个20,30M),服务器端想数据库获取文件,然后发送给客户

Java基于Socket文件传输示例

最近需要进行网络传输大文件,于是对基于socket的文件传输作了一个初步的了解.在一位网友提供的程序基础上,俺进行了一些加工,采用了缓冲输入/输出流来包装输出流,再采用数据输入/输出输出流进行包装,加快传输的速度.废话少说,先来看服务器端的程序. 1.服务器端 package sterning; import java.io.BufferedInputStream; import java.io.DataInputStream; import java.io.DataOutputStream;

局域网-java socket 网络传输文件使网络使用率最大化

问题描述 java socket 网络传输文件使网络使用率最大化 局域网传输文件,如何使网络使用率最大化,主要问题是在客户端接收数据写入磁盘时会影响传输效率,有没有好的办法解决呢? 解决方案 1)文件分片并使用多线程传输,文件传输前要预先在磁盘分配好文件所需空间 2)为了提高传输效率,客户端建立数据的内存缓冲区,针对每一个文件片的传输,客户端要启一个线程负载下载到缓冲区,再启一线程从缓冲区读数据写磁盘. 解决方案二: 多线程,边传输数据边写入文件