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

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 }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏青青天空树

趣味题:恺撒Caesar密码(c++实现)

描述:Julius Caesar 生活在充满危险和阴谋的年代。为了生存,他首次发明了密码,用于军队的消息传递。假设你是Caesar 军团中的一名军官,需要把Ca...

9020
来自专栏XAI

微信二次开发Java自定义菜单事件实现

微信二次开发--java http://blog.csdn.net/lyq8479/ 这个是柳峰的CSDN博客。大家可以看大神的教程。里面有所有的代码。 项目整...

83460
来自专栏杨建荣的学习笔记

最简单的web服务器实现(一)(r4笔记第68天)

tomcat作为web服务器,想必大家做过web开发的都离不开tomcat了,值得庆幸的是tomcat也是开放源代码的,最近准备好好琢磨琢磨tomcat的源码,...

38150
来自专栏battcn

Spring解密 - XML解析 与 Bean注册

DefaultListableBeanFactory 是 Spring 注册及加载 bean 的默认实现,整个 SpringIoc模板中它可以称得上 始祖。

13330
来自专栏mathor

Socket

14540
来自专栏Hongten

java开发_STMP邮箱客户端_发送邮件

http://zhiwenweb.cn/jszx/czxt/201009/20179.html

25530
来自专栏青玉伏案

设计模式(七): 通过转接头来观察"适配器模式"(Adapter Pattern)

在前面一篇博客中介绍了“命令模式”(Command Pattern),今天博客的主题是“适配器模式”(Adapter Pattern)。适配器模式用处还是比较多...

21180
来自专栏拂晓风起

java web 自定义错误页面 完整jsp错误页面代码(同时写错误日志) error.jsp

13450
来自专栏公众号_薛勤的博客

HttpUrlConnection使用Demo

13020
来自专栏后台开发+音视频+ffmpeg

dpvs源码分析(续)

在上一篇https://cloud.tencent.com/developer/article/1180256?s=original-sharing,我们已经介...

56010

扫码关注云+社区

领取腾讯云代金券