大家好,关于j*a从服务器文件很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于关于用J*A的SOCKET传输文件的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!

一、什么是种子

种子是一个形象的比喻。BT的原理从某种意义上说就像春天种下一粒种子,到了秋天就会收获万粒稻菽一样的滚雪球般的越来越大。于是人们就把发出文件的人叫做种子。而种子文件就是记载文件的存放位置、大小、服务器的、发布者的等数据的一个索引文件。这个种子文件并不是你最终要的东西(如电影,软件等等),但是要你需要的东西,就必须先种子文件。种子文件的后缀名是:*.torrent。以三国志11威力加强版的BT种子为例子,完毕后只有压缩其中一卷。该卷会从下来的所有卷压解出有效信息。组成setup. BT首先在上传者端把一个文件分成了Z个部分,甲在服务器随机了第N个部分,乙在服务器随机了第M个部分,这样甲的BT就会根据情况到乙的电脑上去拿乙已经好的M部分,乙的BT就会根据情况去到甲的电脑上去拿甲已经好的N部分,这样就不但减轻了服务器端得负荷,也加快了用户方(甲乙)的速度,效率也提高了,更同样减少了地域之间的限制。比如说丙要连到服务器去的话可能才几K,但是要是到甲和乙的电脑上去拿就快得多了。所以说用的人越多,的人越多,大家也就越快,BT的优越*就在这里。而且,在你的同时,你也在上传(别人从你的电脑上拿那个文件的某个部分),所以说在享受别人提供的的同时,你也在贡献。 BT把提供完整文件档案的人称为种子(SEED),正在的人称为客户(Client),某一个文件现在有多少种子多少客户是可以看到的,只要有一个种子,就可以放心地,一定能抓完。当然,种子越多、客户越多的文件抓起来的速度会越快。使用种子首先要有BT软件,然后就可以了!BT是一种类似与电驴的P2P共享软件,全名叫“BitTorrent”,中文全称:“比特流”,“*”器是它的名字和率高的缘故,因此常人给它的一个化名。它是一种新的类似于P2P共享软件,因为每个的人同时又可以上传,的人越多,文件越大,速度就越快,而且只要普通的电脑接上网络就可以安装BT服务器。 [编辑本段]常用BT软件 BitComet BitComet是基于BitTorrent协议的p2p免费软件;高效的网络内核,多任务同时依然保持很少的CPU内存占用;支持对一个Torrent中的文件有选择的;磁盘缓存技术,有效减小高速随机读写对硬盘的损伤;只需一个监听端口即可满足所有需要;自动保存状态,续传无需再次扫描文件,作种子也无需扫描文件;支持多Tracker协议;对内网用户同样适用;绿色软件,不需安装,仅运行时关联.torrent文件;多语言界面。 BitTorrent Deadman Walking BitTorrent Deadman Walking是TLF论坛的专门定制优化过的版本,推荐使用。 BitTorrent Plus BitTorrent Shadow's Experimental的加强版,拥有全中文的界面。相对于原版更加易用,翻译通俗易懂,功能强大,是当今BT客户端*能最为强大的客户端程序之一。比特精灵Bit Spirit一个功能强大,使用方便的BitTorrent客户端。它不仅全面兼容BitTorrent协议,更提供了很多个*化的功能,界面酷似Flashget。贪婪ABC一个增强、应该说是*的Bittorrent客户端,单窗口多任务!消耗少到吓人。相信很多人已经找了好久,但是一直没有满意的吧?贪婪BT将会给你一个满意的解决方案。 BitTorrent最早期最原始的BT客户端工具,一个多点且源码公开的P2P软件,使用非常方便,就像一个浏览器插件。 Shareaza一款在国外评价极高并且相当流行的P2P软件,集合了eDonkey和BT等几种流行P2P网络类型,许多P2P的站点已将其指定为BT的官方工具。 PTC PTC比BitTorrent多了个软件界面,可以双击运行,然后打开到硬盘上的torrent文件;能同时多任务,节省资源;能完全自定义上传速度,防止网络带宽占用过大等等。 Azureus一个基于J*A的多torrent程序,可以手动设置某个torrent的优先权,加入了irc聊天室,增加了一些基本的irc命令,可以看见在线人数和ID,支持多tracker url,对于多tracker发布的torrent可自动切换,并可以手动更改tracker url。 BitAnarch一个号称可以和BitTorrent Plus版媲美的BT软件,具有日志功能,可以显示种子和者的详细信息,具有搜索新闻组Torrent文件的功能,更多的选项设置功能,软件界面支持简体中文、繁体中文、英文语言选择。 BitBuddy BitBuddy超小快速,单窗口多任务,支持BitTorrent及其扩展协议的BT客户端,操作类似flashget和ants,方便实用。支持多任务,设置优先级,速度限制等多项实用功能。 BTVampire(BT吸血鬼) BT Vampire又叫称BT吸血鬼,是一款增强型的完全免费的Bittorrent客户端,主要是为了改进BT效率,试验新算法而编写的。 BtJoy乐翻天一个多点对多点的P2P软件,使用非常方便,其特点简单的说就是:的人越多,速度越快;他发挥了eDoneky和BitTorrent的优势,去除了edoneky需要排队的不足,又简化了BitTorrent共享发布比较复杂的流程。 BitTornado一个多点且源码公开的P2P软件,使用非常方便,就像一个浏览器插件。与以往、FTP、pub等人越多,速度越慢的方式迥然不同,BT的特点简单的说就是:的人越多,速度越快。时下BT已经成为网上交流资源最新、最酷的方式。是由著名的BT客户端Shadow'sExperimental更名而来。超级BT一款非常优秀的BT软件,速度是同类软件的3倍以上!采用了先进的技术,更进一步的优化了对等连接!使者之间没有任何障碍了!并且有非常好的皮肤功能!这也是此软件的一个亮点!推荐大家!绝对超值!而且完全免费! TurboBT采用最新的C++/PYTHON界面框架技术编写的BT(BitTorrent)客户端工具。界面代码全部重写,你可以高速的各类的资源且非常容易使用。 MyBT一个改良的BT客户端,是用于在BT站点或上传文件的实用工具。综合了最新的流行BT客户端开发,界面友好,中文环境,支持多任务,断点续传,超级种子,自动发布种子等功能,运行稳定,速度快。综艺BT王一款非常实用的功能齐全的BT客户端软件,可以同时多个BT。它运行稳定,占内存非常小,速度快!而且还有BT种子制作功能。 BTogether BTogether为新型P2P软件,支持最新 BitTorrent(BT)协议。把 BTogether拷贝到某目录,运行即可。本软件为纯中文绿色免费软件,不修改注册表,无需其他运行库。

二、关于用J*A的SOCKET传输文件

点对点传输文件

/*

import j*a.io.*;

import j*a..*;

import j*a.util.*;

*/

private HttpURLConnection connection;//存储连接

private int downsize=-1;//文件大小,初始值为-1

private int downed= 0;//文加已大小,初始值为0

private RandomAessFile s*efile;//记录信息存储文件

private URL fileurl;//记录要文件的

private DataInputStream fileStream;//记录的数据流

try{

/*开始创建的存储文件,并初始化值*/

File tempfileobject= new File("h:\\webwork-2.1.7.zip");

if(!tempfileobject.exists()){

/*文件不存在则建立*/

tempfileobject.createNewFile();

}

s*efile= new RandomAessFile(tempfileobject,"rw");

/*建立连接*/

fileurl= new URL("");

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.s*efile.write(filebyte,0,onecelen);

this.downed+= onecelen;

System.out.println(this.downed);

}

this.s*efile.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.j*a

import j*a.io.*;

import j*a..*;

public class FileClient{

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

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

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

file.createNewFile();

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

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

Socket server= new Socket(IAddress.getLocalHost(), 3318);

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

InputStream In= server.getInputStream();

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

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

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.j*a

import j*a.io.*;

import j*a.util.*;

import j*a..*;

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

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

OutputStream Out= client.getOutputStream();

OutputStream doc= new DataOutputStream(

new BufferedOutputStream(Out));

//创建文件读取缓冲区

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

}

}

*/

三、j*a 怎么从ftp获取文件路径

拿去用吧。

package.weixin.util;

importj*a.io.File;

importj*a.io.FileOutputStream;

importj*a.io.IOException;

importj*a.io.InputStream;

importj*a.io.OutputStream;

importj*a.io.PrintWriter;

importj*a.io.RandomAessFile;

import.apache.mons..PrintCommandListener;

import.apache.mons..ftp.FTP;

import.apache.mons..ftp.FTPClient;

import.apache.mons..ftp.FTPFile;

import.apache.mons..ftp.FTPReply;

import.weixin.constant.DownloadStatus;

import.weixin.constant.UploadStatus;

/**

*支持断点续传的FTP实用类

*@version0.1实现基本断点上传

*@version0.2实现上传进度汇报

*@version0.3实现中文目录创建及中文文件创建,添加对于中文的支持

*/

publilassContinueFTP{

publicFTPClientftpClient=newFTPClient();

publicContinueFTP(){

//设置将过程中使用到的命令输出到控制台

this.ftpClient.addProtocolCommandListener(newPrintCommandListener(newPrintWriter(System.out)));

}

/**

*连接到FTP服务器

*@paramhostname主机名

*@paramport端口

*@paramusername用户名

*@parampassword密码

*@return是否连接成功

*@throwsIOException

*/

publicbooleanconnect(Stringhostname,intport,Stringusername,Stringpassword)throwsIOException{

ftpClient.connect(hostname,port);

ftpClient.setControlEncoding("GBK");

if(FTPReply.isPositiveCompletion(ftpClient.getReplyCode())){

if(ftpClient.login(username,password)){

returntrue;

}

}

disconnect();

returnfalse;

}

/**

*从FTP服务器上文件,支持断点续传,上传百分比汇报

*@paramremote远程文件路径

*@paramlocal本地文件路径

*@return上传的状态

*@throwsIOException

*/

publicDownloadStatusdownload(Stringremote,Stringlocal)throwsIOException{

//设置被动模式

ftpClient.enterLocalPassiveMode();

//设置以二进制方式传输

ftpClient.setFileType(FTP.BINARY_FILE_TYPE);

DownloadStatusresult;

//检查远程文件是否存在

FTPFile[]files=ftpClient.listFiles(newString(remote.getBytes("GBK"),"iso-8859-1"));

if(files.length!=1){

System.out.println("远程文件不存在");

returnDownloadStatus.Remote_File_Noexist;

}

longlRemoteSize=files[0].getSize();

Filef=newFile(local);

//本地存在文件,进行断点

if(f.exists()){

longlocalSize=f.length();

//判断本地文件大小是否大于远程文件大小

if(localSize>=lRemoteSize){

System.out.println("本地文件大于远程文件,中止");

returnDownloadStatus.Local_Bigger_Remote;

}

//进行断点续传,并记录状态

FileOutputStreamout=newFileOutputStream(f,true);

ftpClient.setRestartOffset(localSize);

InputStreamin=ftpClient.retrieveFileStream(newString(remote.getBytes("GBK"),"iso-8859-1"));

byte[]bytes=newbyte[1024];

longstep=lRemoteSize/100;

longprocess=localSize/step;

intc;

while((c=in.read(bytes))!=-1){

out.write(bytes,0,c);

localSize+=c;

longnowProcess=localSize/step;

if(nowProcess>process){

process=nowProcess;

if(process%10==0)

System.out.println("进度:"+process);

//TODO更新文件进度,值存放在process变量中

}

}

in.close();

out.close();

booleanisDo=ftpClient.pletePendingCommand();

if(isDo){

result=DownloadStatus.Download_From_Break_Suess;

}else{

result=DownloadStatus.Download_From_Break_Failed;

}

}else{

OutputStreamout=newFileOutputStream(f);

InputStreamin=ftpClient.retrieveFileStream(newString(remote.getBytes("GBK"),"iso-8859-1"));

byte[]bytes=newbyte[1024];

longstep=lRemoteSize/100;

longprocess=0;

longlocalSize=0L;

intc;

while((c=in.read(bytes))!=-1){

out.write(bytes,0,c);

localSize+=c;

longnowProcess=localSize/step;

if(nowProcess>process){

process=nowProcess;

if(process%10==0)

System.out.println("进度:"+process);

//TODO更新文件进度,值存放在process变量中

}

}

in.close();

out.close();

booleanupNewStatus=ftpClient.pletePendingCommand();

if(upNewStatus){

result=DownloadStatus.Download_New_Suess;

}else{

result=DownloadStatus.Download_New_Failed;

}

}

returnresult;

}

/**

*上传文件到FTP服务器,支持断点续传

*@paramlocal本地文件名称,绝对路径

*@paramremote远程文件路径,使用/home/directory1/subdirectory/file.ext按照Linux上的路径指定方式,支持多级目录嵌套,支持递归创建不存在的目录结构

*@return上传结果

*@throwsIOException

*/

publicUploadStatusupload(Stringlocal,Stringremote)throwsIOException{

//设置PassiveMode传输

ftpClient.enterLocalPassiveMode();

//设置以二进制流的方式传输

ftpClient.setFileType(FTP.BINARY_FILE_TYPE);

ftpClient.setControlEncoding("GBK");

UploadStatusresult;

//对远程目录的处理

StringremoteFileName=remote;

if(remote.contains("/")){

remoteFileName=remote.substring(remote.lastIndexOf("/")+1);

//创建服务器远程目录结构,创建失败返回

if(CreateDirecroty(remote,ftpClient)==UploadStatus.Create_Directory_Fail){

returnUploadStatus.Create_Directory_Fail;

}

}

//检查远程是否存在文件

FTPFile[]files=ftpClient.listFiles(newString(remoteFileName.getBytes("GBK"),"iso-8859-1"));

if(files.length==1){

longremoteSize=files[0].getSize();

Filef=newFile(local);

longlocalSize=f.length();

if(remoteSize==localSize){

returnUploadStatus.File_Exits;

}elseif(remoteSize>localSize){

returnUploadStatus.Remote_Bigger_Local;

}

//尝试移动文件内读取指针,实现断点续传

result=uploadFile(remoteFileName,f,ftpClient,remoteSize);

//如果断点续传没有成功,则删除服务器上文件,重新上传

if(result==UploadStatus.Upload_From_Break_Failed){

if(!ftpClient.deleteFile(remoteFileName)){

returnUploadStatus.Delete_Remote_Faild;

}

result=uploadFile(remoteFileName,f,ftpClient,0);

}

}else{

result=uploadFile(remoteFileName,newFile(local),ftpClient,0);

}

returnresult;

}

/**

*断开与远程服务器的连接

*@throwsIOException

*/

publicvoiddisconnect()throwsIOException{

if(ftpClient.isConnected()){

ftpClient.disconnect();

}

}

/**

*递归创建远程服务器目录

*@paramremote远程服务器文件绝对路径

*@paramftpClientFTPClient对象

*@return目录创建是否成功

*@throwsIOException

*/

publicUploadStatusCreateDirecroty(Stringremote,FTPClientftpClient)throwsIOException{

UploadStatusstatus=UploadStatus.Create_Directory_Suess;

Stringdirectory=remote.substring(0,remote.lastIndexOf("/")+1);

if(!directory.equalsIgnoreCase("/")&&!ftpClient.changeWorkingDirectory(newString(directory.getBytes("GBK"),"iso-8859-1"))){

//如果远程目录不存在,则递归创建远程服务器目录

intstart=0;

intend=0;

if(directory.startsWith("/")){

start=1;

}else{

start=0;

}

end=directory.indexOf("/",start);

while(true){

StringsubDirectory=newString(remote.substring(start,end).getBytes("GBK"),"iso-8859-1");

if(!ftpClient.changeWorkingDirectory(subDirectory)){

if(ftpClient.makeDirectory(subDirectory)){

ftpClient.changeWorkingDirectory(subDirectory);

}else{

System.out.println("创建目录失败");

returnUploadStatus.Create_Directory_Fail;

}

}

start=end+1;

end=directory.indexOf("/",start);

//检查所有目录是否创建完毕

if(end<=start){

break;

}

}

}

returnstatus;

}

/**

*上传文件到服务器,新上传和断点续传

*@paramremoteFile远程文件名,在上传之前已经将服务器工作目录做了改变

*@paramlocalFile本地文件File句柄,绝对路径

*@paramprocessStep需要显示的处理进度步进值

*@paramftpClientFTPClient引用

*@return

*@throwsIOException

*/

publicUploadStatusuploadFile(StringremoteFile,FilelocalFile,FTPClientftpClient,longremoteSize)throwsIOException{

UploadStatusstatus;

//显示进度的上传

longstep=localFile.length()/100;

longprocess=0;

longlocalreadbytes=0L;

RandomAessFileraf=newRandomAessFile(localFile,"r");

OutputStreamout=ftpClient.endFileStream(newString(remoteFile.getBytes("GBK"),"iso-8859-1"));

//断点续传

if(remoteSize>0){

ftpClient.setRestartOffset(remoteSize);

process=remoteSize/step;

raf.seek(remoteSize);

localreadbytes=remoteSize;

}

byte[]bytes=newbyte[1024];

intc;

while((c=raf.read(bytes))!=-1){

out.write(bytes,0,c);

j*a从服务器下载文件 关于用J*A的SOCKET传输文件

localreadbytes+=c;

if(localreadbytes/step!=process){

process=localreadbytes/step;

System.out.println("上传进度:"+process);

//TODO汇报上传状态

}

}

out.flush();

raf.close();

out.close();

booleanresult=ftpClient.pletePendingCommand();

if(remoteSize>0){

status=result?UploadStatus.Upload_From_Break_Suess:UploadStatus.Upload_From_Break_Failed;

}else{

status=result?UploadStatus.Upload_New_File_Suess:UploadStatus.Upload_New_File_Failed;

}

returnstatus;

}

publicstaticvoidmain(String[]args){

ContinueFTPmyFtp=newContinueFTP();

try{

System.err.println(myFtp.connect("10.10.6.236",21,"5","jieyan"));

// myFtp.ftpClient.makeDirectory(newString("歌曲".getBytes("GBK"),"iso-8859-1"));

// myFtp.ftpClient.changeWorkingDirectory(newString("歌曲".getBytes("GBK"),"iso-8859-1"));

// myFtp.ftpClient.makeDirectory(newString("爱你等于爱自己".getBytes("GBK"),"iso-8859-1"));

// System.out.println(myFtp.upload("E:\\yw.flv","/yw.flv",5));

// System.out.println(myFtp.upload("E:\\爱你等于爱自己.mp4","/爱你等于爱自己.mp4"));

//System.out.println(myFtp.download("/爱你等于爱自己.mp4","E:\\爱你等于爱自己.mp4"));

myFtp.disconnect();

}catch(IOExceptione){

System.out.println("连接FTP出错:"+e.getMessage());

}

}

}