zoukankan      html  css  js  c++  java
  • Java基础知识强化之网络编程笔记14:TCP之多个客户端上传到一个服务器的思考(多线程改进)

    1. 多个客户端上传到一个服务器的思考

    通过while循环可以改进一个服务器接收多个客户端。

    但是这个是有问题的
    如果是这种情况,假设我还有张三,李四,王五这三个人分别执行客户端
       张三:好好学习.avi(100M)    256k
       李四:天天向上.mp3(3M)     1M
       王五:ILoveJava.txt(1k)    100M

    这要等张三传完了,再去传李四……

    2. 使用多线程改进:

    (1)线程类UserThread

     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     private Socket s;
    13 
    14     public UserThread(Socket s) {
    15         this.s = s;
    16     }
    17 
    18     @Override
    19     public void run() {
    20         try {
    21             // 封装通道内的流
    22             BufferedReader br = new BufferedReader(new InputStreamReader(
    23                     s.getInputStream()));
    24             // 封装文本文件
    25             // BufferedWriter bw = new BufferedWriter(new
    26             // FileWriter("Copy.java"));
    27 
    28             // 为了防止名称冲突
    29             String newName = System.currentTimeMillis() + ".java";
    30             BufferedWriter bw = new BufferedWriter(new FileWriter(newName));
    31 
    32             String line = null;
    33             while ((line = br.readLine()) != null) { // 阻塞
    34                 bw.write(line);
    35                 bw.newLine();
    36                 bw.flush();
    37             }
    38 
    39             // 给出反馈
    40             BufferedWriter bwServer = new BufferedWriter(
    41                     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 }

    (2)客户端:

     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.12.92", 11111);
    15 
    16         // 封装文本文件
    17         // BufferedReader br = new BufferedReader(new FileReader(
    18         // "InetAddressDemo.java"));
    19         BufferedReader br = new BufferedReader(new FileReader(
    20                 "ReceiveDemo.java"));
    21         // 封装通道内流
    22         BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
    23                 s.getOutputStream()));
    24 
    25         String line = null;
    26         while ((line = br.readLine()) != null) { // 阻塞
    27             bw.write(line);
    28             bw.newLine();
    29             bw.flush();
    30         }
    31 
    32         // Socket提供了一个终止,它会通知服务器你别等了,我没有数据过来了
    33         s.shutdownOutput();
    34 
    35         // 接收反馈
    36         BufferedReader brClient = new BufferedReader(new InputStreamReader(
    37                 s.getInputStream()));
    38         String client = brClient.readLine(); // 阻塞
    39         System.out.println(client);
    40 
    41         // 释放资源
    42         br.close();
    43         s.close();
    44     }
    45 }

    (3)服务器端:

     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
    学习记录17
    学习记录16
    小白的心酸连网历程
    学习记录15
    学习记录14
    学习记录13
    学习记录12
    学习记录10
    语法糖
  • 原文地址:https://www.cnblogs.com/hebao0514/p/4872637.html
Copyright © 2011-2022 走看看