Java基于Socket的文件传输实现方法
本文实例讲述了Java基于Socket的文件传输实现方法。分享给大家供大家参考,具体如下:
1.Java代码如下:
packagesterning;
importjava.io.BufferedInputStream;
importjava.io.DataInputStream;
importjava.io.DataOutputStream;
importjava.io.File;
importjava.io.FileInputStream;
importjava.net.ServerSocket;
importjava.net.Socket;
publicclassServerTest{
intport=8821;
voidstart(){
Sockets=null;
try{
ServerSocketss=newServerSocket(port);
while(true){
//选择进行传输的文件
StringfilePath="D:\\lib.rar";
Filefi=newFile(filePath);
System.out.println("文件长度:"+(int)fi.length());
//publicSocketaccept()throws
//IOException侦听并接受到此套接字的连接。此方法在进行连接之前一直阻塞。
s=ss.accept();
System.out.println("建立socket链接");
DataInputStreamdis=newDataInputStream(newBufferedInputStream(s.getInputStream()));
dis.readByte();
DataInputStreamfis=newDataInputStream(newBufferedInputStream(newFileInputStream(filePath)));
DataOutputStreamps=newDataOutputStream(s.getOutputStream());
//将文件名及长度传给客户端。这里要真正适用所有平台,例如中文名的处理,还需要加工,具体可以参见ThinkInJava4th里有现成的代码。
ps.writeUTF(fi.getName());
ps.flush();
ps.writeLong((long)fi.length());
ps.flush();
intbufferSize=8192;
byte[]buf=newbyte[bufferSize];
while(true){
intread=0;
if(fis!=null){
read=fis.read(buf);
}
if(read==-1){
break;
}
ps.write(buf,0,read);
}
ps.flush();
//注意关闭socket链接哦,不然客户端会等待server的数据过来,
//直到socket超时,导致数据不完整。
fis.close();
s.close();
System.out.println("文件传输完成");
}
}catch(Exceptione){
e.printStackTrace();
}
}
publicstaticvoidmain(Stringarg[]){
newServerTest().start();
}
}
2.socket的Util辅助类
packagesterning;
importjava.net.*;
importjava.io.*;
publicclassClientSocket{
privateStringip;
privateintport;
privateSocketsocket=null;
DataOutputStreamout=null;
DataInputStreamgetMessageStream=null;
publicClientSocket(Stringip,intport){
this.ip=ip;
this.port=port;
}
/***//**
*创建socket连接
*
*@throwsException
*exception
*/
publicvoidCreateConnection()throwsException{
try{
socket=newSocket(ip,port);
}catch(Exceptione){
e.printStackTrace();
if(socket!=null)
socket.close();
throwe;
}finally{
}
}
publicvoidsendMessage(StringsendMessage)throwsException{
try{
out=newDataOutputStream(socket.getOutputStream());
if(sendMessage.equals("Windows")){
out.writeByte(0x1);
out.flush();
return;
}
if(sendMessage.equals("Unix")){
out.writeByte(0x2);
out.flush();
return;
}
if(sendMessage.equals("Linux")){
out.writeByte(0x3);
out.flush();
}else{
out.writeUTF(sendMessage);
out.flush();
}
}catch(Exceptione){
e.printStackTrace();
if(out!=null)
out.close();
throwe;
}finally{
}
}
publicDataInputStreamgetMessageStream()throwsException{
try{
getMessageStream=newDataInputStream(newBufferedInputStream(socket.getInputStream()));
returngetMessageStream;
}catch(Exceptione){
e.printStackTrace();
if(getMessageStream!=null)
getMessageStream.close();
throwe;
}finally{
}
}
publicvoidshutDownConnection(){
try{
if(out!=null)
out.close();
if(getMessageStream!=null)
getMessageStream.close();
if(socket!=null)
socket.close();
}catch(Exceptione){
}
}
}
3.客户端
packagesterning;
importjava.io.BufferedOutputStream;
importjava.io.DataInputStream;
importjava.io.DataOutputStream;
importjava.io.FileOutputStream;
publicclassClientTest{
privateClientSocketcs=null;
privateStringip="localhost";//设置成服务器IP
privateintport=8821;
privateStringsendMessage="Windwos";
publicClientTest(){
try{
if(createConnection()){
sendMessage();
getMessage();
}
}catch(Exceptionex){
ex.printStackTrace();
}
}
privatebooleancreateConnection(){
cs=newClientSocket(ip,port);
try{
cs.CreateConnection();
System.out.print("连接服务器成功!"+"\n");
returntrue;
}catch(Exceptione){
System.out.print("连接服务器失败!"+"\n");
returnfalse;
}
}
privatevoidsendMessage(){
if(cs==null)
return;
try{
cs.sendMessage(sendMessage);
}catch(Exceptione){
System.out.print("发送消息失败!"+"\n");
}
}
privatevoidgetMessage(){
if(cs==null)
return;
DataInputStreaminputStream=null;
try{
inputStream=cs.getMessageStream();
}catch(Exceptione){
System.out.print("接收消息缓存错误\n");
return;
}
try{
//本地保存路径,文件名会自动从服务器端继承而来。
StringsavePath="E:\\";
intbufferSize=8192;
byte[]buf=newbyte[bufferSize];
intpassedlen=0;
longlen=0;
savePath+=inputStream.readUTF();
DataOutputStreamfileOut=newDataOutputStream(newBufferedOutputStream(newBufferedOutputStream(newFileOutputStream(savePath))));
len=inputStream.readLong();
System.out.println("文件的长度为:"+len+"\n");
System.out.println("开始接收文件!"+"\n");
while(true){
intread=0;
if(inputStream!=null){
read=inputStream.read(buf);
}
passedlen+=read;
if(read==-1){
break;
}
//下面进度条本为图形界面的prograssBar做的,这里如果是打文件,可能会重复打印出一些相同的百分比
System.out.println("文件接收了"+(passedlen*100/len)+"%\n");
fileOut.write(buf,0,read);
}
System.out.println("接收完成,文件存为"+savePath+"\n");
fileOut.close();
}catch(Exceptione){
System.out.println("接收消息错误"+"\n");
return;
}
}
publicstaticvoidmain(Stringarg[]){
newClientTest();
}
}
希望本文所述对大家Java程序设计有所帮助。