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

时间:2023-12-05 15:18:02

TCP实现多用户上传文件:

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

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

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

  线程类代码:

 public class UserThread implements Runnable {

     // 构造方法接收对象
private Socket s; public UserThread(Socket s) {
this.s = s;
} public void run() {
// 把客户端的代码复制过来
// 不同的客户端传递文件,就看他们各自的带宽情况,抢占线程
try {
// 把通道内的字节流包装成字符流
BufferedReader br = new BufferedReader(new InputStreamReader(
s.getInputStream())); // 封装文件目录
// BufferedWriter bw = new BufferedWriter(new
// FileWriter("TCPto.txt")); // 因为上传多个文件,所以文件名字要改变
String newname = System.currentTimeMillis() + ".txt";
BufferedWriter bw = new BufferedWriter(new FileWriter(newname)); // 获取数据,并输出到文件中
String line = null;
while ((line = br.readLine()) != null) {
bw.write(line);
bw.newLine();
bw.flush();
} // 给出反馈
BufferedWriter bwr = new BufferedWriter(new OutputStreamWriter(
s.getOutputStream()));
bwr.write("你的文件上传成功!");
bwr.newLine();
bwr.flush(); // 释放资源
s.close();
bw.close(); } catch (IOException e) {
e.printStackTrace();
}
} }

  服务器的代码:

 public class ServerDemo {
public static void main(String[] args) throws IOException { // 创建ServerSocket对象,监听
ServerSocket ss = new ServerSocket(10010); //有客户端上传数据就执行
while(true){
//创建Socket对象
Socket s = ss.accept();
//执行线程
new Thread(new UserThread(s)).start(); }
}
}

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

 public class ClientDemo {
public static void main(String[] args) throws IOException { // 创建Socket对象
Socket s = new Socket("172.19.12.233", 10010); // 封装文件目录
BufferedReader br = new BufferedReader(new FileReader(
"InetAddressDemo.java")); // 把通道内的字节流包装成字符流
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
s.getOutputStream())); // 获取文件中的数据,并输出给服务器
String line = null;
while ((line = br.readLine()) != null) { bw.write(line);
bw.newLine();
bw.flush();
} //给服务器一个信号,上面的文本中的数据已经传递完毕
s.shutdownOutput(); // 接收反馈
BufferedReader brr = new BufferedReader(new InputStreamReader(
s.getInputStream())); // 获取反馈,并输出到控制台
String line1 = null;
while ((line1 = brr.readLine()) != null) {
System.out.println(line1);
} brr.close();
s.close();
br.close(); }
}