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();
            }
        }
    }
  • 相关阅读:
    能帮你找到网页设计灵感的16个网站
    [转]自定义SqlMembershipProvider方法
    C#实现的根据年月日计算星期几的函数
    分享一个我自己写的支持多条件组合查询的分页存储过程
    史上最强的福克斯遥控钥匙失灵解决方案(zt)
    在页面实现数据还原,在终止数据库进程时,报不能用kill来终结自己的进程
    ViewState使用兼谈序列化
    jQuery 的上传图片预览插件
    Asp.net 备份、还原Ms SQLServer及压缩Access数据库
    aspnet_Membership表的意义
  • 原文地址:https://www.cnblogs.com/benjamin77/p/9147512.html
Copyright © 2011-2022 走看看