zoukankan      html  css  js  c++  java
  • java实现服务端开启多线程处理客户端的上传图片请求

    将客户端c:\a.jpg 上传到e:\公司名称+6位随机数.jpg  这样为了不断开连接客户端每次上传的图片名字不重名覆盖,验证之用

     这里需要注意的是Socket的终止客户端的输入方法  shutdownOutput,如果不关闭发送服务器的输出流,线程就会阻塞,就没法接下去

    接受服务发来的输入入流。

    package demo04;
    
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.Socket;
    
    /*
     *  实现TCP图片上传客户端
     *  实现步骤:
     *      1.Socket套接字连接服务器
     *      2.通过Socket获取字节输出流,写图片
     *      3.使用自己的流对象,读取图片数据源
     *          FileInputSteam
     *      4.读取图片,使用字节输出流,将图片写到服务器
     *        采用字节数组进行缓冲
     *      5.通过Socket套接字获取字节输入流
     *        读取服务器发回来的上传成功
     *      6.关闭资源
     */
    public class TCPClient {
        public static void main(String[] args) throws IOException {
            Socket socket=new Socket("127.0.0.1",8000);
            //获取字节输出流,图片写到服务器
            OutputStream out=socket.getOutputStream();
            //创建字节输入流,读取本机上的数据源图片
            FileInputStream fis=new FileInputStream("c:\a.jpg");
            //开始读写字节数组
            int len=0;
            byte[] bytes=new byte[1024];
            while((len=fis.read(bytes))!=-1){
                out.write(bytes,0,len);
            }
            //给服务器写终止序列,
            socket.shutdownOutput();
            //获取字节输入流,读取服务器的上传成功
            InputStream in=socket.getInputStream();
            len=in.read(bytes);//如果读完会处于一直等待,进入阻塞状态
            System.out.println(new String(bytes,0,len));
            
            fis.close();
            socket.close();
            
        
        }
    }

    服务端的代码  实现runnale接口方式

    package demo04;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.InputStream;
    import java.net.Socket;
    import java.util.Random;
    
    public class Upload implements Runnable{
        
        private Socket socket;
        
        public Upload(Socket socket){this.socket=socket;}
        
        public void run() {
            try{
            //通过客户端连接对象,获取字节输入流,读取客户端图片
            InputStream in=socket.getInputStream();
            //将母的文件夹封装发哦File对象
            File upload=new File("e:\upload");
            if(!upload.exists())
                upload.mkdirs();
            //创建字节输出流,将图片写入到母的文件中
            //规则:域名+毫秒值+6位随机数
            String filename="albb"+System.currentTimeMillis()+new Random().nextInt(999999)+".jpg";
            //创建字节输出流,将图片写入到目的文件夹中
            FileOutputStream fos=new FileOutputStream(upload+File.separator+filename);//separator跨平台的文件分隔符方法
            byte[] bytes=new byte[1024];
            int len=0;
            while((len=in.read(bytes))!=-1){
                fos.write(bytes,0,len);
            }
            
            //通过客户端对象获取字节输出流
            //上传成功写回客户端
            socket.getOutputStream().write("上传成功".getBytes());
            
            fos.close();
            socket.close();
            
            
            }catch(Exception e){
                
            }
            
        }
        
    
    }

    开启多线程的代码

    package demo04;
    
    import java.io.IOException;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class TCPThreadServer {
        public static void main(String[] args) throws IOException{
            ServerSocket server=new ServerSocket(8000);
            while(true){
            //获取到一个客户端,必须开启新线程
            Socket socket=server.accept();
            
            new Thread(new Upload(socket)).start();
            }
        }
    }
  • 相关阅读:
    kubernetes获取Pod内容器信息
    etcd空间配额2G限制优化
    kubernetes集群之GC处理
    kubernetes之statefulset控制器介绍
    基于MySQL Binlog的Elasticsearch数据同步实践
    Nacos
    Python最佳工程实践,建立一个完美的工程项目
    图数据库的内部结构 (NEO4j)
    5个用/不用GraphQL的理由
    Neo4J 查找两节点之间的路径
  • 原文地址:https://www.cnblogs.com/benjamin77/p/9147512.html
Copyright © 2011-2022 走看看