Java 网络文件传输

网络

读者范围:

本文是一篇简短入门文章.本文假设读者对Java的IO系统和Java的网络系统有所了解.

正文:

关于文件传输的问题,实际也是一种IO读写的基本问题.对于网络而言也是一种IO读写问题.因此所谓网络的文件传输实际是两种IO问题的综合讨论.这里我们首先分析一个图示.然后围绕这个图示来讨论:

图1:

分析图1我们基本可以知道从服务器文件系统中通过流把文件中的数据写入到服务器的进程中,然后把进程中的数据通过网络IO系统传递到客户机,这个阶段,网络中的数据以字节流的形式保存.当该字节流被客户进程接受后,客户进程通过客户本地文件流写入客户本地的文件系统中.

根据以上分析,我们基本可以确定我所需要处理的问题了.首先我们需要可以对本地文件系统IO操作的操作接口,然后是一个可以对网络IO系统进行操作的操作接口,已经一个可以把数据包装成字节流的操作接口,他们分别可以提供客户和服务器两个进程进行读写的操作.如下图所示:

图2:

根据以上分析,我们可以把问题归结到对以下编程接口的需求上:

1. 字节包装器和字节解包器,

2. 网络传输器和网络接收器

3. 本地文件读/写器

而这些Java本身的API就已经提供.他们都被包装到java.io和java.net这两个包里,这里我提供一个基于TCP/IP的实现版本,使用基于连接的方式来完成工作.我们首先介绍几个相关的JDK中的类来完成以上任务,

1. DataOutputStream和DataInputStream实现类提供了上面的字节包装和解包器的实现

2. ServerSocket和Socekt提供了基于连接的网络传输和接受接口

3. File,FileInputStream和FileOutputStream提供了基本的本地文件输入输出接口.

服务器端实现代码:

import java.io.*;

import java.net.*;

public class FileServer{

public static void main(String[] args)throws Exception{

//创建文件流用来读取文件中的数据

File file=new File("lishengjie.jpg");

FileInputStream fos=new FileInputStream(file);

//创建网络服务器接受客户请求

ServerSocket ss=new ServerSocket(3108);

Socket client=ss.accept();

//创建网络输出流并提供数据包装器

OutputStream netOut=client.getOutputStream();

OutputStream doc=new DataOutputStream(new BufferedOutputStream(netOut));

//创建文件读取缓冲区

byte[] buf=new byte[2048];

int num=fos.read(buf);

while(num!=(-1)){//是否读完文件

doc.write(buf,0,num);//把文件数据写出网络缓冲区

doc.flush();//刷新缓冲区把数据写往客户端

num=fos.read(buf);//继续从文件中读取数据

}

fos.close();

doc.close();

}

}

客户方实现代码:

import java.io.*;

import java.net.*;

public class FileClient{

public static void main(String[] args)throws Exception{

//使用本地文件系统接受网络数据并存为新文件

File file=new File("newFile.jpg");

file.createNewFile();

RandomAccessFile raf=new RandomAccessFile(file,"rw");

// 通过Socket连接文件服务器

Socket server=new Socket(InetAddress.getLocalHost(),3108);

//创建网络接受流接受服务器文件数据

InputStream netIn=server.getInputStream();

InputStream in=new DataInputStream(new BufferedInputStream(netIn));

//创建缓冲区缓冲网络数据

byte[] buf=new byte[2048];

int num=in.read(buf);

while(num!=(-1)){//是否读完所有数据

raf.write(buf,0,num);//将数据写往文件

raf.skipBytes(num);//顺序写文件字节

num=in.read(buf);//继续从网络中读取文件

}

in.close();

raf.close();

}

}

归结以上代码:

服务器
客户端

1. 服务器从本地文件系统读取文件

2. 服务器创建网络服务连接

3. 服务器提供数据包装器

4. 服务器将本地文件写入数据包装器

5. 服务器通过包装器写入到网络
1. 客户端建立新文件准备存储来自网络的数据

2. 客户端连接服务器

3. 客户端通过网络接受服务器数据并进行数据解包

4. 客户端将数据写入缓冲区

5. 客户端从缓冲区把数据写入客户本地文件

总结:

事实上java的开发环境为我们提供大多数的编程接口,为我们简化了开发工作量.我们通过java的IO接口所提供的文件,数据包装器等接口非常方便的解决了我们上面的开发工作量.同时在java的net接口所提供的套接字也使得基于连接的数据接受和发送成为非常容易的工作.

时间: 2025-01-02 10:32:36

Java 网络文件传输的相关文章

跨网络文件传输

问题描述 我需要实现在不同局域网的机器进行文件传输,有一台公网服务器,我试了网上说的nat打洞,但打不通,请问该如何实现,有会的请指点下 解决方案 解决方案二:我觉得你还是用服务器转发吧打不通也正常,并不是任何网络都能打通的QQ的在线传文件功能在很多网络下也都连不上,只能发离线文件解决方案三:应用服务器转发如何实现解决方案四:引用2楼walkinthecloud的回复: 应用服务器转发如何实现 那不就是上传和下载吗先上传到服务器上,服务器保存为本地文件,然后通知另一个客户端:文件已经完整了,可以

matlab调用java实现文件传输

问题描述 各位高手们:我想在matlab中调用java程序,就是在matlab中写java代码,利用java的socket实现文件传输功能,请问下可以嘛 解决方案 解决方案二:我知道可以在matlab中利用java的socket实现数据传输,不知道文件传输可以实现不.解决方案三:数据传输和文件传输的差别是你需要先打开文件并读取文件中的数据内容,这个动作Java能完成.解决方案四:我也是这样做的,但是最后还是不行....您有没有做过这方面的啊解决方案五:引用4楼xiaolu114的回复: 我也是这

java socket 文件传输 有点问题

问题描述 我写的SOCKET文件传输带MD5校验,客户端总是多写16位的MD5服务端代码:(在WRITE完以后,还需要WRITE16位的MD5值)while(len<=8096&&fis.available()>0){byte[]src=newbyte[8096];len=fis.read(src);dos.write(src,0,len);dos.flush();}dos.write(fth.getMd5Value());dos.flush();客户端代码:while(rFi

java socket 文件传输-java socket 传文件文件接收后不能打开

问题描述 java socket 传文件文件接收后不能打开 java socket传文件,客户端将文件读取到byte[]中,然后用Map对相关内容进行包装之后输出到服务器端,但服务器端读取文件内容的循环除第一次读取的Map是客户端写入过来的内容外,从第二次循环开始Map的内容都跟第一次一样的,请问怎么回事? 服务器端代码: `public void run() { ObjectInputStream is = null; OutputStream os = null; byte cache[]

浅析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

socket-java SOCKET 文件传输 有点问题咨询下!

问题描述 java SOCKET 文件传输 有点问题咨询下! 我写的SOCKET 文件传输带MD5校验,客户端总是多写16位的MD5 服务端代码:(在WRITE完以后,还需要WRITE16位的MD5值) while (len <= 8096 && fis.available() > 0) { byte[] src = new byte[8096]; len = fis.read(src); dos.write(src, 0, len); dos.flush(); } dos.w

Java网络编程之传输控制协议

传输控制协议是一种基于流的网络通讯方法,它与其它的任何协议都有很大 的不同.本文讨论TCP流以及在Java中怎样操作它. 一.概述 TCP提供的网络通讯接口与用户数据报协议(UDP)截然不同.TCP的特性使网 络编程很具魅力,而且它删除了UDP的很多干扰部分(例如数据包的排序和丢失 ),简化了网络通讯.UDP关心的是数据包的传输,而TCP关注的是建立网络连接 ,并在网络连接中发送和接收字节流. 数据包可以通过网络用多种方法发送,并且它们到达的时间可能不同.这有 利于性能的提高和程序的健壮性,因为

Java基于Socket文件传输示例

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