多线程实现文件上传
- 需求:
- 客户端:数据来自于文本文件,接收服务器反馈
- 服务器:接收到的数据写入文本文件,给出反馈,代码用线程进行封装,为每一个客户端开启一个线程
- 分析:
- 创建客户端对象,创建输入流对象指向文件,每读入一行数据就给服务器输出一行数据,输出结束后使用shutdownOutput()方法告知服务端传输结束
- 创建多线程类,在run()方法中读取客户端发送的数据,为了防止文件重名,使用计数器给文件名编号,接受结束后使用输出流给客户端发送反馈信息。
- 创建服务端对象,每监听到一个客户端则开启一个新的线程接受数据。
- 客户端接受服务端的回馈信息
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
public class ClientDemo {
public static void main(String[] args) throws IOException {
Socket socket = new Socket(InetAddress.getLocalHost(), 10020);
OutputStream os = socket.getOutputStream();
FileInputStream fis = new FileInputStream(new File("d:\\file.txt"));
int len;
byte[] bys = new byte[1024];
while ((len = fis.read(bys)) != -1) {
os.write(bys,0,len);
}
socket.shutdownOutput();
InputStream is = socket.getInputStream();
len = is.read(bys);
System.out.println(new String(bys,0,len));
fis.close();
socket.close();
}
}
public class ServerDemo {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(10020);
while (true) {
Socket socket = serverSocket.accept();
new Thread(new ServerThread(socket)).start();
}
}
}
public class ServerThread implements Runnable {
private Socket socket;
public ServerThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
InputStream is = socket.getInputStream();
String fileName = System.currentTimeMillis() + new Random().nextInt(999999) + ".txt";
FileOutputStream fos = new FileOutputStream(new File("d:\\"+fileName));
int len;
byte[] bys = new byte[1024];
while ((len = is.read(bys)) != -1) {
fos.write(bys, 0, len);
}
OutputStream os = socket.getOutputStream();
os.write("文件上传成功!".getBytes());
fos.close();
} catch (IOException e){
e.printStackTrace();
}
}
}