java简单的多线程实现文件上传实现

多线程实现文件上传

  • 需求:
    • 客户端:数据来自于文本文件,接收服务器反馈
    • 服务器:接收到的数据写入文本文件,给出反馈,代码用线程进行封装,为每一个客户端开启一个线程
  • 分析:
    • 创建客户端对象,创建输入流对象指向文件,每读入一行数据就给服务器输出一行数据,输出结束后使用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 socket = new Socket(InetAddress.getLocalHost(), 10020);
        // 获取socket的输出流
        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 {
        // 创建服务端的Socket
        ServerSocket serverSocket = new ServerSocket(10020);
        // 监听数据

        while (true) {
            Socket socket = serverSocket.accept();
            new Thread(new ServerThread(socket)).start();
        }

		//因为服务器端需要一直处于接收状态,随时接收文件,不需要释放资源
        // socket.close();
        // serverSocket.close();

    }
}
/*
	服务器端实现线程,重写方法代码
*/
public class ServerThread implements Runnable {

    private  Socket socket;

    public ServerThread(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        try {

            // 读取客户端发送的数据
            // 从客户端socket中获取字节输入流
            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();
        }
    }
}
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页