大家好,关于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);
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());
}
}
}