【java】TCP通信的文件上传

原理

客户端读取本地的文件,把文件上传到服务器,服务器在把上传的文件保存到服务器的硬盘上。

代码实现

服务器端:

		 // 1、创建一个服务器ServerScoket对象,和系统要的指定的端口号
        ServerSocket server= new ServerSocket(8887);
        // 2、使用ServerSocket对象中的方法accept,获取到请求的客户端Socket对象
        /*
            让服务器一直处于监听状态(死循环accept方法)
            有个客户端上传文件,就保存一个文件
         */
        while(true){
            Socket socket = server.accept();
            /*
                使用多线程技术,提高程序的效率

             */
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try{
                        // 3、使用Socket对象中的方法getInputStream,获取到网络字节输入流InputStream对象
                        InputStream is = socket.getInputStream();
                        // 4、判断是否有文件夹存在,不存在则创建
                        File file = new File("E:\\upload");
                        if(!file.exists()){
                            file.mkdirs();
                        }
                        // 自定义一个文件命名规则:方知同名文件被覆盖
                        String fileName="itcast"+System.currentTimeMillis()+new Random().nextInt(9999999)+".jpg";
                        //5、 创建一个本地字节输出流FileOutPutStream对象,构造方法中绑定要输出的目的地
                        FileOutputStream fos=new FileOutputStream(file+"\\"+fileName);
                        // 6、使用网络字节输入流InputStream对象中的方法read,读取客户端上传的文件
                        int len =0;
                        byte[] bytes=new byte[1024];
                        while ((len = is.read(bytes))!=-1){
                            //7、使用本地字节输出流FileOutputStream对象中的方法write,把读取到的文件保存到服务器的硬盘上
                            fos.write(bytes,0,len);
                        }
                        // 8、使用Socket对象中的方法getOutputStream,获取到网络字节输出流outputStream对象
                        // 9、使用网络字节输出流outputstream独享中的方法write,给客户端回写“上传成功"
                        socket.getOutputStream().write("上传成功".getBytes());
                        // 10、释放资源
                        fos.close();
                        socket.close();
                    }catch (IOException e){
                        System.out.println(e);
                    }
                }
            }).start();

        }

PS:

  1. 服务气短启动后将不会关闭,如果需要关闭可以用:server.close();
  2. File file = new File(“E:\upload”);此处的路径是自定义的,可以根据自己需求而设计

客户端:

		 //1、创建本地字节输入流FileInputStream对象,构造方法中绑定要读取的数据源
        FileInputStream fis= new FileInputStream("E:\\FoodHealthWeb\\FoodHealthWeb\\images\\ba1.jpg");
        // 2、创建一个客户端Socket对象,构造方法中绑定服务器的IP地址和端口号
        Socket socket=new Socket("127.0.0.1",8887);
        // 3、使用Socket中的方法GetoutputStream,获取网路字节输出流outputStream对象
        OutputStream os = socket.getOutputStream();
        // 4、使用本地字节输入流FileInputStream对象这的方法read,读取本地文件
        int len=0;
        byte[] bytes= new byte[1024];
        while ((len=fis.read(bytes))!=-1){
            // 5、 使用网络字符输出流OutPutStream对象中的方法write,把读取到的文件上传到服务器
            os.write(bytes,0,len);
        }
        socket.shutdownOutput();
        //6、使用socket中的方法getInputstream,获取网络字符流Inputstream对象
        InputStream is = socket.getInputStream();

        // 7、使用网路字符输入流InputStream对象中的方法read读取服务回写的数据
        while((len=is.read(bytes))!=-1){
            System.out.println(new String(bytes,0,len ));
        }
        // 8、释放资源(FileInpuStream,socket)
        socket.close();
        fis.close();

PS:

  1. Socket socket=new Socket(“127.0.0.1”,8887);此处的host,是服务器端的ip地址,后面的port是端口号,要和服务器端的端口号一致
  2. 若是在同一台电脑中启动客户端和服务器端,host写127.0.0.1
  3. 若是在局域网中传递数据的话,host写服务器端的ip地址。(以自己的电脑作为服务器端需要关闭防火墙 ,链接为windows10关闭防火墙的方法~)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值