Java之Socket/ServerSocket为基础的C/S文件上传示例

需求

  • 需求:把客户端指定的文件上传到服务器

(自己随便写的,有些地方需要优化)


客户端源码

import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
public class Client {
    public static void main(String[] args) {
        //源文件
        File Pic = new File("F:\\u盘\\xb_4K.mp4");

        Socket socket = null;

        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;

        BufferedInputStream sbis = null;
        try {
            bis = new BufferedInputStream(new FileInputStream(Pic));
            //
            socket = new Socket(InetAddress.getByName("192.168.0.106"), 60000);

            bos = new BufferedOutputStream(socket.getOutputStream());


            //传递文件名称
            //注意此处bug,传递过去的是一个绝对路径,因此需要切割
            String name = Pic.getName()+"\r\n";
            if (name.contains("\\")) {
                int i = name.lastIndexOf("\\");
                name = name.substring(i);
            }
            bos.write(name.getBytes());
            bos.flush();

            //传递数据
            int len = 0;
            while ((len = bis.read()) != -1) {
                bos.write(len);
            }
            bos.flush();
            socket.shutdownOutput();

            //接受服务端返回
            sbis = new BufferedInputStream(socket.getInputStream());
            byte[] buff = new byte[1024];
            int read = sbis.read(buff);
            String s = new String(buff, 0, read);
            System.out.println(s);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

服务端

  • 接收客户端传来的文件,并保存到服务器指定的文件夹中。
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class PictureTheServer {
    public static void main(String[] args) {

        String filename = null;

        ServerSocket serverSocket = null;

        File putFile = null;

        try {
            //1.创建Socket服务设置监听端口,获取服务端Socket对象
            serverSocket = new ServerSocket(60000);
            Socket accept = serverSocket.accept();
            //2.获取读取流
            InputStream is = accept.getInputStream();
            //3.获取读取流的第一个字段(第一个字段为文件名称)
            BufferedReader read = new BufferedReader(new InputStreamReader(is));
            filename = read.readLine();
            putFile = new File("E:\\IO测试文件夹\\" + filename);

            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(putFile));

            BufferedInputStream bis = new BufferedInputStream(is);
            int len = 0;
            while ((len = bis.read()) != -1) {
                bos.write(len);
            }
            bos.flush();
            accept.shutdownInput();

            PrintWriter pw = new PrintWriter(new OutputStreamWriter(accept.getOutputStream()),true);
            pw.println("上传成功");

            accept.shutdownOutput();

        } catch (IOException e) {
            e.printStackTrace();
        }finally{
			try {
                serverSocket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
		}
    }
}

多线程改进版

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

class Demo{
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket;

        serverSocket = new ServerSocket(60000);
        while (true) {
            //来一个任务就开启一个线程。
            new Thread(new ThreadServerPic(serverSocket.accept())).start();
        }
    }
}


public class ThreadServerPic implements Runnable {
    private String fileName = null;
    private File putFile = null;
    private Socket accept;

    public ThreadServerPic(Socket accept) {
        this.accept = accept;
    }

    @Override
    public void run() {
        try {
            InputStream is = accept.getInputStream();
            //3.获取读取流的第一个字段(第一个字段为文件名称)
            BufferedReader read = new BufferedReader(new InputStreamReader(is));
            fileName = read.readLine();
            putFile = new File("E:\\IO测试文件夹\\" + fileName);
            if (putFile.exists()) {
                putFile = new File(putFile.getName() + "(1)");
            }
            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(putFile));

            BufferedInputStream bis = new BufferedInputStream(is);
            int len = 0;
            while ((len = bis.read()) != -1) {
                bos.write(len);
            }
            bos.flush();
            accept.shutdownInput();

            PrintWriter pw = new PrintWriter(new OutputStreamWriter(accept.getOutputStream()), true);
            pw.println("上传成功");

            accept.shutdownOutput();

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                accept.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

发布了51 篇原创文章 · 获赞 20 · 访问量 1554

猜你喜欢

转载自blog.csdn.net/qq_39711439/article/details/100939593