java 26 - 9 网络编程之 TCP协议多用户上传文件

TCP实现多用户上传文件:

  需要同时给多用户上传文件,这样就得用多线程来实现。

实际上,这样的话,上传的先后顺序和速度就跟客户端的带宽有关:带宽够,就容易抢占到线程的执行权;

 

首先,创建个线程类:(这个线程类执行的是服务器的功能)

  线程类代码:

 1 public class UserThread implements Runnable {
 2 
 3     // 构造方法接收对象
 4     private Socket s;
 5 
 6     public UserThread(Socket s) {
 7         this.s = s;
 8     }
 9 
10     public void run() {
11         // 把客户端的代码复制过来
12         // 不同的客户端传递文件,就看他们各自的带宽情况,抢占线程
13         try {
14             // 把通道内的字节流包装成字符流
15             BufferedReader br = new BufferedReader(new InputStreamReader(
16                     s.getInputStream()));
17 
18             // 封装文件目录
19             // BufferedWriter bw = new BufferedWriter(new
20             // FileWriter("TCPto.txt"));
21 
22             // 因为上传多个文件,所以文件名字要改变
23             String newname = System.currentTimeMillis() + ".txt";
24             BufferedWriter bw = new BufferedWriter(new FileWriter(newname));
25 
26             // 获取数据,并输出到文件中
27             String line = null;
28             while ((line = br.readLine()) != null) {
29                 bw.write(line);
30                 bw.newLine();
31                 bw.flush();
32             }
33 
34             // 给出反馈
35             BufferedWriter bwr = new BufferedWriter(new OutputStreamWriter(
36                     s.getOutputStream()));
37             bwr.write("你的文件上传成功!");
38             bwr.newLine();
39             bwr.flush();
40 
41             // 释放资源
42             s.close();
43             bw.close();
44 
45         } catch (IOException e) {
46             e.printStackTrace();
47         }
48     }
49 
50 }

 

  服务器的代码:

 1 public class ServerDemo {
 2     public static void main(String[] args) throws IOException {
 3 
 4         // 创建ServerSocket对象,监听
 5         ServerSocket ss = new ServerSocket(10010);
 6 
 7         //有客户端上传数据就执行
 8         while(true){
 9             //创建Socket对象
10             Socket s = ss.accept();
11             //执行线程
12             new Thread(new UserThread(s)).start();
13             
14         }
15     }
16 }

 

  客户端的代码:(只改动名字那里,目前只能这样改。。。)

 1 public class ClientDemo {
 2     public static void main(String[] args) throws IOException {
 3 
 4         // 创建Socket对象
 5         Socket s = new Socket("172.19.12.233", 10010);
 6 
 7         // 封装文件目录
 8         BufferedReader br = new BufferedReader(new FileReader(
 9                 "InetAddressDemo.java"));
10 
11         // 把通道内的字节流包装成字符流
12         BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
13                 s.getOutputStream()));
14 
15         // 获取文件中的数据,并输出给服务器
16         String line = null;
17         while ((line = br.readLine()) != null) {
18 
19             bw.write(line);
20             bw.newLine();
21             bw.flush();
22         }
23         
24         //给服务器一个信号,上面的文本中的数据已经传递完毕
25         s.shutdownOutput();
26         
27         // 接收反馈
28         BufferedReader brr = new BufferedReader(new InputStreamReader(
29                 s.getInputStream()));
30 
31         // 获取反馈,并输出到控制台
32         String line1 = null;
33         while ((line1 = brr.readLine()) != null) {
34             System.out.println(line1);
35         }
36         
37         brr.close();
38         s.close();
39         br.close();
40 
41     }
42 }

 

posted @ 2016-10-15 22:01  卡拉瓦  阅读(642)  评论(0编辑  收藏  举报