基于TCP通信的简单客户端与服务端小demo—上传文件(二)

本篇文章主要讲解如何将文件上传到服务器

一.服务器的编写

    其过程与一中非常相似,不同点在于:

     1.在此处,我选择了不将服务器关闭,让其一直处于accept的状态

     2.选择了常用的uuid来对文件进行命名,防止重名导致文件被覆盖

     3.开启多线程模式,每来一个上传文件的客户端,就为其开启一个线程,上传完毕后,自动关闭流和线程

注意:因为run方法不能throws异常,因此,此处抛出异常的方式应使用try...catch。代码中,我使用了lombok注释自动抛出

public class UpServer {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket=new ServerSocket(8787);
        while (true){
            Socket socket=serverSocket.accept();
            new Thread(new Runnable() {//开启多线程
                @SneakyThrows
                @Override
                public void run() {
                    InputStream is=socket.getInputStream();
                    File file=new File("C:\\Users\\kjl\\Downloads\\uploads");
                    if(!file.exists())file.mkdirs();
                    UUID uuid=new UUID(0,1111111);
                    String name=file+"\\"+uuid.randomUUID().toString()+".docx";
                   // FileOutputStream fs=new FileOutputStream(file+"\\test2.docx");
                    FileOutputStream fs=new FileOutputStream(name);
                    int len=0;
                    byte[] bytes=new byte[1024];
                    while ((len=is.read(bytes))!=-1)fs.write(bytes,0,len);
                    System.out.println("接收完成");
                    is.close();
                }
            }).start();
        }
       //serverSocket.close();
    }
}

二.客户端的编写

    客户端与之前的基本相同,不同点在于使用的输入流为FileInputStream,其次是使用shutdownOutput关闭socket的输出流,因为在while循环中len不可能为-1。

public class UpClient {
    public static void main(String[] args) throws IOException {
        FileInputStream fs=new FileInputStream("C:\\Users\\kjl\\Downloads\\test.docx");
        Socket socket=new Socket(InetAddress.getLocalHost(),8787);
        OutputStream os=socket.getOutputStream();
        byte[] bytes=new byte[1024];
        int len=0;
        while ((len=fs.read(bytes))!=-1){
            os.write(bytes,0,len);
        }
        socket.shutdownOutput();
        System.out.println("上传成功");
        fs.close();
    }
}

错误之处还请大佬指出,一起学习,一起进步,感谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值