关于用JAVA的SOCKET传输文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于用JAVA的SOCKET传输文件相关的知识,希望对你有一定的参考价值。

RT,并且最好可以在客户端显示下载速度,在服务端显示传输速度,直接给源码

点对点传输文件
/*
import java.io.*;
import java.net.*;
import java.util.*;
*/
private HttpURLConnection connection;//存储连接
private int downsize = -1;//下载文件大小,初始值为-1
private int downed = 0;//文加已下载大小,初始值为0
private RandomAccessFile savefile;//记录下载信息存储文件
private URL fileurl;//记录要下载文件的地址
private DataInputStream fileStream;//记录下载的数据流
try
/*开始创建下载的存储文件,并初始化值*/
File tempfileobject = new File("h:\\webwork-2.1.7.zip");
if(!tempfileobject.exists())
/*文件不存在则建立*/
tempfileobject.createNewFile();

savefile = new RandomAccessFile(tempfileobject,"rw");

/*建立连接*/
fileurl = new URL("https://webwork.dev.java.net/files/documents/693/9723/webwork-2.1.7.zip");
connection = (HttpURLConnection)fileurl.openConnection();
connection.setRequestProperty("Range","byte="+this.downed+"-");

this.downsize = connection.getContentLength();
//System.out.println(connection.getContentLength());

new Thread(this).start();

catch(Exception e)
System.out.println(e.toString());
System.out.println("构建器错误");
System.exit(0);

public void run()
/*开始下载文件,以下测试非断点续传,下载的文件存在问题*/
try
System.out.println("begin!");
Date begintime = new Date();
begintime.setTime(new Date().getTime());
byte[] filebyte;
int onecelen;
//System.out.println(this.connection.getInputStream().getClass().getName());
this.fileStream = new DataInputStream(
new BufferedInputStream(
this.connection.getInputStream()));
System.out.println("size = " + this.downsize);
while(this.downsize != this.downed)
if(this.downsize - this.downed > 262144)//设置为最大256KB的缓存
filebyte = new byte[262144];
onecelen = 262144;

else
filebyte = new byte[this.downsize - this.downed];
onecelen = this.downsize - this.downed;

onecelen = this.fileStream.read(filebyte,0,onecelen);
this.savefile.write(filebyte,0,onecelen);
this.downed += onecelen;
System.out.println(this.downed);

this.savefile.close();
System.out.println("end!");
System.out.println(begintime.getTime());
System.out.println(new Date().getTime());
System.out.println(begintime.getTime() - new Date().getTime());

catch(Exception e)
System.out.println(e.toString());
System.out.println("run()方法有问题!");



/***
//FileClient.java
import java.io.*;
import java.net.*;
public class FileClient
public static void main(String[] args) throws Exception

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

File file = new File("d:\\fmd.doc");

file.createNewFile();

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

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

Socket server = new Socket(InetAddress.getLocalHost(), 3318);
//创建网络接受流接受服务器文件数据
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();



//FileServer.java
import java.io.*;
import java.util.*;
import java.net.*;
public class FileServer
public static void main(String[] args) throws Exception

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

File file = new File("d:\\系统特点.doc");

FileInputStream fos = new FileInputStream(file);

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

ServerSocket ss = new ServerSocket(8801);

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();


*/
参考技术A 五分太少了吧?

java socket多文件传输问题

发送端有多个文件发送,需要一个一个的发送,接收端一个一个的接收,我现在只能传一个接一个,不知道多个的话怎么写,第一次做socket,求指教
我刚发现,我已经是一个一个的接收了,我发送端有五个文件,接收端五个都获取了,可都写入到一个文件里了,而不是五个,这个怎么办

用多线程,每个线程创建一个socket连接,每个socket连接负责传输一个文件,服务端的serversocket每次accept一个socket连接,也建立一个新线程,该线程负责对应socket的文件传输

每个文件写入完毕的时候关闭输出流,建新文件后重新建立输出流用于写入
参考技术A 参考思路:
1.先传文件名跟文件大小到 server。
2.开始传文件。
3.告诉server传完了。
4.客户端开始传下一个,重复123。
参考简单代码:
long fileLength;
int readLength;
long totalLength;
for (...)


// 读取文件名
// 读取文件长度保存到fileLength中
// 将totalLength置为0
while (1)

// 读取数据流,将实际读取的字节数保存在readLength中
totalLength += readLength;

if (totalLength >= fileLength) // 一个文件读取完成,break
// 这样就差不多了,不过这会把下一个文件的信息读到当前文件中来。
// 思路是fileLength - totalLength小于等于你设置的缓冲区长度时读取长度就是fileLength - totalLength


参考技术B 为什么看不到问题内容

以上是关于关于用JAVA的SOCKET传输文件的主要内容,如果未能解决你的问题,请参考以下文章

java中怎么用socket 一次传多个文件啊?

java的socket传输文件,发送与接收文件的内容不一致

java服务器端用传输给客户端文件流(fileinputstream),客户端应该如何接收?(socket )

用FTP传输和socket传输 具体区别在哪里?

Java学习笔记——Socket实现文件传输

Java基于TCP协议的Socket传输程序,乱码问题