• java★Socket文件上传/进度条


    客户端代码:
     
    1、客户端运行程序:
    package wtb.khd;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.io.DataOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.OutputStream;
    import java.net.Socket;
    import javax.swing.JButton;
    import javax.swing.JLabel;
    import javax.swing.JProgressBar;
    public class KHD{
     private boolean isnoClose = true;
     public boolean isIsnoClose() {
      return isnoClose;
     }
     public void setIsnoClose(boolean isnoClose) {
      this.isnoClose = isnoClose;
     }
     public static void main(String args[]){
      final KHD khd = new KHD();
      String filePath = "D:\\文件.zip";
      khd.setIsnoClose(true);
      File upload = new File(filePath);
      long fileLength = upload.length();
      String fileName = upload.getName();
      try {
       Socket client = null;
       client = new Socket("localhost",8888); //"localhost"--->服务器端IP
       OutputStream out = client.getOutputStream();
       DataOutputStream dos = new DataOutputStream(out);
       dos.writeUTF("文件名前缀_"+fileName);
       dos.writeLong(fileLength);
       FileInputStream fis = new FileInputStream(upload);
       byte[] buffer = new byte[2048];
       int len = 0;
       double scbl = 0; //文件上传比例
       int scdx = 0;  //文件上传大小
       final JinDuBar jdb = new JinDuBar("文件上传",System.getProperty("user.dir")+"\\bin\\image\\jindutiao.gif");
       String[] uploadInfo = new String[]{"正在上传文件:" + filePath, "文件名称:"+ fileName,
         "上传文件大小:"+fileLength+"字节", "已上传:0字节", "上传比例:0%"};
       JLabel[] labels = jdb.getLabels();
       for(int lxb = 0; lxb<labels.length; lxb++){
        labels[lxb].setText(uploadInfo[lxb]);
       }
       JProgressBar p = jdb.getProgress();
       JButton closeBtn = jdb.getCloseBtn();
       
       closeBtn.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent ae) {
         jdb.dispose();
         khd.setIsnoClose(false);
        }
       });
       while ((len = fis.read(buffer)) > 0 && khd.isnoClose) {
        Thread.sleep(100);
        scdx += len;
        scbl = (double)scdx/fileLength;
        int bl = (int)(scbl*100);
        dos.write(buffer, 0, len);
        p.setValue(bl);
        p.setString(bl+"%");
        String[] gxsc = new String[]{"已上传:"+scdx+"字节", "上传比例:"+bl+"%"};
        for(int lxb = 0; lxb<gxsc.length; lxb++){
         labels[lxb+3].setText(gxsc[lxb]);
        }
       }
       jdb.dispose();
       out.close();
       fis.close();
       client.close();
      } catch (Exception e1) {
       e1.printStackTrace();
      }
     }
    }
     
    /****************************/
    2、进度条
    package wtb.util;
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Cursor;
    import java.awt.Dimension;
    import java.awt.GridLayout;
    import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JProgressBar;
    import javax.swing.JWindow;
    @SuppressWarnings("serial")
    public class JinDuBar extends JWindow{
     private JProgressBar progress;
     private JButton btn;
     private JLabel[] labels = new JLabel[5];
     private JButton closeBtn;
     public JProgressBar getProgress() {
      return progress;
     }
     public void setProgress(JProgressBar progress) {
      this.progress = progress;
     }
     public JButton getBtn() {
      return btn;
     }
     public void setBtn(JButton btn) {
      this.btn = btn;
     }
     public JLabel[] getLabels() {
      return labels;
     }
     public void setLabels(JLabel[] labels) {
      this.labels = labels;
     }
     public JButton getCloseBtn() {
      return closeBtn;
     }
     public void setCloseBtn(JButton closeBtn) {
      this.closeBtn = closeBtn;
     }
     public JinDuBar(String title,String bgImg){
      setAlwaysOnTop(true);
      setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
      JPanel splash = new JPanel(new BorderLayout());
      JPanel top = new JPanel();
      top.setBackground(new Color(255,153,204));
      BorderLayout toplay = new BorderLayout();
      top.setLayout(toplay);
      JLabel tt = new JLabel(title);
      ImageIcon cloImg = new ImageIcon(System.getProperty("user.dir") + "/bin/image/4.png");
      closeBtn = new JButton("close ",cloImg);
      closeBtn.setBackground(new Color(255,153,204));
      top.add(tt, BorderLayout.CENTER);
      top.add(closeBtn, BorderLayout.EAST);
      top.add(new JLabel("   "), BorderLayout.WEST);
      splash.add(top,BorderLayout.NORTH);
      ImageIcon img = new ImageIcon(bgImg);
      btn = new JButton(img);
      getLayeredPane().add(btn, new Integer(Integer.MIN_VALUE));
            btn.setBounds(0,0,img.getIconWidth(),img.getIconHeight());
            GridLayout gl = new GridLayout(this.getLabels().length,1); //labels.length行1列
            btn.setLayout(gl);
            for(int i = 0; i<labels.length; i++){
             this.getLabels()[i] = new JLabel("000"+i);
             btn.add(labels[i]);
            }
      splash.add(btn, BorderLayout.CENTER);
      progress = new JProgressBar(1, 100);
      progress.setStringPainted(true);
      progress.setBorderPainted(false);
      progress.setString("0%");
      progress.setBackground(Color.WHITE);
      splash.add(progress, BorderLayout.SOUTH);
      setContentPane(splash);
      Dimension screen = getToolkit().getScreenSize();
      setSize(img.getIconWidth(), img.getIconHeight()+60);
      setLocation((screen.width - getSize().width)/2, (screen.height - getSize().height)/2);
      new DragJWindow(this, splash);  //设置窗口可拖动
      setVisible(true);
     }
    }
    /********************************/
    3、设置Window窗口可拖动
    package wtb.util;
    import javax.swing.SwingUtilities;
    import java.awt.Component;
    import java.awt.Point;
    import java.awt.Window;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import java.awt.event.MouseMotionAdapter;
    public class DragJWindow {
        private Window fWindow;
        private Component fComponent;
        private int dX;
        private int dY;
        public DragJWindow(Window window, Component component) {
            fWindow = window;
            fComponent = component;
            fComponent.addMouseListener(createMouseListener());
            fComponent.addMouseMotionListener(createMouseMotionListener());
        }
        private MouseListener createMouseListener() {
            return new MouseAdapter() {
                @Override
                public void mousePressed(MouseEvent e) {
                    Point clickPoint = new Point(e.getPoint());
                    SwingUtilities.convertPointToScreen(clickPoint, fComponent);
                    dX = clickPoint.x - fWindow.getX();
                    dY = clickPoint.y - fWindow.getY();
                }
            };
        }
        private MouseMotionAdapter createMouseMotionListener() {
            return new MouseMotionAdapter() {
                @Override
                public void mouseDragged(MouseEvent e) {
                    Point dragPoint = new Point(e.getPoint());
                    SwingUtilities.convertPointToScreen(dragPoint, fComponent);
                    fWindow.setLocation(dragPoint.x - dX, dragPoint.y - dY);
                }
            };
        }
    }
    /******************************************/
    /******************************************/
    服务器端:
    1、服务器端运行程序
    package wtb.fwq;
    import java.net.ServerSocket;
    import java.net.Socket;
    import wtb.fwq.UploadThread;
    public class UploadServer {
     public final static String fileDir = "E:\\wtb";
     public static void main(String args[]) throws Exception {
      ServerSocket server = null ;
      Socket client = null ;
      server = new ServerSocket(8888);
      while(true){
       client = server.accept();
       //为每个用户设置一个线程
       UploadThread uft = new UploadThread(client, fileDir);
       new Thread(uft).start();
      }
     }
    }
     
    /*************************************/
    2、为每个用户设置一个线程的线程类
    package wtb.fwq;
    import java.io.DataInputStream;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.InputStream;
    import java.net.Socket;
    public class UploadThread implements Runnable {
     private Socket client;
     private String fileDir;
     private String fileName;
     public UploadThread(Socket client, String fileDir){
      this.client = client;
      this.fileDir = fileDir;
     }
     public void run(){
      InputStream in = null ;
      FileOutputStream fos = null;
      try {
       in = client.getInputStream();
       DataInputStream dis = new DataInputStream(in);
       fileName = dis.readUTF();
       long fileLength = dis.readLong();
       long xzdx = 0;
       fos = new FileOutputStream(fileDir+File.separator+fileName);
       byte[] buffer = new byte[1024];
       int len = 0;
       while ((len = dis.read(buffer)) > 0)
       {
        fos.write(buffer, 0, len);
        xzdx += len;
       }
       fos.flush();
       fos.close();
       in.close();
       client.close() ;
       if(xzdx != fileLength){  //如果文件未传完,则删除传到服务器端的文件
        File f = new File(fileDir+File.separator+fileName);
        f.delete();
       }
      }catch(Exception e){
       System.out.println("异常!!!!");
      }
     }
    }
    /************************/
    运行结果视图:

     

  • 相关阅读:
    java——多线程回调函数
    JAVA四种引用
    史上最简单的 SpringCloud 教程
    javaWeb防止恶意登陆或防盗链的使用
    Spring缓存注解@Cacheable,@CacheEvict,@CachePut的使用
    SpringBoot RedisCacheConfig自定义设置
    Java性能分析神器-JProfiler详解(转)
    SpringBoot自动配置的实现原理
    python 处理Excel 常见问题-读取Excel中时间,封装函数
    Excel文件转换为txt文本第一次更新
  • 原文地址:https://www.cnblogs.com/momi/p/2390310.html
Copyright © 2020-2023  润新知