A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

如题,下面的代码可以实现:
当有客户端连接,
服务端就新建一个线程来接收文件,
以实现同时接受多个客户端发送的文件。
每上传完一个文件,返回给客户端“上传成功!”

但是服务端保存客户端上传的文件是完全根据系统毫秒时间生成的。
如果要传递客户端上传的文件名,让服务端以“原文件名+系统毫秒时间+.原扩展名”格式保存,要避免重名文件。
是不是需要重新建立一个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();

	}

}



1 个回复

倒序浏览
有没有会的?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马