网络编程_多线程的文件上传小示例

本文涉及的产品
系统运维管理,不限时长
简介:

http://blog.csdn.net/zsw101259/article/details/7768908

1、多线程文件的上传,数据流向 

1)、客户端Socket:

      ①out File对象 

       ②out 文件内容

        ③in 服务端反馈信息 


2)、服务端的处理 

       ①每接收一个Socket,创建一个线程去处理这个Socket 

        ②in File对象:判断文件的类型、选择不同的传输方式、创建File对象关联文件

        ③in 文件内容:填充File对象关联文件内容 

       ④填充完File文件,给客户端反馈

  

   2、代码:                 

  1)客户端:字符流       

 

[java]  view plain copy
  1. import java.net.*;  
  2. import java.io.*;  
  3. /** 
  4.  * @author Administrator @zsw 2012-7-18 上午09:21:04 
  5.  *  
  6.  * 需求:从客户端上传文本文件到服务端 
  7.  *  
  8.  * 客户端上传: 
  9.  * ①定义Socket、文件输入流、Socket输出流、Socket输入流 
  10.  * ②从文件输入读取文件, 
  11.  * 添加:首先上传文件File对象和文件类型int filetype 
  12.  * ③将读到的数据写入Socket输出流中 
  13.  * ④关闭资源 
  14.  */  
  15. public class TextUploadClient2 {  
  16.   
  17.       
  18.     public static void main(String[] args) throws Exception{  
  19.         File file=new File("D:\\1.txt");  
  20.           
  21.           
  22.         //①:定义资源  
  23.         Socket s=new Socket("127.0.0.1",10007);  
  24.         BufferedReader bufr=new BufferedReader(new FileReader(file));  
  25.         //字符流转换成字节流  
  26.         BufferedWriter bufout=new BufferedWriter(  
  27.                 new OutputStreamWriter(s.getOutputStream()));  
  28. //      PrintWriter out=new PrintWriter(s.getOutputStream(),true);  
  29.         BufferedReader bufin=new BufferedReader(  
  30.                 new InputStreamReader(s.getInputStream()));  
  31.           
  32.         //将文件对象传到服务器  
  33.         ObjectOutputStream oos=new ObjectOutputStream(s.getOutputStream());  
  34.         oos.writeObject(file);  
  35.           
  36.       
  37.         //②上传数据  
  38.         String line=null;  
  39.         while((line=bufr.readLine())!=null){  
  40.                
  41. //          System.out.println(line);  
  42.             bufout.write(line);  
  43.             bufout.newLine();  
  44.             bufout.flush();  
  45.         }  
  46.           
  47.         //③告诉服务器,客户端已经传完了。并接收服务端的反馈信息  
  48.          s.shutdownOutput();//关闭客户端的输出流,相当于在流中写-1  
  49.            
  50.          String line2=null;  
  51.          while((line2=bufin.readLine())!=null){  
  52.              if("success".equals(line2)){     
  53.                  System.out.println("上传文件成功!");  
  54.                  break;  
  55.              }  
  56.          }  
  57.           
  58.         //④关闭资源  
  59.          bufr.close();  
  60.          s.close();  
  61.   
  62.   
  63.     }  
  64.   
  65. }  

                                     

2)客户端:字符流


[java]  view plain copy
  1. import java.io.*;  
  2. import java.net.*;   
  3. /** 
  4.  * @author Administrator @zsw 2012-7-18 下午06:45:41 
  5.  *客户端: 
  6.  *①服务端点:Socket、流 
  7.  *②读取客户端的图片数据 
  8.  *③通过Socket输出流将数据发给服务端 
  9.  *④读取服务端反馈信息 
  10.  *⑤关闭资源 
  11.  */  
  12. public class UploadPicClient2 {  
  13.     public static void main(String[] args) throws Exception{  
  14.         File file=new File("D:\\1.mp3");  
  15.         //①服务端点:  
  16.         Socket s=new Socket("127.0.0.1",10007);  
  17.         FileInputStream fis=new FileInputStream(file);  
  18.         OutputStream out=s.getOutputStream();  
  19.         InputStream in=s.getInputStream();  
  20.           
  21.         //将文件对象传到服务器  
  22.         ObjectOutputStream oos=new ObjectOutputStream(s.getOutputStream());  
  23.         oos.writeObject(file);  
  24.           
  25.         //②读取图片  
  26.         byte[]buf=new byte[1024*2];  
  27.         int len=0;  
  28.         while((len=fis.read(buf))!=-1){  
  29.             //③发送数据到服务端  
  30.             out.write(buf, 0, len);   
  31.         }  
  32.         //给服务端发送结束标记  
  33.         s.shutdownOutput();  
  34.           
  35.         //④读取服务端反馈信息  
  36.         len=0;  
  37.         while((len=in.read(buf))!=-1){  
  38.             String str=new String(buf,0,len);  
  39.             System.out.println("服务端反馈:"+str);  
  40.         }  
  41.           
  42.         //⑤关闭资源  
  43.         fis.close();  
  44.         s.close();  
  45.     }  
  46.   
  47. }  

3)服务端:使用多线程

[java]  view plain copy
  1. import java.io.*;  
  2. import java.net.*;  
  3.   
  4. /** 
  5.  * 总结:多线程文件的上传,数据流向 
  6.  * 1、客户端Socket:①out File对象 ②out 文件内容 ③in 服务端反馈信息 
  7.  *            
  8.  * 3、服务端的处理 
  9.  *  ①每接收一个Socket,创建一个线程去处理这个Socket 
  10.  *  ②in File对象:判断文件的类型、选择不同的传输方式、创建File对象关联文件 
  11.  *  ③in 文件内容:填充File对象关联文件内容 
  12.  *  ④填充完File文件,给客户端反馈 
  13.  *   
  14.  *   
  15.  * @author Administrator @zsw 2012-7-18 下午07:03:47 
  16.  * 此类在UploadPicServer.java上面做改进,使用了多线程. 
  17.  *  
  18.  *1单线程服务端:有局限,当A客户连接上来后,<br> 
  19.  *被服务器接收后, 服务端执行具体流程中,这时,B客户端连接,只有等待。 
  20.  *因为服务端还没有处理完A客户端的请求, 
  21.  *还没有循环回来执行下次 accept方法,所以暂时获取不到B客户端对象 
  22.  *  
  23.  *2解决思路:那么为了可以让多个客户端同时并发的访问服务器,  
  24.  *服务端最好就是将每一个客户端封装到一个单独的线程中。 
  25.  *  
  26.  *  
  27.  *  
  28.  */  
  29. /* 
  30.  * 如何定义线程呢: 明确每一个客户端要在服务端执行的代码,将该代码放入run方法中 
  31.  */  
  32. //3、线程类  
  33. class UploadThread implements Runnable {  
  34.     // 客户端、文件、文件类型(简单点0表示文本、1表示字节流)  
  35.     private Socket s;  
  36.     UploadThread(Socket s) {  
  37.         this.s = s;   
  38.     }  
  39.     public void run() {  
  40.         try {  
  41.             Thread.sleep(5000);  
  42.             new FileUpload().upload(s);  
  43.               
  44.         } catch (InterruptedException e) {  
  45.             // TODO Auto-generated catch block  
  46.             e.printStackTrace();  
  47.         }  
  48.           
  49.   
  50.     }  
  51.   
  52. }  
  53.   
  54. // 1、主程序  
  55. public class UploadPicByThread {  
  56.     public static void main(String[] args) throws Exception {  
  57.         // ①定义服务端点:  
  58.         ServerSocket ss = new ServerSocket(10007);  
  59.         //②为每一个客户端开启一个  
  60.         int cNum=0;  
  61.         while (true) {  
  62.             Socket s = ss.accept();  
  63.             cNum++;  
  64.             new Thread(new UploadThread(s)).start();  
  65.             System.out.println("上传成功文件数:"+cNum);  
  66.         }  
  67.   
  68.     }  
  69. }  


4、服务端:业务类,根据不同的上传,选择不同的方式

 

[java]  view plain copy
  1. import java.io.*;  
  2. import java.net.*;  
  3.   
  4. // 2、业务类  
  5. public class FileUpload {  
  6.   
  7.     public void upload(Socket s) {  
  8.         try {  
  9.             ObjectInputStream ois=new ObjectInputStream(s.getInputStream());  
  10.             File file=(File)ois.readObject();  
  11.             //当发现文件存在时,修改文件名:如 1.mp3->(count++)1.mp3  
  12.             String name=file.getName();//原始文件名  
  13.             File dir=new File("D:\\tx\\");  
  14.             file=new File(dir,name);  
  15.             int count=0;  
  16.             while(file.exists()){  
  17.                 count++;  
  18.                 file=new File(dir,"("+count+")"+name);  
  19.             }  
  20.             /*当时文本文件时,调用文本上传方法 
  21.              * 否则调用字符流上传方法 
  22.              */  
  23.               
  24.             if(name.endsWith(".txt")){  
  25.                 textUpload(s,file);  
  26.             }else{  
  27.                 picUpload(s,file);  
  28.             }  
  29.               
  30.         }  catch (Exception e) {  
  31.             System.out.println(e);  
  32.             System.out.println("上传失败");  
  33.         }  
  34.           
  35.     }  
  36.   
  37.     // ①图片等多媒体文件上传(字节流)  
  38.     public void picUpload(Socket s, File file)  throws Exception{  
  39.   
  40.             //打印客户端  
  41.             String ip=s.getInetAddress().getHostAddress();  
  42.             System.out.println(ip+"....connect 准备上传"+file.getName());  
  43.               
  44.             FileOutputStream fos = new FileOutputStream(file);  
  45.             InputStream in = s.getInputStream();  
  46.             OutputStream out = s.getOutputStream();  
  47.   
  48.   
  49.             // ②读取数据  
  50.             int len = 0;  
  51.             byte[] buf = new byte[1024 * 2];  
  52.             while ((len = in.read(buf)) != -1) {  
  53.                 fos.write(buf, 0, len);  
  54.             }  
  55.             // ③给客户端反馈  
  56.             System.out.println(file.getName()+"服务端接收完成");  
  57.             out.write("success".getBytes());  
  58.             // 给客户端发送结束标记  
  59.             s.shutdownOutput();  
  60.   
  61.             // ④关闭资源  
  62.             fos.close();  
  63.             s.close();  
  64.           
  65.   
  66.     }  
  67.   
  68.     // ②文本上传(字符流)  
  69.     public void textUpload(Socket s, File file) throws Exception {  
  70.           
  71.             //打印客户端连接的  
  72.             String ip=s.getInetAddress().getHostAddress();  
  73.             System.out.println(ip+"....connect 准备上传"+file.getName());  
  74.               
  75.             BufferedWriter bufw = new BufferedWriter(new FileWriter(file));  
  76.             // Socket 输出输入  
  77.             BufferedReader bufin = new BufferedReader(new InputStreamReader(  
  78.                     s.getInputStream()));  
  79.             BufferedWriter bufout = new BufferedWriter(new OutputStreamWriter(  
  80.                     s.getOutputStream()));  
  81.   
  82.             // ②:读数据、写到文件、判断结束、反馈成功  
  83.             String line = null;  
  84.             /* 
  85.              * 服务端收不到line=null的情况,必须在流中添加结束标记 s.shutdownOutput(); 
  86.              * 关闭客户端的输出流,相当于在流中写-1,line就可以=null 
  87.              */  
  88.             // 获取标记符(即时间值)  
  89.             while ((line = bufin.readLine()) != null) {  
  90.                 bufw.write(line);  
  91.                 bufw.newLine();  
  92.                 bufw.flush();  
  93.   
  94.             }  
  95.             System.out.println(file.getName()+"数据接收成功!");  
  96.             bufout.write("success");  
  97.             bufout.newLine();  
  98.             bufout.flush();  
  99.             s.shutdownOutput();  
  100.   
  101.             // 关闭资源  
  102.             bufw.close();  
  103.             s.close();  
  104.           
  105.     }  
  106. }  


相关文章
|
5天前
|
存储 网络协议 安全
Java网络编程,多线程,IO流综合小项目一一ChatBoxes
**项目介绍**:本项目实现了一个基于TCP协议的C/S架构控制台聊天室,支持局域网内多客户端同时聊天。用户需注册并登录,用户名唯一,密码格式为字母开头加纯数字。登录后可实时聊天,服务端负责验证用户信息并转发消息。 **项目亮点**: - **C/S架构**:客户端与服务端通过TCP连接通信。 - **多线程**:采用多线程处理多个客户端的并发请求,确保实时交互。 - **IO流**:使用BufferedReader和BufferedWriter进行数据传输,确保高效稳定的通信。 - **线程安全**:通过同步代码块和锁机制保证共享数据的安全性。
55 23
|
4月前
|
网络安全 Python
Python网络编程小示例:生成CIDR表示的IP地址范围
本文介绍了如何使用Python生成CIDR表示的IP地址范围,通过解析CIDR字符串,将其转换为二进制形式,应用子网掩码,最终生成该CIDR块内所有可用的IP地址列表。示例代码利用了Python的`ipaddress`模块,展示了从指定CIDR表达式中提取所有IP地址的过程。
104 6
|
5月前
|
Java 应用服务中间件
面对海量网络请求,Tomcat线程池如何进行扩展?
【10月更文挑战第4天】本文详细探讨了Tomcat线程池相较于标准Java实用工具包(JUC)线程池的关键改进。首先,Tomcat线程池在启动时即预先创建全部核心线程,以应对启动初期的高并发请求。其次,通过重写阻塞队列的入队逻辑,Tomcat能够在任务数超过当前线程数但未达最大线程数时,及时创建非核心线程,而非等到队列满才行动。此外,Tomcat还引入了在拒绝策略触发后重新尝试入队的机制,以提高吞吐量。这些优化使得Tomcat线程池更适应IO密集型任务,有效提升了性能。
面对海量网络请求,Tomcat线程池如何进行扩展?
|
5月前
|
Java Linux
【网络】高并发场景处理:线程池和IO多路复用
【网络】高并发场景处理:线程池和IO多路复用
136 2
|
6月前
|
网络协议 C语言
C语言 网络编程(十四)并发的TCP服务端-以线程完成功能
这段代码实现了一个基于TCP协议的多线程服务器和客户端程序,服务器端通过为每个客户端创建独立的线程来处理并发请求,解决了粘包问题并支持不定长数据传输。服务器监听在IP地址`172.17.140.183`的`8080`端口上,接收客户端发来的数据,并将接收到的消息添加“-回传”后返回给客户端。客户端则可以循环输入并发送数据,同时接收服务器回传的信息。当输入“exit”时,客户端会结束与服务器的通信并关闭连接。
|
6月前
|
C语言
C语言 网络编程(九)并发的UDP服务端 以线程完成功能
这是一个基于UDP协议的客户端和服务端程序,其中服务端采用多线程并发处理客户端请求。客户端通过UDP向服务端发送登录请求,并根据登录结果与服务端的新子线程进行后续交互。服务端在主线程中接收客户端请求并创建新线程处理登录验证及后续通信,子线程创建新的套接字并与客户端进行数据交换。该程序展示了如何利用线程和UDP实现简单的并发服务器架构。
|
7月前
|
API Windows
揭秘网络通信的魔法:Win32多线程技术如何让服务器化身超级英雄,同时与成千上万客户端对话!
【8月更文挑战第16天】在网络编程中,客户/服务器模型让客户端向服务器发送请求并接收响应。Win32 API支持在Windows上构建此类应用。首先要初始化网络环境并通过`socket`函数创建套接字。服务器需绑定地址和端口,使用`bind`和`listen`函数准备接收连接。对每个客户端调用`accept`函数并在新线程中处理。客户端则通过`connect`建立连接,双方可通过`send`和`recv`交换数据。多线程提升服务器处理能力,确保高效响应。
75 6
|
7月前
|
安全 开发者 数据安全/隐私保护
Xamarin 的安全性考虑与最佳实践:从数据加密到网络防护,全面解析构建安全移动应用的六大核心技术要点与实战代码示例
【8月更文挑战第31天】Xamarin 的安全性考虑与最佳实践对于构建安全可靠的跨平台移动应用至关重要。本文探讨了 Xamarin 开发中的关键安全因素,如数据加密、网络通信安全、权限管理等,并提供了 AES 加密算法的代码示例。
95 0
|
7月前
|
安全 网络安全 数据安全/隐私保护
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享安卓与iOS开发中的线程管理比较
【8月更文挑战第30天】本文将探讨网络安全与信息安全的重要性,并分享关于网络安全漏洞、加密技术和安全意识的知识。我们将了解常见的网络攻击类型和防御策略,以及如何通过加密技术和提高安全意识来保护个人和组织的信息安全。
|
8月前
|
SQL 监控 安全
探索网络安全:浅析文件上传漏洞
网络安全是一场没有硝烟的战争,它要求我们时刻保持警惕,不断学习与适应。无论是采用强密码、数据加密,还是定期更新软件、安装安全软件,每一项措施都是我们构建网络安全防线的基石。同时,我们也应意识到,技术手段之外,提升安全意识、培养安全习惯同样至关重要。

热门文章

最新文章