您的位置:首页 > 理论基础 > 计算机网络

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

2018-04-11 22:39 585 查看
Java网络编程多线程改进上传文件
  服务器的代码用线程进行封装(多线程),这样可以模拟一个同时接收多人上传文件的服务器。
  (用循环也可以但是效率低,是单线程的程序)

/*
* 通过while循环可以改进一个服务器接收多个客户端。
*    但是这个是有问题的。
*
* 如果是以下这种情况:假设我还有张三,李四,王五这三个人分别执行客户端
*               文件大小      网速
*      张三:好好学习.avi(100M)      256k
*      李四:天天向上.mp3(3M)      1M
*      王五:ILoveJava.txt(1k)       100M
*
* 因为服务器端是阻塞式接收的。只有等某一个人上传文件完后才继续执行程序。效率低。
*
* 如何解决呢?
*    给每一个用户分别开启一个线程。
*
*/

示例代码如下:

package cn.itcast_15;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;

public class UserThread implements Runnable {

private Socket s;

public UserThread(Socket s) {
this.s = s;
}

@Override
public void run() {
try {
// 封装通道内的流对象
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));

// 封装文本文件对象
// BufferedWriter bw = new BufferedWriter(new FileWriter("src//cn//itcast_15//Copy.java"));

// 为了防止名称冲突(即为了防止所有文件的名字都一样)
String newName = System.currentTimeMillis() + ".txt";
BufferedWriter bw = new BufferedWriter(new FileWriter("src//cn//itcast_15//" + newName));
// 如果在某一时间点,同时有很多人访问服务器,相同名字的文件也会出现很多,肿么办? 答:再加循环判断,一旦某个名字存在,就重新赋值另一名字即可。

String line = null;
while ((line = br.readLine()) != null) { // 阻塞
bw.write(line);
bw.newLine();
bw.flush();
}

// 给出反馈
BufferedWriter bwServer = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
bwServer.write("文件上传成功");
bwServer.newLine();
bwServer.flush();

// 释放资源
bw.close();
s.close();
} catch (IOException e) {
e.printStackTrace();
}
}

}


服务器的代码用线程进行封装(多线程)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: