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 }
时间: 2024-10-20 12:41:11

Java基础知识强化之网络编程笔记14:TCP之多个客户端上传到一个服务器的思考(多线程改进)的相关文章

Java基础知识强化之网络编程笔记13:TCP之TCP协议上传图片并给出反馈

1. TCP协议上传图片并给出反馈: (1)客户端: 1 package cn.itcast_13; 2 3 import java.io.BufferedInputStream; 4 import java.io.BufferedOutputStream; 5 import java.io.FileInputStream; 6 import java.io.IOException; 7 import java.io.InputStream; 8 import java.net.Socket;

Java基础知识强化之网络编程笔记18:Android网络通信之 使用HttpClient的Post / Get 方式读取网络数据(基于HTTP通信技术)

使用HttpClient进行Get方式通信,通过HttpClient建立网络链接,使用HttpGet方法读取数据,并且通过Response获取Entity返回值. 使用HttpClient进行Post方式通信,通过HttpClient建立网络链接,使用HttpPost方法传出数据与读取数据,传出和传入的数据都是Entity的子类. 详见:Android(java)学习笔记211:采用httpclient提交数据(qq登录案例)

Java基础知识强化之网络编程笔记16:Android网络通信之 使用Http的Get方式读取网络数据(基于HTTP通信技术)

使用Http的Get方式读取网络数据,使用Get方式与网络通信是最常见的Http通信,建立链接之后就可以通过输入流读取网络数据. 详见:Android(java)学习笔记209:采用get请求提交数据到服务器(qq登录案例)

Java基础知识强化之网络编程笔记19:Android网络通信之 HttpClient和传统Post、Get方式的区别

1. HttpClient是什么 ?     HTTP 协议可能是现在 Internet 上使用得最多.最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源.虽然在 JDK 的 java net包中已经提供了访问 HTTP 协议的基本功能,但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活. HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端编程工具

Java基础知识强化之网络编程笔记06:TCP之TCP协议发送数据 和 接收数据

1. TCP协议发送数据 和 接收数据 TCP协议接收数据:• 创建接收端的Socket对象• 监听客户端连接.返回一个对应的Socket对象• 获取输入流,读取数据显示在控制台• 释放资源 TCP协议发送数据: • 创建发送端的Socket对象• 这一步如果成功,就说明连接已经建立成功了.• 获取输出流,写数据• 释放资源 2. 代码实现: (1)发送端: 1 package cn.itcast_06; 2 3 import java.io.IOException; 4 import java

Java基础知识强化之网络编程笔记22:Android网络通信之 Android常用OAuth登录(获取个人信息)

1. 获取百度个人信息(使用Gson解析): 2. 代码案例: (1)工程一览图,如下: (2)activity_main.xml: 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="match_parent

Java基础知识强化之网络编程笔记04:UDP之发送端的数据来自于键盘录入案例

1. 数据来自于键盘录入 键盘录入数据要自己控制录入结束. 2. 代码实现: (1)发送端: 1 package com.himi.updDemo1; 2 3 import java.io.IOException; 4 import java.net.DatagramPacket; 5 import java.net.DatagramSocket; 6 import java.net.InetAddress; 7 import java.util.Scanner; 8 9 /** 10 * 11

Java基础知识强化之网络编程笔记02:Socket通信原理图解

1. Socket (1)Socket套接字  网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字 (2)Socket原理机制:  • 通信两端都有Socket.  • 网络通信其实就是Socket间的通信.  • 数据在两个Socket间通过IO传输. 2.  Socket通信原理图解:

Java基础知识强化之网络编程笔记03:UDP之UDP协议发送数据 和 接收数据

1. UDP协议发送数据 和 接收数据 UDP协议发送数据: • 创建发送端的Socket对象 • 创建数据,并把数据打包 • 调用Socket对象的发送方法,发送数据包 • 释放资源  UDP协议接收数据:       • 创建接收端的Socket对象      • 创建数据包,接收数据(接收容器)      • 调用Socket对象的接收方法,接收数据包      • 解析数据包,并显示在控制台      • 释放资源 2. 代码实现 (1)首先我们先写发送端的程序,如下: 1 packag