java tcp 传送任意文件

来源:互联网 发布:uniprot数据库教程 编辑:程序博客网 时间:2024/04/28 23:15


 


 



 
 
 

 

 

Java代码  收藏代码
  1. /* 
  2. TCP通讯 
  3. 需求:传送任意文件 
  4.  
  5. tcp传输要定义2个端点,客户端和服务端 
  6. 步骤 
  7. 1.定义服务, 服务器ip和接收端口 
  8. 2.读取客户端已有的图片文件 
  9. 3.使用socket输出流将数据发给服务端 
  10. 4.读取服务端的反馈信息 
  11. 5.关闭资源 
  12.  
  13. 注意: 
  14. 1.在while循环中的read方法最后读到文件结束标记-1后循环退出了 
  15.   而没有将该标记写入socket流中,那么服务端接收到的数据是不完整的,而且停不下来 
  16.   用shutdownOutput方法告诉服务端文件到了末尾结束发送了 
  17.  
  18. [示例]:传送任意文件 (客户端) 
  19. */  
  20.   
  21. import java.net.*;  
  22. import java.io.*;  
  23. class Demo  
  24. {  
  25.   public static void main(String[] args) throws Exception  
  26.   {  
  27.     new FileClient("c:\\FoxitReader_CHS.rar"); //启动客户端,准备发送指定文件  
  28.   }  
  29. }  
  30.   
  31. class FileClient  //客户端  
  32. {  
  33.   FileClient(String fileStr) throws Exception  
  34.   {  
  35.     s.op("客户端启动....");  
  36.     File file = new File(fileStr);  //关联一个文件c:\\FoxitReader_CHS.rar  
  37.     if(file.isFile())  //是一个标准文件吗?  
  38.     {  
  39.       client(file);    //启动连接  
  40.     }  
  41.     else  
  42.     {  
  43.       s.op("要发送的文件 "+fileStr+" 不是一个标准文件,请正确指定");  
  44.     }  
  45.   }  
  46.     
  47.   public void client(File file)throws Exception  
  48.   {  
  49.     Socket sock= new Socket("192.168.1.3",10007); //指定服务端地址和端口  
  50.   
  51.     FileInputStream fis = new FileInputStream(file); //读取本地文件  
  52.     OutputStream sockOut = sock.getOutputStream();   //定义socket输出流  
  53.       
  54.     //先发送文件名.让服务端知道  
  55.     String fileName = file.getName();  
  56.     s.op("待发送文件:"+fileName);  
  57.     sockOut.write(fileName.getBytes());  
  58.       
  59.     String serverInfo= servInfoBack(sock); //反馈的信息:服务端是否获取文件名并创建文件成功  
  60.     if(serverInfo.equals("FileSendNow"))   //服务端说已经准备接收文件,发吧  
  61.     {  
  62.       byte[] bufFile= new byte[1024];  
  63.       int len=0;  
  64.       while(true)  
  65.       {  
  66.         len=fis.read(bufFile);  
  67.         if(len!=-1)  
  68.         {  
  69.           sockOut.write(bufFile,0,len); //将从硬盘上读取的字节数据写入socket输出流  
  70.         }  
  71.         else  
  72.         {  
  73.           break;  
  74.         }  
  75.       }        
  76.     }  
  77.     else  
  78.     {  
  79.       s.op("服务端返回信息:"+serverInfo);  
  80.     }  
  81.     sock.shutdownOutput();   //必须的,要告诉服务端该文件的数据已写完  
  82.     s.op("服务端最后一个返回信息:"+servInfoBack(sock));//显示服务端最后返回的信息  
  83.       
  84.     fis.close();  
  85.     sock.close();  
  86.   }  
  87.     
  88.   public String servInfoBack(Socket sock) throws Exception  //读取服务端的反馈信息  
  89.   {  
  90.     InputStream sockIn = sock.getInputStream(); //定义socket输入流  
  91.     byte[] bufIn =new byte[1024];  
  92.     int lenIn=sockIn.read(bufIn);            //将服务端返回的信息写入bufIn字节缓冲区  
  93.     String info=new String(bufIn,0,lenIn);  
  94.     return info;  
  95.   }  
  96. }  
  97.   
  98. class s    
  99. {  
  100.   public static void op(Object obj) //打印  
  101.   {  
  102.     System.out.println(obj);  
  103.   }  
  104. }  

 

 

Java代码  收藏代码
  1. /* 
  2. 服务端原先有很大的局限性 
  3. 原先我们没有考虑客户端的文件名,和客户端判断是否有重名文件,我们是另外指定了文件名和路径 
  4. 当客户端A连接服务端,被服务端获取到后,服务端执行具体流程, 
  5. 这时如果B客户端尝试连接服务端,但只能等待 
  6. 因为服务端还没有处理完A客户端的请求,不能回while起始位置执行accept方法,所以 
  7. 暂时获取不到B客户端对象,那么为了可以让多个客户端同时被服务端并发接收, 
  8. 那么服务端最好就是将每个客户端封装到一个个单独的线程中,这样,就可以同时处理多个客户端请求 
  9. 如何定义线程呢? 
  10. 只要明确每一个客户端要再服务端执行的代码即可,将该代码放到run方法中 
  11. 如果服务端存在同名文件就返回信息并断开该次连接 
  12.  
  13.  
  14. 如果要让客户端选择是否要覆盖文件,可以再加个反馈操作应该就可以了 
  15.  
  16. [示例]:传送任意文件 (服务端并发执行) 
  17. */  
  18. import java.net.*;  
  19. import java.io.*;  
  20. class Demo  
  21. {  
  22.   public static void main(String[] args) throws Exception  
  23.   {  
  24.     new FileServer();  //启动文件存储服务端  
  25.   }  
  26. }  
  27.   
  28. class FileServer  //服务端  
  29. {  
  30.   FileServer() throws Exception  
  31.   {   
  32.     s.op("服务端启动......");  
  33.     server();  
  34.   }  
  35.   
  36.   public void server() throws Exception  
  37.   {  
  38.     ServerSocket serversock = new ServerSocket(10007);  //监听端口  
  39.     while(true)  
  40.     {     
  41.       Socket sock = serversock.accept();            //循环等待客户端连接  
  42.       new Thread(new FileServThread(sock)).start(); //当成功连接客户端后开启新线程接收文件  
  43.     }  
  44.   }  
  45. }  
  46.   
  47. class FileServThread implements Runnable   //服务端线程  
  48. {  
  49.   private Socket sock;  
  50.   FileServThread(Socket sock)  
  51.   {  
  52.     this.sock = sock;  
  53.   }  
  54.     
  55.   public void run()  
  56.   {  
  57.     String ip = sock.getInetAddress().getHostAddress();   //获取客户端ip  
  58.     try  
  59.     {  
  60.       s.op("开启新线程接收来自客户端IP: "+ip+" 的文件");  
  61.       InputStream sockIn= sock.getInputStream();//定义socket输入流,接收客户端的信息  
  62.       File file =getClientFileName(sockIn);     //创建同名文件  
  63.       if(file==null)  
  64.       {  
  65.         writeOutInfo(sock,"存在同名文件或获取文件失败,服务端断开连接!");  
  66.         sock.close();              return;  
  67.       }  
  68.        
  69.       FileOutputStream fos= new FileOutputStream(file); //用来写入硬盘  
  70.       byte[] bufFile = new byte[1024*1024];   //接收数据的缓存  
  71.       int len=0;  
  72.       while(true)  
  73.       {  
  74.         len=sockIn.read(bufFile); //接收数据  
  75.         if(len!=-1)  
  76.         {  
  77.           fos.write(bufFile,0,len); //写入硬盘文件  
  78.         }  
  79.         else  
  80.         {  
  81.           break;  
  82.         }  
  83.       }  
  84.       writeOutInfo(sock,"上传成功!");   //文件接收成功后给客户端反馈一个信息  
  85.       s.op("文件接收成功!"+System.getProperty("line.separator"));  //服务端打印一下  
  86.       fos.close();  
  87.       sock.close();       
  88.     }  
  89.     catch(Exception ex)  
  90.     {  
  91.       throw new RuntimeException(ip+"异常!!!");  
  92.     }  
  93.   }  
  94.     
  95.   public void writeOutInfo(Socket sock,String infoStr)throws Exception//将信息反馈给服务端  
  96.   {  
  97.     OutputStream sockOut = sock.getOutputStream();  
  98.     sockOut.write(infoStr.getBytes());  
  99.   }  
  100.     
  101.   public File getClientFileName(InputStream sockIn) throws Exception //获取文件名并创建  
  102.   {    
  103.     //获取客户端请求发送的文件名,并判断在D盘创建同名文件的情况  
  104.     byte[] bufName=new byte[1024];  
  105.     int lenInfo =0;  
  106.     lenInfo = sockIn.read(bufName);  //获取文件名  
  107.     String fileName = new String(bufName,0,lenInfo);  
  108.       
  109.     File dir = new File("d:\\");    //存到D盘根目录  
  110.     File[] files=dir.listFiles();   //遍历d盘目录  
  111.     for(File f:files)  
  112.     {  
  113.       if(!f.isDirectory())  //如果遍历到的该文件不是一个目录的话  
  114.       {   
  115.         if(f.getName().equals(fileName))  //判断是否是同名文件  
  116.         {  
  117.           s.op(f.getName()+"文件已存在,断开该ip连接."+System.getProperty("line.separator"));  
  118.           writeOutInfo(sock,"服务端已存在同名文件!"); //反馈给客户端的信息  
  119.           return null;         
  120.         }  
  121.       }  
  122.     }  
  123.     s.op("将客户端发来的文件( "+fileName+" )存到"+dir.getAbsolutePath());       
  124.     File file= new File(dir+fileName);    
  125.     if(file.createNewFile())  
  126.     {   
  127.       s.op("成功创建文件("+fileName+" )准备写入数据");  
  128.       writeOutInfo(sock,"FileSendNow");    //告诉客户端,开始传送数据吧    
  129.       return file;  
  130.     }  
  131.     else  
  132.     {  
  133.       return null//如果由于硬盘满了等原因创建文件失败的话  
  134.     }  
  135.   }  
  136. }  
  137.   
  138. class s  
  139. {  
  140.   public static void op(Object obj) //打印  
  141.   {  
  142.     System.out.println(obj);  
  143.   }  
  144. }  

转载自:http://xouou.iteye.com/blog/1387875
0 0
原创粉丝点击