• 使用C/S结构实现客户端上传本地文件到服务器


    客户端:

    package cn.kgc.cs01;
    
    import java.io.*;
    import java.net.Socket;
    
    public class Demo01_Client {
        public static void main(String[] args) {
            try {
                //创建客户端socket对象
                Socket socket = new Socket("localhost",8888);
                //获得网络字节输出流,用来把本地文件写到服务器端内存
                OutputStream os = socket.getOutputStream();
                //创建本地字节输入流,用来把本地文件读到客户端内存
                FileInputStream fis = new FileInputStream("h:\a.jpg");
                //采用数组使读写效率更高
                byte[]bytes=new byte[1024];
                int len=0;
                //当本地字节流在读取完数组中的最后一个元素时,会返回-1
                while((len=fis.read(bytes))!=-1){
                    //网络字节流把读到的文件写到服务器端内存
                    os.write(bytes,0,len);
                }
                //关闭服务器端的读写循环
                socket.shutdownOutput();
                //创建网络字节输入流,来获得服务器端的反馈
                InputStream is = socket.getInputStream();
                int read = is.read(bytes);
                //将读到的字节数组转成字符串输出
                System.out.println(new String(bytes,0,read));
                //释放资源
                is.close();
                os.close();
                fis.close();
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
    
    
        }
    }
    

      服务器端:

    package cn.kgc.cs01;
    
    import java.io.*;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.Random;
    
    public class Demo01_Server {
        public static void main(String[] args) {
            try {
                //创建服务端的serverSocket对象,提供端口号
                ServerSocket server = new ServerSocket(8888);
                //创建文件对象,判断本地是否存在该文件,如果没有则创建
                File file = new File("h:\up");
                if(!file.exists()){
                    file.mkdir();
                }
                //开启线程,提高上传效率
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        while(true){
                            try{
                                //通过accept()方法获得客户端socket对象,并监听
                                Socket socket = server.accept();
                                //获得网络字节输入流,来读取客户端上传的文件
                                InputStream is = socket.getInputStream();
                                /**
                                 * 创建本地字节输出流,把服务器读到的文件写到硬盘里面
                                 * 注意:文件名应该用随机数和当前时间的组合,
                                 * 这样才能保证每次都能把文件写到硬盘里面
                                 */
                                FileOutputStream fos = new FileOutputStream("h:\up\" + (new Random().nextInt() + System.currentTimeMillis()) + ".jpg");
                                byte[]bytes=new byte[1024];
                                int len=0;
                                while((len=is.read(bytes))!=-1){
                                    //把服务器读到的文件写到内存中
                                    fos.write(bytes,0,len);
                                }
                                //获得网络字节输出流,给客户端反馈信息
                                OutputStream os = socket.getOutputStream();
                                //把字符串转成字节数组传给客户端
                                os.write("文件上传成功!".getBytes());
                                //释放资源
                                os.close();
                                fos.close();
                                is.close();
                                socket.close();
                                /**
                                 * 注意:
                                 * 服务器Server的流一定不能关
                                 */
                            }catch(IOException e){
                                e.printStackTrace();
                            }
    
                        }
                    }
                }).start();//千万别忘了调用线程的开始方法
    
    
            } catch (IOException e) {
                e.printStackTrace();
            }
    
        }
    }
    

      

  • 相关阅读:
    uni-app调用原生的文件系统管理器(可选取附件上传)
    uni-app图片压缩转base64位 利用递归来实现多张图片压缩
    解释器模式
    外观模型
    装饰模式
    组合模式
    原型模式
    简单工厂模式
    抽象工厂模式
    工厂方法模式
  • 原文地址:https://www.cnblogs.com/Hubert-dzl/p/10958880.html
Copyright © 2020-2023  润新知