如题,下面的代码可以实现:
当有客户端连接,
服务端就新建一个线程来接收文件,
以实现同时接受多个客户端发送的文件。
每上传完一个文件,返回给客户端“上传成功!”
但是服务端保存客户端上传的文件是完全根据系统毫秒时间生成的。
如果要传递客户端上传的文件名,让服务端以“原文件名+系统毫秒时间+.原扩展名”格式保存,要避免重名文件。
是不是需要重新建立一个Socket连接传输呢?
还有客户端和服务端要实时打印输出,"文件名+上传进度n%"到各自控制台,如何实现呢?
求大神指点迷津
服务端代码:
[Java] 纯文本查看 复制代码 package test01;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
/*
* TCP文件上传
* 服务端使用多线程
* 服务端需要一直打开接收服务,不需要关闭
*/
public class TestServer {
public static void main(String[] args) throws IOException {
// 创建服务端连接,端口8888
ServerSocket serverReceive = new ServerSocket(8888);
// 挂起死循环,方便多线程接受多个客户端同时上传文件
while (true) {
// 若没有连接,则阻塞,若建立连接,则继续执行
Socket socket = serverReceive.accept();
// 获取连接后紧接着建立新的线程,处理文件上传
receiveSocket(socket);
}
// serverReceive.close();
}
// 文件上传方法
public static boolean receiveSocket(final Socket socket) {
new Thread() {
@Override
public void run() {
BufferedInputStream bisSocket = null;
BufferedOutputStream bosFile = null;
BufferedWriter bwSocket = null;
try {
// socket读取
bisSocket = new BufferedInputStream(socket.getInputStream());
// 将客户端上传文件保存在服务端本地,文件名根据当前时间毫秒值生成
bosFile = new BufferedOutputStream(
new FileOutputStream("temp" + System.currentTimeMillis() + ".tmp"));
byte[] buf = new byte[1024];
int len;
while ((len = bisSocket.read(buf)) != -1) {
bosFile.write(buf, 0, len);
}
bosFile.flush();
// 向客户端输出上传成功
bwSocket = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
bwSocket.write("文件上传成功!");
bwSocket.flush();
socket.shutdownOutput();
} catch (IOException e) {
e.printStackTrace();
} finally {
// 关闭各个流资源、Socket资源
if (bwSocket != null) {
try {
bwSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (bosFile != null) {
try {
bosFile.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (bisSocket != null) {
try {
bisSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
};
}.start();
return true;
}
}
客户端代码:
[Java] 纯文本查看 复制代码 package test01;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
/*
* 文件上传
* 客户端
*/
public class TestClient {
public static void main(String[] args) throws UnknownHostException, IOException {
// 创建Socket连接
Socket socket = new Socket(InetAddress.getLocalHost(), 8888);
// 封装要上传的文件对象
String fileSrc;
fileSrc = "src\\test01\\TestClient.java";
File file = new File(fileSrc);
// 建立文件本地输入流,Socket连接输出流
BufferedInputStream bisFile = new BufferedInputStream(new FileInputStream(file));
BufferedOutputStream bosSocket = new BufferedOutputStream(socket.getOutputStream());
// 开始上传文件
byte[] bys = new byte[1024];
int len = 0;
while ((len = bisFile.read(bys)) != -1) {
bosSocket.write(bys, 0, len);
}
bosSocket.flush();
socket.shutdownOutput();
// 获取服务端返回消息
BufferedReader brSocket = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String isOk = brSocket.readLine();
System.out.println(isOk);
// 关闭各个流资源,及Socket连接
brSocket.close();
bosSocket.close();
bisFile.close();
socket.close();
}
}
|