java socket传输文件二进制文件问题

Java Socket编程
基于TCP方式的二进制文件传输_百度文库
赠送免券下载特权
10W篇文档免费专享
部分付费文档8折起
每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
Java Socket编程
基于TCP方式的二进制文件传输
&&基于TCP方式的二进制文件传输
你可能喜欢博客分类:
在网络流中如果不使用任何标记,是不知道流是否结束的。但在读到网络流时,我们是可以知道这次可以读多少字节的内容,方法就是使用inputStream. available (),但一定要在调用read()至少一次之后,也就是说available方法一定要在read后调用,不然就只能得到零值。注,这里所的是网络传输中的流是这样,但文件流不是这样的,文件流可以直接使用available来判断还有多少字节的内容可读取。
InputStream的available()含义:返回此输入流在不受阻塞情况下能读取的字节数。网络流与文件流不同的关键就在于是否“受阻”二字,网络socket流在读取时如果没有内容read()方法是会受阻的,所以从socket初始化的输入流的available也是为零的,所以要read一字节后再使用,这样可用的字节数就等于 available + 1。但文件读取时read()一般是不会受阻的,因为文件流的可用字节数 available = file.length(),而文件的内容长度在创建File对象时就已知了。 注:类InputStream的available方法总是返回0。网络socket输入流可用字节数代码所示:
//将接收到的数据存到字节数组array
int firstChar = inputStream.read();
int length = inputStream.available();
byte[] array = new byte[length+1];
array[0] = (byte)firstC
inputStream.read(array,1,length);
文件流的可用字节数如代码所示:
FileInputStream fi = new FileInputStream("e:/tmp/tmp");
//循环读出所有文件内容,可以在read前就直接使用
while (fi.available() & 0) {
System.out.println((byte) fi.read());//直接输出内容的编码,而非字符编码。可能为负,如二进制的图片文件
fi.close();
junJZ_2008
浏览: 1102906 次
来自: 湖南澧縣
引用String a= &abc&,首先在 ...
谢谢分享matcher.appendReplacement(s ...
完全理解,比网上其他资料都要详细
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'当前位置:
java连接FTP传输文件不成功
java连接FTP传输文件不成功
来源:网络整理&&&&&时间: 12:42:47&&&&&关键词:java,ftp
关于网友提出的“java连接FTP传输文件不成功”问题疑问,本网通过在网上对“java连接FTP传输文件不成功”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题:java连接FTP传输文件不成功
描述:当前情况,有一台FTP服务器用来存放文件。有部署在两个机器上的同一应用往此FTP传输文件;一个测试,一个正式。测试和正式对FTP的配置完全相同,测试能正常传文件上去,正式不能。
在正式环境上,ping ftp:通;telnet ftp:通;命令行ftp登录,通;文件夹上直接输入地址ftp://ip打开远程ftp,通;用FileZilla工具连接,通并可以正常传文件上去,并在远程可以创建文件和目录。
现在,就是写的java代码,用sun的未公开的API写的,不行。用org.apache.commons.net.ftp工具jar写的代码,不行。以为是自己代码有某种缺陷,然后。下载了一个java版本FTP连接工具去连接这个FTP,此工具也连接不上。
当前,我的代码连接报错:java.net.ConnectException: Connection timed out: connect
这是什么gui?有思路的或者遇到过的,求指点。解决方案1:问题已经找到:现场的哥们测试机和正式机IP地址配置的不一样。正式机上IP地址配错了,也是醉了。不是传输方面的诡异类问题。解决方案2:
基本就是防火墙的问题。
看你的描述,推测你的FTP是使用的主动模式(默认),主动模式的情况下,客户端需要开启一个单独的端口来传送数据。
如果是Linux的话,你可以试试 service iptables stop(关闭防火墙),然后继续测试能不能行。
解决方案3:用着呢,没有问题的,防火墙设置什么的,没有问题么?
以上介绍了“java连接FTP传输文件不成功”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/1240406.html
上一篇: 下一篇:服务器(Server)
[java] view plaincopy
package com.socket.&
import java.io.BufferedInputS&
import java.io.DataInputS&
import java.io.DataOutputS&
import java.io.F&
import java.io.FileInputS&
import java.net.ServerS&
import java.net.S&
public class ServerTest {&
&&& int port = 8821;&
&&& void start() {&
&&&&&&& Socket s =&
&&&&&&& try {&
&&&&&&&&&&& ServerSocket ss = new ServerSocket(port);&
&&&&&&&&&&& while (true) {&
&&&&&&&&&&&&&&& // 选择进行传输的文件&
&&&&&&&&&&&&&&& String filePath = "D:\\lib.rar";&
&&&&&&&&&&&&&&& File fi = new File(filePath);&
&&&&&&&&&&&&&&& System.out.println("文件长度:" + (int) fi.length());&
&&&&&&&&&&&&&&& // public Socket accept() throws&
&&&&&&&&&&&&&&& // IOException侦听并接受到此套接字的连接。此方法在进行连接之前一直阻塞。&
&&&&&&&&&&&&&&& s = ss.accept();&
&&&&&&&&&&&&&&& System.out.println("建立socket链接");&
&&&&&&&&&&&&&&& DataInputStream dis = new DataInputStream(&
&&&&&&&&&&&&&&&&&&&&&&& new BufferedInputStream(s.getInputStream()));&
&&&&&&&&&&&&&&& dis.readByte();&
&&&&&&&&&&&&&&& DataInputStream fis = new DataInputStream(&
&&&&&&&&&&&&&&&&&&&&&&& new BufferedInputStream(new FileInputStream(filePath)));&
&&&&&&&&&&&&&&& DataOutputStream ps = new DataOutputStream(s.getOutputStream());&
&&&&&&&&&&&&&&& // 将文件名及长度传给客户端。这里要真正适用所有平台,例如中文名的处理,还需要加工,具体可以参见Think In Java&
&&&&&&&&&&&&&&& // 4th里有现成的代码。&
&&&&&&&&&&&&&&& ps.writeUTF(fi.getName());&
&&&&&&&&&&&&&&& ps.flush();&
&&&&&&&&&&&&&&& ps.writeLong((long) fi.length());&
&&&&&&&&&&&&&&& ps.flush();&
&&&&&&&&&&&&&&& int bufferSize = 8192;&
&&&&&&&&&&&&&&& byte[] buf = new byte[bufferSize];&
&&&&&&&&&&&&&&& while (true) {&
&&&&&&&&&&&&&&&&&&& int read = 0;&
&&&&&&&&&&&&&&&&&&& if (fis != null) {&
&&&&&&&&&&&&&&&&&&&&&&& read = fis.read(buf);&
&&&&&&&&&&&&&&&&&&&&&&& // 从包含的输入流中读取一定数量的字节,并将它们存储到缓冲区数组 b&
&&&&&&&&&&&&&&&&&&&&&&& // 中。以整数形式返回实际读取的字节数。在输入数据可用、检测到文件末尾 (end of file)&
&&&&&&&&&&&&&&&&&&&&&&& // 或抛出异常之前,此方法将一直阻塞。&
&&&&&&&&&&&&&&&&&&& }&
&&&&&&&&&&&&&&&&&&& if (read == -1) {&
&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&& }&
&&&&&&&&&&&&&&&&&&& ps.write(buf, 0, read);&
&&&&&&&&&&&&&&& }&
&&&&&&&&&&&&&&& ps.flush();&
&&&&&&&&&&&&&&& // 注意关闭socket链接哦,不然客户端会等待server的数据过来,&
&&&&&&&&&&&&&&& // 直到socket超时,导致数据不完整。&
&&&&&&&&&&&&&&& fis.close();&
&&&&&&&&&&&&&&& s.close();&
&&&&&&&&&&&&&&& System.out.println("文件传输完成");&
&&&&&&&&&&& }&
&&&&&&& } catch (Exception e) {&
&&&&&&&&&&& e.printStackTrace();&
&&&&&&& }&
&&& public static void main(String arg[]) {&
&&&&&&& new ServerTest().start();&
客户端工具(SocketTool)
[java] view plaincopy
package com.socket.&
import java.io.BufferedInputS&
import java.io.DataInputS&
import java.io.DataOutputS&
import java.net.S&
public class ClientSocket {&
&&& private S&
&&& private Socket socket =&
&&& DataOutputStream out =&
&&& DataInputStream getMessageStream =&
&&& public ClientSocket(String ip, int port) {&
&&&&&&& this.ip =&
&&&&&&& this.port =&
&&& /** */&
&&&& * 创建socket连接
&&&& * @throws Exception
&&&& *&&&&&&&&&&&& exception
&&& public void CreateConnection() throws Exception {&
&&&&&&& try {&
&&&&&&&&&&& socket = new Socket(ip, port);&
&&&&&&& } catch (Exception e) {&
&&&&&&&&&&& e.printStackTrace();&
&&&&&&&&&&& if (socket != null)&
&&&&&&&&&&&&&&& socket.close();&
&&&&&&&&&&&&
&&&&&&& } finally {&
&&&&&&& }&
&&& public void sendMessage(String sendMessage) throws Exception {&
&&&&&&& try {&
&&&&&&&&&&& out = new DataOutputStream(socket.getOutputStream());&
&&&&&&&&&&& if (sendMessage.equals("Windows")) {&
&&&&&&&&&&&&&&& out.writeByte(0x1);&
&&&&&&&&&&&&&&& out.flush();&
&&&&&&&&&&&&&&&&
&&&&&&&&&&& }&
&&&&&&&&&&& if (sendMessage.equals("Unix")) {&
&&&&&&&&&&&&&&& out.writeByte(0x2);&
&&&&&&&&&&&&&&& out.flush();&
&&&&&&&&&&&&&&&&
&&&&&&&&&&& }&
&&&&&&&&&&& if (sendMessage.equals("Linux")) {&
&&&&&&&&&&&&&&& out.writeByte(0x3);&
&&&&&&&&&&&&&&& out.flush();&
&&&&&&&&&&& } else {&
&&&&&&&&&&&&&&& out.writeUTF(sendMessage);&
&&&&&&&&&&&&&&& out.flush();&
&&&&&&&&&&& }&
&&&&&&& } catch (Exception e) {&
&&&&&&&&&&& e.printStackTrace();&
&&&&&&&&&&& if (out != null)&
&&&&&&&&&&&&&&& out.close();&
&&&&&&&&&&&&
&&&&&&& } finally {&
&&&&&&& }&
&&& public DataInputStream getMessageStream() throws Exception {&
&&&&&&& try {&
&&&&&&&&&&& getMessageStream = new DataInputStream(new BufferedInputStream(&
&&&&&&&&&&&&&&&&&&& socket.getInputStream()));&
&&&&&&&&&&& return getMessageS&
&&&&&&& } catch (Exception e) {&
&&&&&&&&&&& e.printStackTrace();&
&&&&&&&&&&& if (getMessageStream != null)&
&&&&&&&&&&&&&&& getMessageStream.close();&
&&&&&&&&&&&&
&&&&&&& } finally {&
&&&&&&& }&
&&& public void shutDownConnection() {&
&&&&&&& try {&
&&&&&&&&&&& if (out != null)&
&&&&&&&&&&&&&&& out.close();&
&&&&&&&&&&& if (getMessageStream != null)&
&&&&&&&&&&&&&&& getMessageStream.close();&
&&&&&&&&&&& if (socket != null)&
&&&&&&&&&&&&&&& socket.close();&
&&&&&&& } catch (Exception e) {&
&&&&&&& }&
客户端(Client)
[java] view plaincopy
package com.socket.&
import java.io.BufferedOutputS&
import java.io.DataInputS&
import java.io.DataOutputS&
import java.io.FileOutputS&
public class ClientTest {&
&&& private ClientSocket cs =&
&&& private String ip = "localhost";// 设置成服务器IP&
&&& private int port = 8821;&
&&& private String sendMessage = "Windows";&
&&& public ClientTest() {&
&&&&&&& try {&
&&&&&&&&&&& if (createConnection()) {&
&&&&&&&&&&&&&&& sendMessage();&
&&&&&&&&&&&&&&& getMessage();&
&&&&&&&&&&& }&
&&&&&&& } catch (Exception ex) {&
&&&&&&&&&&& ex.printStackTrace();&
&&&&&&& }&
&&& private boolean createConnection() {&
&&&&&&& cs = new ClientSocket(ip, port);&
&&&&&&& try {&
&&&&&&&&&&& cs.CreateConnection();&
&&&&&&&&&&& System.out.print("连接服务器成功!" + "\n");&
&&&&&&&&&&&&
&&&&&&& } catch (Exception e) {&
&&&&&&&&&&& System.out.print("连接服务器失败!" + "\n");&
&&&&&&&&&&&&
&&&&&&& }&
&&& private void sendMessage() {&
&&&&&&& if (cs == null)&
&&&&&&&&&&&&
&&&&&&& try {&
&&&&&&&&&&& cs.sendMessage(sendMessage);&
&&&&&&& } catch (Exception e) {&
&&&&&&&&&&& System.out.print("发送消息失败!" + "\n");&
&&&&&&& }&
&&& private void getMessage() {&
&&&&&&& if (cs == null)&
&&&&&&&&&&&&
&&&&&&& DataInputStream inputStream =&
&&&&&&& try {&
&&&&&&&&&&& inputStream = cs.getMessageStream();&
&&&&&&& } catch (Exception e) {&
&&&&&&&&&&& System.out.print("接收消息缓存错误\n");&
&&&&&&&&&&&&
&&&&&&& }&
&&&&&&& try {&
&&&&&&&&&&& // 本地保存路径,文件名会自动从服务器端继承而来。&
&&&&&&&&&&& String savePath = "E:\\";&
&&&&&&&&&&& int bufferSize = 8192;&
&&&&&&&&&&& byte[] buf = new byte[bufferSize];&
&&&&&&&&&&& int passedlen = 0;&
&&&&&&&&&&& long len = 0;&
&&&&&&&&&&& savePath += inputStream.readUTF();&
&&&&&&&&&&& DataOutputStream fileOut = new DataOutputStream(&
&&&&&&&&&&&&&&&&&&& new BufferedOutputStream(new FileOutputStream(savePath)));&
&&&&&&&&&&& len = inputStream.readLong();&
&&&&&&&&&&& System.out.println("文件的长度为:" + len + "\n");&
&&&&&&&&&&& System.out.println("开始接收文件!" + "\n");&
&&&&&&&&&&& while (true) {&
&&&&&&&&&&&&&&& int read = 0;&
&&&&&&&&&&&&&&& if (inputStream != null) {&
&&&&&&&&&&&&&&&&&&& read = inputStream.read(buf);&
&&&&&&&&&&&&&&& }&
&&&&&&&&&&&&&&& passedlen +=&
&&&&&&&&&&&&&&& if (read == -1) {&
&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&& }&
&&&&&&&&&&&&&&& // 下面进度条本为图形界面的prograssBar做的,这里如果是打文件,可能会重复打印出一些相同的百分比&
&&&&&&&&&&&&&&& System.out.println("文件接收了" + (passedlen * 100 / len) + "%\n");&
&&&&&&&&&&&&&&& fileOut.write(buf, 0, read);&
&&&&&&&&&&& }&
&&&&&&&&&&& System.out.println("接收完成,文件存为" + savePath + "\n");&
&&&&&&&&&&& fileOut.close();&
&&&&&&& } catch (Exception e) {&
&&&&&&&&&&& System.out.println("接收消息错误" + "\n");&
&&&&&&&&&&&&
&&&&&&& }&
&&& public static void main(String arg[]) {&
&&&&&&& new ClientTest().getMessage();&
测试是成功的,在DOS命令行下编译~~~
浏览 11451
浏览: 58295 次
solr5视频教程,观看地址:http://www.xuetu ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'博客分类:
闲着无聊,写了一个基于java的socket文件传输。
是这样设计的:
提供文件传输的server服务器端,接收client发送过来的文件。
提供多线程并发处理,能同时处理多个client的文件传输请求。
根据提供的参数指定的server以及本地文件的路径,进行文件传输
client的代码
import java.io.BufferedInputS
import java.io.BufferedOutputS
import java.io.F
import java.io.FileInputS
import java.io.IOE
import java.net.InetA
import java.net.InetSocketA
import java.net.S
import java.net.SocketA
import org.apache.commons.io.IOU
import org.apache.commons.lang.StringU
import org.apache.log4j.L
public class FileClient {
private static final Logger LOGGER = Logger.getLogger(FileClient.class);
public void sendFile(File file, String host, int port) throws IOException {
if (!file.exists() || !file.isFile()) {
throw new IllegalArgumentException("file : " + file
+ " is not a valid file!");
connect(host, port);
sendFile(file);
private void sendFile(File file) throws IOException {
BufferedOutputStream fileOutput = new BufferedOutputStream(
socket.getOutputStream());
BufferedInputStream input = new BufferedInputStream(
new FileInputStream(file));
IOUtils.copy(input, fileOutput);
fileOutput.flush();
IOUtils.closeQuietly(input);
IOUtils.closeQuietly(fileOutput);
private void close() throws IOException {
if (isConnected()) {
socket.close();
private boolean isConnected() {
return null != socket && socket.isConnected() && !socket.isClosed();
private void connect(String host, int port) throws IOException {
if (isConnected()) {
socket = new Socket();
socket.setKeepAlive(true);
socket.setReuseAddress(true);
InetAddress addr = InetAddress.getByName(host);
SocketAddress endpoint = new InetSocketAddress(addr, port);
socket.connect(endpoint);
* @param args
public static void main(String[] args) {
String filePath = System.getProperty("file");
if (StringUtils.isEmpty(filePath)) {
LOGGER.error("Error: JVM argumengs -Dfile is null !");
String host = System.getProperty("host");
if (StringUtils.isEmpty(host)) {
LOGGER.error("Error: JVM argumengs -Dhost is null !");
String portString = System.getProperty("port");
if (StringUtils.isEmpty(portString)) {
LOGGER.error("Error: JVM argumengs -Dport is null !");
int port = Integer.valueOf(portString).intValue();
File file = new File(filePath);
FileClient client = new FileClient();
LOGGER.info("start to transfer file : " + file);
long before = System.currentTimeMillis();
client.sendFile(file, host, port);
LOGGER.info("transfer file : " + file
+ " successfully! It consumes "
+ (System.currentTimeMillis() - before) + " ms.");
} catch (IOException e) {
LOGGER.error("Error:" + e.getMessage(), e);
server的代码:
import java.io.F
import java.net.S
import java.util.concurrent.BlockingQ
import java.util.concurrent.ExecutorS
import java.util.concurrent.E
import java.util.concurrent.LinkedBlockingQ
public class Bootstrap {
* @param args
public static void main(String[] args) throws Exception{
int cpuTimes = 4;
int port = 7777;
BlockingQueue&Socket& queue = new LinkedBlockingQueue&Socket&();
ExecutorService exec = Executors.newCachedThreadPool();
exec.execute(new FileEchoServer("server-1", port, queue));
File path = new File("E:/temp");
for (int i = 0, count = Runtime.getRuntime().availableProcessors()
* cpuT i & i++) {
exec.execute(new FileConsumer("socket-" + i, queue,path));
exec.shutdown();
import java.io.IOE
import java.net.ServerS
import java.net.S
import java.util.concurrent.BlockingQ
import org.apache.log4j.L
* @author kanpiaoxue
public class FileEchoServer implements Runnable {
protected static final Logger LOGGER = Logger.getLogger(FileEchoServer.class);
protected final ServerSocket serverS
protected final BlockingQueue&Socket&
protected final S
public FileEchoServer(String name, int port, BlockingQueue&Socket& queue)
throws IOException {
serverSocket = new ServerSocket(port);
serverSocket.setReuseAddress(true);
LOGGER.info(serverSocket);
this.queue =
this.name =
public void run() {
setName(name);
while (true) {
queue.put(serverSocket.accept());
} catch (Exception e) {
LOGGER.error("Error:" + e.getMessage(), e);
private void setName(String name) {
Thread.currentThread().setName(name);
LOGGER.info(name + " start to work.");
import java.net.S
import java.util.concurrent.BlockingQ
import org.apache.log4j.L
* @author kanpiaoxue
public abstract class AbstractSocketConsumer implements Runnable {
protected static final Logger LOGGER = Logger
.getLogger(AbstractSocketConsumer.class);
protected final S
protected final BlockingQueue&Socket&
public AbstractSocketConsumer(String name, BlockingQueue&Socket& queue) {
this.name =
this.queue =
private void setName(String name) {
Thread.currentThread().setName(name);
LOGGER.info(name + " start to work.");
public void run() {
setName(name);
while (true) {
consume(queue.take());
} catch (Exception e) {
LOGGER.error("Error:" + e.getMessage(), e);
protected abstract void consume(Socket socket) throws E
import java.io.BufferedInputS
import java.io.BufferedOutputS
import java.io.F
import java.io.FileOutputS
import java.io.PrintW
import java.net.S
import java.util.concurrent.BlockingQ
import java.util.concurrent.atomic.AtomicL
import org.apache.commons.io.IOU
import com.wanmei.net.slef.file.AbstractSocketC
public class FileConsumer extends AbstractSocketConsumer {
private File fileP
private static final AtomicLong FILE_COUNT = new AtomicLong();
public FileConsumer(String name, BlockingQueue&Socket& queue, File path) {
super(name, queue);
this.filePath =
protected void consume(Socket socket) throws Exception {
LOGGER.info("start to receive file from "
+ socket.getInetAddress().getHostName() + ":"
+ socket.getPort());
long before = System.currentTimeMillis();
File file = new File(filePath, "file-" + FILE_COUNT.getAndIncrement());
if (file.exists()) {
file.delete();
BufferedOutputStream fileOutput = new BufferedOutputStream(
new FileOutputStream(file));
BufferedInputStream input = new BufferedInputStream(
socket.getInputStream());
IOUtils.copy(input, fileOutput);
fileOutput.flush();
PrintWriter response = new PrintWriter(socket.getOutputStream());
String responseString = echo(socket);
response.println(responseString);
response.flush();
if (null != socket) {
IOUtils.closeQuietly(input);
IOUtils.closeQuietly(fileOutput);
IOUtils.closeQuietly(response);
socket.close();
LOGGER.info("transfer file : " + file + " successfully! It consumes "
+ (System.currentTimeMillis() - before) + " ms.");
private String echo(Socket socket) {
return "Transfer file " + socket.getLocalAddress().getHostName() + ":"
+ socket.getLocalPort() + " OK!";
这个进行过测试,代码是可以运行的。这里的代码有其他的的依赖的jar包,就是apache下面的commons下面的一些常用包:
org.apache.commons.io.IOUtils
org.apache.commons.lang.StringUtils
org.apache.log4j.Logger
后记:这里只是简单的写了一个socket的文件传输。其实这里的代码的实际应用意义不是很大。
一般我们进行文件传输的时候,还需要进行一些必要的工作,比如:文件大小的校验,或者文件的MD5的校验,用来保证文件传输之前和传输之后的完整性,正确性。
这里给出一个提示:
client:可以在发送文件的client里面写2个socket,第一个socket用来告诉服务器“我要给你传输一个文件,这个文件的名字是:file-test.txt,它的MD5是:XXXXXXXXXX,文件的大小是xxxxxbytes”。当这个socket从服务器得到允许“yes”的消息,以及服务器创建的临时ServerSocket的host、port之后,开始用第二个socket进行文件传输。
server:在server中,当一个socket接到client发送的“我要给你传输一个文件,这个文件的名字是:file-test.txt,它的MD5是:XXXXXXXXXX,文件的大小是xxxxxbytes”的消息之后,判断是否需要client进行文件发送(例如根据文件的大小,判断当前的服务器有足够的磁盘空间存放客户端发送来的文件。如果文件大小够存放client传输过来的文件,那么进行下一步。如果不够存放client传输过来的文件,那么告知client,当前的服务器磁盘空间已满,不能进行文件传输。)。如果需要,则把该文件的名称,该文件的MD5记录到本地的内存中,然后建立一个临时的ServerSocket对象(指定任意端口),再通过上面的socket回复给client的第一个socket,告诉他可以(yes),并告知client的第一个socket这个临时的ServerSocket的对象的host,port。好允许client利用第二个socket进行文件传输,将文件流写给这里的ServerSocket。
当Server端判断出文件接收完毕,马上对该接收到的文件生成MD5校验码,将该校验码与之前client第一个socket传送来的MD5校验码进行校对。发现一致,继续等待下一个文件的传输任务的到来;如果不一致,可以告诉client,该文件需要进行重传。
这里需要注意的一个地方是:当server端启动多个线程进行文件接收的时候,最好不要用文件大小来判断磁盘空间是否可以存放client传输过来的文件。为什么?因为server接收文件是并行的。当其中一个线程接收到文件的磁盘检查的时候,该服务器的磁盘空间确实够存放文件,就会告诉client进行文件传输。这个时候很有可能,server的另一个线程也接到文件大小的检验的任务,开始检查磁盘空间是否够存放client传输的文件。发现空间是够用的,也告诉了当前的client可以进行文件传输。这个时候,会产生问题的:当server的磁盘空间就剩下1G的时候,一个client传输的文件是600M,另一个client传输的文件是700M,就会造成2个client的文件都无法完成传输而报错。因为它们占用服务器空间的大小,超过了服务器现在的空间大小。
那么该如何处理服务器磁盘空间大小检查的问题呢?没有更好的办法,服务器只能采用单线程的服务器文件传输。另一个方法,服务器程序内含一个文件大小检查的线程,定时(间隔10秒)检查服务器的空间是否达到预警阀值(这个阀值最好设置的大一点,比如1T的大小,可以存放半天的数据传输)。当到达预警阀值,可以发送预警信息(电子邮件、手机短信)给管理员,要求他进行磁盘空间的扩展。
另一个文件传输的方法:采用一个socket进行文件传输,而不是像上面那样采用2个socket,一个用来发送文件的具体信息,一个用来传输文件。如果需要采用一个socket,就需要自己写一个协议。其实这样的协议是存在的,如 http 协议。我们也可以自己写一个传输文件的协议,该协议分为2个部分。第一部分,header,用来存放文件的必要信息,比如:文件大小,文件名称,文件的MD5等等;第二部分,body,用来存放文件的流内容。这样,client可以在按照协议发送给服务器一个封装好的内容,server呢按照协议进行解析出header、body,然后存放文件。这样做就会复杂一点,要想简化,可以采用http协议来传输文件。http具有“协议、header、body”的完整结构,可以满足文件传输的需要。
上面给出的思路,大致能实现文件的安全传输,里面包含了文件传输,文件完整性/准确性校验,文件传输发生错误之后的重传机制。这个思路,和FTP的文件传输相似。可以进行参考。
kanpiaoxue
浏览: 689806 次
来自: 北京
lixz 写道有具体实例demo吗好多年前写的了。你还是去官网 ...
有具体实例demo吗
理解错了,原来还是计数,不是时间
TimeoutTerminationPolicy 是毫秒 默认 ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'}

我要回帖

更多关于 java socket传输文件 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信