黑马程序员技术交流社区

标题: TCP多线程上传文件,如何实现文件名上传及实时打印进度? [打印本页]

作者: zhangsen89    时间: 2016-9-3 00:11
标题: TCP多线程上传文件,如何实现文件名上传及实时打印进度?
如题,下面的代码可以实现:
当有客户端连接,
服务端就新建一个线程来接收文件,
以实现同时接受多个客户端发送的文件。
每上传完一个文件,返回给客户端“上传成功!”

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

        }

}




作者: zhangsen89    时间: 2016-9-3 22:43
有没有会的?




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2