Java网络编程多线程改进上传文件

简介: Java网络编程多线程改进上传文件   服务器的代码用线程进行封装(多线程),这样可以模拟一个同时接收多人上传文件的服务器。   (用循环也可以但是效率低,是单线程的程序) /* * 通过while循环可以改进一个服务器接收多个客户端。

Java网络编程多线程改进上传文件
  服务器的代码用线程进行封装(多线程),这样可以模拟一个同时接收多人上传文件的服务器。
  (用循环也可以但是效率低,是单线程的程序)

/*
* 通过while循环可以改进一个服务器接收多个客户端。
*    但是这个是有问题的。
*
* 如果是以下这种情况:假设我还有张三,李四,王五这三个人分别执行客户端
*               文件大小      网速
*      张三:好好学习.avi(100M)       256k
*      李四:天天向上.mp3(3M)        1M
*      王五:ILoveJava.txt(1k)        100M
*
* 因为服务器端是阻塞式接收的。只有等某一个人上传文件完后才继续执行程序。效率低。
*
* 如何解决呢?
*    给每一个用户分别开启一个线程。
*
*/

示例代码如下:

 1 package cn.itcast_15;
 2 
 3 import java.io.BufferedReader;
 4 import java.io.BufferedWriter;
 5 import java.io.FileReader;
 6 import java.io.IOException;
 7 import java.io.InputStreamReader;
 8 import java.io.OutputStreamWriter;
 9 import java.net.Socket;
10 
11 public class UploadClient {
12     public static void main(String[] args) throws IOException {
13         // 创建客户端Socket对象
14         Socket s = new Socket("192.168.40.9", 11111);
15 
16         // 封装文本文件
17         BufferedReader br = new BufferedReader(new FileReader("src//cn//itcast_15//a.txt"));
18         
19         // 封装通道内的流对象
20         BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
21 
22         String line = null;
23         while ((line = br.readLine()) != null) { // 阻塞
24             bw.write(line);
25             bw.newLine();
26             bw.flush();
27         }
28 
29         // Socket提供了一个终止,它会通知服务器你别等了,我没有数据过来了
30         s.shutdownOutput();
31 
32         // 接收反馈
33         BufferedReader brClient = new BufferedReader(new InputStreamReader(
34                 s.getInputStream()));
35         String client = brClient.readLine(); // 阻塞
36         System.out.println(client);
37 
38         // 释放资源
39         br.close();
40         s.close();
41     }
42 }
客户端代码
 1 package cn.itcast_15;
 2 
 3 import java.io.IOException;
 4 import java.net.ServerSocket;
 5 import java.net.Socket;
 6 
 7 public class UploadServer {
 8     public static void main(String[] args) throws IOException {
 9         // 创建服务器Socket对象
10         ServerSocket ss = new ServerSocket(11111);
11 
12         while (true) {
13             Socket s = ss.accept(); // 监听客户端连接
14             new Thread(new UserThread(s)).start();
15         }
16     }
17     
18 }
服务器端代码
 1 package cn.itcast_15;
 2 
 3 import java.io.BufferedReader;
 4 import java.io.BufferedWriter;
 5 import java.io.FileWriter;
 6 import java.io.IOException;
 7 import java.io.InputStreamReader;
 8 import java.io.OutputStreamWriter;
 9 import java.net.Socket;
10 
11 public class UserThread implements Runnable {
12     
13     private Socket s;
14 
15     public UserThread(Socket s) {
16         this.s = s;
17     }
18 
19     @Override
20     public void run() {
21         try {
22             // 封装通道内的流对象
23             BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
24             
25             // 封装文本文件对象
26             // BufferedWriter bw = new BufferedWriter(new FileWriter("src//cn//itcast_15//Copy.java"));
27 
28             // 为了防止名称冲突(即为了防止所有文件的名字都一样)
29             String newName = System.currentTimeMillis() + ".txt";
30             BufferedWriter bw = new BufferedWriter(new FileWriter("src//cn//itcast_15//" + newName));
31             // 如果在某一时间点,同时有很多人访问服务器,相同名字的文件也会出现很多,肿么办? 答:再加循环判断,一旦某个名字存在,就重新赋值另一名字即可。
32 
33             String line = null;
34             while ((line = br.readLine()) != null) { // 阻塞
35                 bw.write(line);
36                 bw.newLine();
37                 bw.flush();
38             }
39 
40             // 给出反馈
41             BufferedWriter bwServer = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
42             bwServer.write("文件上传成功");
43             bwServer.newLine();
44             bwServer.flush();
45 
46             // 释放资源
47             bw.close();
48             s.close();
49         } catch (IOException e) {
50             e.printStackTrace();
51         }
52     }
53 
54 }
服务器的代码用线程进行封装(多线程)

 

我的GitHub地址: https://github.com/heizemingjun
我的博客园地址: http://www.cnblogs.com/chenmingjun
我的蚂蚁笔记博客地址: http://blog.leanote.com/chenmingjun
Copyright ©2018 黑泽明军
【转载文章务必保留出处和署名,谢谢!】
相关文章
|
13天前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
Java 数据库 Spring
48 0
|
25天前
|
算法 Java
Java多线程编程:实现线程间数据共享机制
以上就是Java中几种主要处理多线程序列化资源以及协调各自独立运行但需相互配合以完成任务threads 的技术手段与策略。正确应用上述技术将大大增强你程序稳定性与效率同时也降低bug出现率因此深刻理解每项技术背后理论至关重要.
59 16
|
2月前
|
缓存 并行计算 安全
关于Java多线程详解
本文深入讲解Java多线程编程,涵盖基础概念、线程创建与管理、同步机制、并发工具类、线程池、线程安全集合、实战案例及常见问题解决方案,助你掌握高性能并发编程技巧,应对多线程开发中的挑战。
|
2月前
|
数据采集 存储 前端开发
Java爬虫性能优化:多线程抓取JSP动态数据实践
Java爬虫性能优化:多线程抓取JSP动态数据实践
|
3月前
|
Java API 调度
从阻塞到畅通:Java虚拟线程开启并发新纪元
从阻塞到畅通:Java虚拟线程开启并发新纪元
300 83
|
3月前
|
负载均衡 算法 安全
基于Reactor模式的高性能网络库之线程池组件设计篇
EventLoopThreadPool 是 Reactor 模式中实现“一个主线程 + 多个工作线程”的关键组件,用于高效管理多个 EventLoop 并在多核 CPU 上分担高并发 I/O 压力。通过封装 Thread 类和 EventLoopThread,实现线程创建、管理和事件循环的调度,形成线程池结构。每个 EventLoopThread 管理一个子线程与对应的 EventLoop(subloop),主线程(base loop)通过负载均衡算法将任务派发至各 subloop,从而提升系统性能与并发处理能力。
142 3
|
3月前
|
安全 算法 Java
Java 多线程:线程安全与同步控制的深度解析
本文介绍了 Java 多线程开发的关键技术,涵盖线程的创建与启动、线程安全问题及其解决方案,包括 synchronized 关键字、原子类和线程间通信机制。通过示例代码讲解了多线程编程中的常见问题与优化方法,帮助开发者提升程序性能与稳定性。
139 0
|
存储 安全 Java
解锁Java并发编程奥秘:深入剖析Synchronized关键字的同步机制与实现原理,让多线程安全如磐石般稳固!
【8月更文挑战第4天】Java并发编程中,Synchronized关键字是确保多线程环境下数据一致性与线程安全的基础机制。它可通过修饰实例方法、静态方法或代码块来控制对共享资源的独占访问。Synchronized基于Java对象头中的监视器锁实现,通过MonitorEnter/MonitorExit指令管理锁的获取与释放。示例展示了如何使用Synchronized修饰方法以实现线程间的同步,避免数据竞争。掌握其原理对编写高效安全的多线程程序极为关键。
214 1
|
安全 Java 开发者
Java并发编程中的线程安全问题及解决方案探讨
在Java编程中,特别是在并发编程领域,线程安全问题是开发过程中常见且关键的挑战。本文将深入探讨Java中的线程安全性,分析常见的线程安全问题,并介绍相应的解决方案,帮助开发者更好地理解和应对并发环境下的挑战。【7月更文挑战第3天】
303 0