java多线程网络传输文件非同步Word下载.docx
《java多线程网络传输文件非同步Word下载.docx》由会员分享,可在线阅读,更多相关《java多线程网络传输文件非同步Word下载.docx(16页珍藏版)》请在冰点文库上搜索。
javaFileServer.TransferServer端口文件夹路径
javaFileServer.TransferServer2008F:
\tempFolder
文件传输服务端---------------------------------------------------------
packageFileServer;
importjava.io.DataInputStream;
importjava.io.DataOutputStream;
importjava.io.File;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.OutputStream;
importjava.io.RandomAccessFile;
import.ServerSocket;
import.Socket;
import.SocketException;
/**
*DescriptionSocket文件传输服务端
*默认支持多线程传输,未支持断点续传,未支持内网UDF传输
*CreationDate07-08-20089:
00
*@author
*@version1.0
*/
publicclassTransferServer{
*@paramargs[0]端口默认2008(例:
2008)
*@paramargs[1]接收文件存放路径,默认:
和FileServer同一目录\ServerReceive
*
(例:
x:
\example\example\)
*/
publicstaticvoidmain(String[]args){
try{
intserPort=2008;
//服务器默认端口2008
StringtempFolder=System.getProperty("
user.dir"
)+"
\\ServerReceive"
;
//临时文件夹,用于存放接收文件
ServerSocketss=null;
//设定Socket
if(args.length<
1||null==args){
ss=newServerSocket(serPort);
}else{
//检测输入端口是否正确
if(args[0].replaceAll("
\\D"
"
"
)!
="
){
serPort=Integer.parseInt(args[0].replaceAll("
));
System.out.println("
输入的端口有错误,使用系统默认端口"
);
}
if(args[1].length()>
0){
tempFolder=args[1];
WelcometoTransferServer"
服务器启动,监听端口"
+ss.getLocalPort());
服务器临时文件路径:
"
+tempFolder);
while(true){
Sockets=ss.accept();
newThread(newServerThread(s,tempFolder)).start();
}catch(IOExceptione){
e.getMessage();
服务器端口被占用,或其他问题."
*Description服务器线程
*@author卢俊宇
*@paramtempFolder接收文件存放路径,默认:
TransferServer.class所在目录\ServerReceive
*
*@version1.1
classServerThreadimplementsRunnable{
Sockets;
//实例化socket类
privateStringtempFolder;
//临时文件夹名
publicServerThread(Sockets,StringtempFolder){
this.s=s;
this.tempFolder=tempFolder;
@SuppressWarnings("
deprecation"
)
publicvoidrun(){
InputStreamins=s.getInputStream();
OutputStreamouts=s.getOutputStream();
DataInputStreamdis=newDataInputStream(ins);
DataOutputStreamdos=newDataOutputStream(outs);
//取得线程ID
StringSerID="
SerID-"
+Thread.currentThread().getId();
StringinStr=dis.readUTF();
//接收到的文件包含头信息
if(inStr!
=null){
//对收到的socket包过滤出文件信息
if(inStr.contains("
ClientInfo"
)){
System.out.println(SerID+"
getFileInfo!
//文件名字
StringfName=newString(inStr.replaceAll(
(.+<
FileName>
)|(<
\\/FileName>
\\S+)"
.toString().getBytes("
utf-8"
),"
//文件总长度
StringfSize=newString(inStr.replaceAll(
FileLength>
)|<
\\/FileLength>
size:
+fSize);
longSize=Long.parseLong(fSize);
//区块起始长度
StringfPs=newString(
inStr
.replaceAll(
FilePointerStart>
/FilePointerStart>
).toString().getBytes(
PS:
+fPs);
//区块结束长度
StringfPe=newString(
FilePointerEnd>
/FilePointerEnd>
PE:
+fPe);
longPointS=Long.parseLong(fPs);
//分块头
longPointE=Long.parseLong(fPe);
//分块尾
SourceFileName:
+fName);
FiletempF=newFile(tempFolder,fName);
if(!
tempF.exists()){
//检测目标文件夹是否存在
if(newFile(tempFolder).isDirectory()){
TempFile.creat(tempF,Size);
//如果临时文件不存在就建立
booleancreat=newFile(tempFolder).mkdirs();
if(creat){
Error:
Systemcannotcreatfolder!
System.out.println(SerID+"
exits"
dis.close();
//关闭包类
dos.close();
//关闭输出流
s.close();
//关连接
Thread.currentThread().stop();
//返回服务器准备好了
StringSerReady=SerID+"
ServerReady=1"
dos.writeUTF(SerReady);
//返回服务器信息
dos.flush();
//取得客户端发送标志"
SendStart"
if(dis.readUTF().equals("
//随机读写文件(适应多线程方式)
RandomAccessFilefos=newRandomAccessFile(
tempF.getPath(),"
rw"
longcurPoint=PointS;
//文件指针起点
longendSet=PointE;
//文件指针终点
longnowSize=0;
//已读/写字节
byte[]buffer=newbyte[1024];
//建立缓冲区
while(curPoint<
endSet){
intlength=0;
if((endSet-curPoint+1)<
1024){
fos.seek(curPoint);
//寻找写入位置
byte[]bufferM=newbyte[(int)(endSet
-curPoint+1)];
//调整缓冲区大小
length=ins.read(bufferM);
//读取bufferM缓冲socket流
fos.write(bufferM);
//将取得的socket流写入文件
dos.writeUTF("
SerGotIt"
curPoint+=length;
//文件指针增加
nowSize+=length;
fos.close();
//向发送接收结束标志
ReciveEnd"
System.out.println(SerID
+"
isreceiveok."
break;
e.printStackTrace();
}else{
length=ins.read(buffer);
isabnormallyclosed."
if(length==buffer.length){
//将缓冲区字节写入文件
System.out
.println(SerID
receive"
+buffer.length
bytes."
fos.write(buffer);
curPoint+=buffer.length;
//指针+1024
nowSize+=buffer.length;
指针位置"
+curPoint);
线程size写入进度:
+nowSize);
//接收到客户端结束标志,跳出循环
SendEnd"
服务器接收完毕"
}catch(SocketExceptions){
//s.printStackTrace();
//客户端非正常退出处理
exited."
文件传输客户端
-----------------------------------------------------------
import.InetAddress;
import.UnknownHostException;
importjava.text.SimpleDateFormat;
importjava.util.Date;
*DescriptionSocket文件传输客户端(默认支持多线程传输,未支持断点续传,未支持内网UDF传输)
publicclassTransferClient{
*Description文件传输客户端
*
*@paramargs[0]
*
文件路径+文件名(例:
\example\example.class)
*@paramargs[1]
服务器IP地址(例:
192.168.1.1)
*@paramargs[2]
端口默认2008(例:
*@paramargs[3]
区块长度默认5(例:
5)
//默认连接端口2008;
intblockNum=5;
//文件区块数量(同时决定线程数)
StringserIP="
192.168.1.105"
//服务器IP
StringfilePath="
e:
\\1.rar"
//欲发送文件路径+文件名
采用默认配置连接"
if(args[0].length()>
filePath=args[0];
serIP=args[1];
if(args[2].length()>
serPort=Integer.parseInt(args[2]);
if(args[3].length()>
blockNum=Integer.parseInt(args[3].replaceAll("
文件路径:
+filePath);
连接IP:
+serIP);
连接端口:
+serPort);
线程数:
+blockNum);
//取得文件信息
Filesource=newFile(filePath);
source.exists()){
要传输的文件不存在!
System.exit(0);
longfSize=source.length(