2007-08-10

利用Socket进行文件传输

关键字: Java Socket 文件传输
最近项目中用到文件传输,用户上传文件,必须在两台服务器上保留备份,用Socket解决的;下面是我剥离出来的Socket原程序,可以直接使用。

java 代码
 
  1. /* 
  2.  * JCPClient.java 
  3.  * 
  4.  * Created on 2007年8月9日, 下午5:08 
  5.  * 
  6.  * To change this template, choose Tools | Template Manager 
  7.  * and open the template in the editor. 
  8.  */  
  9.   
  10. package clienttoserver;  
  11.   
  12. /** 
  13.  * 
  14.  * @author julycn 
  15.  */  
  16. import java.io.BufferedWriter;  
  17. import java.io.File;  
  18. import java.io.FileInputStream;  
  19. import java.io.OutputStream;  
  20. import java.io.OutputStreamWriter;  
  21. import java.io.PrintWriter;  
  22. import java.net.InetAddress;  
  23. import java.net.Socket;  
  24.   
  25.   
  26. public class JCPClient{  
  27.   
  28.     /** *//** 
  29.      * @param args 
  30.      */  
  31.     public static void main(String[] args)throws Exception{  
  32.         // TODO Auto-generated method stub  
  33.         int num = args.length;  
  34.         if(num<=3){  
  35.             System.out.println("please input server ip port filefrom fileto!");  
  36.             System.exit(0);  
  37.         }  
  38.         System.out.println("host:"+args[0]);  
  39.         System.out.println("port:"+args[1]);  
  40.         System.out.println("filefrom:"+args[2]);  
  41.         System.out.println("fileto:"+args[3]);  
  42.         InetAddress addr = InetAddress.getByName(args[0]);  
  43.         Socket socket = new Socket(addr, Integer.parseInt(args[1]));  
  44.         OutputStream out = socket.getOutputStream();  
  45.         byte[] cmd = new byte[128];  
  46.         byte[] tcmd = "cp".getBytes();  
  47.         for(int i=0;i
  48.             cmd[i] = tcmd[i];  
  49.         }  
  50.         cmd[tcmd.length] = -0;  
  51.         out.write(cmd,0,cmd.length);  
  52.         //文件名  
  53.         byte[] file = new byte[256];  
  54.         byte[] tfile = args[3].getBytes();  
  55.         for(int i=0;i
  56.             file[i] = tfile[i];  
  57.         }  
  58.         file[tfile.length] = -0;  
  59.         out.write(file,0,file.length);  
  60.           
  61.         //大小  
  62.         File filein = new File(args[2]);  
  63.         byte[] size = new byte[64];  
  64.         byte[] tsize = (""+filein.length()).getBytes();  
  65.           
  66.         for(int i=0;i
  67.             size[i] = tsize[i];  
  68.         }  
  69.           
  70.         size[tsize.length] = -0;  
  71.         out.write(size,0,size.length);  
  72.           
  73.         FileInputStream fis = null;  
  74.         byte[] buf = new byte[1024*10];  
  75.         //char[] bufC = new char[1024*10];  
  76.         fis = new FileInputStream(filein);  
  77.         int readsize = 0;  
  78.         //OutputStream ops = socket.getOutputStream();  
  79.         while((readsize = fis.read(buf, 0, buf.length))>0){  
  80.             out.write(buf,0,readsize);  
  81.             out.flush();  
  82.         }  
  83.         socket.close();  
  84.     }  
  85.   
  86. }  

java 代码
 
  1. /* 
  2.  * JCPServer.java 
  3.  * 
  4.  * Created on 2007年8月9日, 下午5:25 
  5.  * 
  6.  * To change this template, choose Tools | Template Manager 
  7.  * and open the template in the editor. 
  8.  */  
  9.   
  10. package clienttoserver;  
  11.   
  12. import java.net.ServerSocket;  
  13. import java.net.Socket;  
  14.   
  15. /** 
  16.  * 
  17.  * @author julycn 
  18.  */  
  19. public class JCPServer {  
  20.       
  21.     /** *//** 
  22.      * @param args 
  23.      */  
  24.     public static void main(String[] args) throws Exception {  
  25.         // TODO Auto-generated method stub  
  26.         int num = args.length;  
  27.         if(num<=0){  
  28.             System.out.println("please input server port!");  
  29.             System.exit(0);  
  30.         }  
  31.         int port = Integer.parseInt(args[0]);  
  32.         System.out.println("you input port:"+port);  
  33.         //绑定接受数据端口  
  34.         ServerSocket s = new ServerSocket(port);  
  35.         while(true){  
  36.             Socket socket = s.accept();  
  37.             new CPThread(socket).start();  
  38.         }  
  39.     }  
  40.       
  41. }  

java 代码
 
  1. /* 
  2.  * CPThread.java 
  3.  * 
  4.  * Created on 2007年8月9日, 下午5:04 
  5.  * 
  6.  * To change this template, choose Tools | Template Manager 
  7.  * and open the template in the editor. 
  8.  */  
  9.   
  10. package clienttoserver;  
  11.   
  12. import java.io.BufferedWriter;  
  13. import java.io.File;  
  14. import java.io.FileOutputStream;  
  15. import java.io.InputStream;  
  16. import java.io.OutputStreamWriter;  
  17. import java.io.PrintWriter;  
  18. import java.net.ServerSocket;  
  19. import java.net.Socket;  
  20.   
  21. /** 
  22.  * 
  23.  * @author julycn 
  24.  */  
  25. class CPThread extends Thread{  
  26.     Socket socket = null;  
  27.     public CPThread(Socket socket){  
  28.         this.socket = socket;  
  29.     }  
  30.     public void run(){  
  31.         try{  
  32.             InputStream in =socket.getInputStream();  
  33.             PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);  
  34.               
  35.             while(true)  
  36.             {  
  37.                 //第一个参数为命令  
  38.                 byte cmd[] = new byte[128];  
  39.                 int b = 0;  
  40.                 while(b
  41.                     b += in.read(cmd, b, cmd.length-b);  
  42.                 }  
  43.                 int ends = 0;  
  44.                 for(int i=0;i
  45.                     if(cmd[i]==-0){  
  46.                         ends = i;  
  47.                         break;  
  48.                     }  
  49.                 }  
  50.                 String cmds = new String(cmd,0,ends);  
  51.                 if("exit".equals(cmds)){  
  52.                     System.exit(0);  
  53.                 }  
  54.                 else if("cp".equals(cmds)){  
  55.                     byte[] filename = new byte[256];  
  56.                     b = 0;  
  57.                     while(b
  58.                         b += in.read(filename, b, filename.length-b);  
  59.                     }  
  60.                     ends = 0;  
  61.                     for(int i=0;i
  62.                         if(filename[i]==-0){  
  63.                             ends = i;  
  64.                             break;  
  65.                         }  
  66.                     }  
  67.                     String filenames = new String(filename,0,ends);  
  68.                     File fileout = new File(filenames);  
  69.                     if(fileout.isFile()){  
  70.                         throw new Exception("file exists"+fileout.getAbsolutePath());  
  71.                     }  
  72.                     FileOutputStream fos = new FileOutputStream(fileout);  
  73.                       
  74.                     byte[] filesize = new byte[64];  
  75.                     b = 0;  
  76.                     while(b
  77.                         b += in.read(filesize, b, filesize.length-b);  
  78.                     }  
  79.                       
  80.                     ends = 0;  
  81.                     for(int i=0;i
  82.                         if(filesize[i]==-0){  
  83.                             ends = i;  
  84.                             break;  
  85.                         }  
  86.                     }  
  87.                     String filesizes = new String(filesize,0,ends);  
  88.                       
  89.                     System.out.println("filesize:"+filesizes);  
  90.                     int ta = Integer.parseInt(filesizes);  
  91.                     byte[] buf = new byte[1024*10];  
  92.                     //InputStream ins = socket.getInputStream();  
  93.                     while(true){  
  94.                         if(ta==0){  
  95.                             break;  
  96.                         }  
  97.                         int len = ta;  
  98.                         if(len>buf.length){  
  99.                             len = buf.length;  
  100.                         }  
  101.                         int rlen = in.read(buf, 0, len);  
  102.                           
  103.                         //int rlen = ins.read(buf, 0, len);  
  104.                         ta -= rlen;  
  105.                         if(rlen>0){  
  106.                             fos.write(buf,0,rlen);  
  107.                             fos.flush();  
  108.                         }  
  109.                         else{  
  110.                             break;  
  111.                         }  
  112.                     }  
  113.                     out.println("cp finish!");  
  114.                     fos.close();  
  115.                     break;  
  116.                 }  
  117.                 else{  
  118.                     System.out.println("err command!");  
  119.                     out.println("err command!");  
  120.                     break;  
  121.                 }  
  122.             }  
  123.             socket.close();  
  124.         }catch(Exception e){  
  125.             e.printStackTrace();  
  126.               
  127.         }  
  128.     }  
  129. }  
评论
julycn
搜索本博客
我的相册
E09a394b-4b16-328b-8e1d-9ef916ee23c2-thumb
seam.jpg
共 13 张
存档
最新评论