利用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("异常!!!!");
  }
 }
}
/************************/

运行结果视图:
 

 

时间: 2024-09-14 02:57:41

利用java Socket文件上传/进度条实现代码的相关文章

asp.net 文件上传进度条实现代码

asp教程.net 文件上传进度条实现代码 index.htm就是文件上传页面,提交form给uploadhandler目录下的default.aspx,以实现文件上传. progresshandler目录下三个文件为abort.ashx.genericguid.ashx,handler.ashx功能分别为:根据guid取消正在上传的文件,生成guid,根据guid获取上传信息. 第一步:建立index.htm页面,这个上传页面,需要注意的就是需要一个隐藏的iframe,并且名字为form提交的

文件上传进度条php代码

目前我知道的方法有两种,一种是使用php的创始人 rasmus lerdorf 写的apc扩展模块来实现(http://pecl.php.net/package/apc),另外一种方法是使用pecl扩展模块uploadprogress实现(http://pecl.php.net/package/uploadprogress) 我这里举两个分别实现的例子供参考,更灵活的应用根据自己需要来修改. apc实现方法: 安装apc,参照官方文档安装,可以使用pecl模块安装方法快速简捷,这里不说明 配置p

PHP利用APC模块实现文件上传进度条的方法_php技巧

本文实例讲述了PHP利用APC模块实现文件上传进度条的方法.分享给大家供大家参考.具体分析如下: 以前的php5.2之前的版本是不能可使用APC模块的,因为之前的压根就没有这个APC模块,如果想使用APC模块实现上传进度条我们必须是php5.2或更高版本. 从5.2开始APC加入了一个叫APC_UPLOAD_PROGRESS的东东,解决了困扰大家已久的进度条问题.并且它把原来的上传时把临时文件全部缓存到内存改成了当临时文件达到设定值时就自动保存到硬盘,有效地改善了内存利用状况. 它的作用原理是在

HTML5 Ajax文件上传进度条如何显示_AJAX相关

原本打算使用jquery插件进行异步文件上传,比如uploadfy但是需要额外的支持,也有人用iframe模仿异步上传机制,感觉都比较别扭.因为项目不考虑低版本浏览器,所以决定用html5实现.下面只是一个简单的demo,具体样式需要自己去做. 后台基于strut2进行文件处理,具体因项目而定.只是要注意设置文件大小的限制.  <constant name="struts.multipart.maxSize" value="52428800"/>这个配置

PHP中使用Session配合Javascript实现文件上传进度条功能_php技巧

Web应用中常需要提供文件上传的功能.典型的场景包括用户头像上传.相册图片上传等.当需要上传的文件比较大的时候,提供一个显示上传进度的进度条就很有必要了. 在PHP 5.4以前,实现这样的进度条并不容易,主要有三种方法: 1.使用Flash, Java, ActiveX 2.使用PHP的APC扩展 3.使用HTML5的File API 第一种方法依赖第三方的浏览器插件,通用性不足,且易带来安全隐患.不过由于Flash的使用比较广泛,因此还是有很多网站使用Flash作为解决方案. 第二种方法的不足

PHP Session和Javascript实现文件上传进度条

在PHP 5.4以前,实现这样的进度条并不容易,主要有三种方法: 1.使用Flash, Java, ActiveX 2.使用PHP的APC扩展 3.使用HTML5的File API 第一种方法依赖第三方的浏览器插件,通用性不足,且易带来安全隐患.不过由于Flash的使用比较广泛,因此还是有很多网站使用Flash作为解决方案. 第二种方法的不足在于,它需要安装PHP的APC扩展库,要求用户能够控制服务器端的配置.另外,如果安装APC仅仅是为了实现一个上传进度条,那么显然有点杀鸡用牛刀的意思. 第三

ajax文件上传进度条

ajax文件上传进度条页面:progressBar.jsp <%@ page contentType="text/html; charset=GBK" %> <html> <head> <title> Ajax进度条 </title> <script type="text/javascript"> //xmlHttpRequest对象 var xmlHttp; var key; //进度条颜色

服务器-我这样做asp.net异步文件上传进度条

问题描述 我这样做asp.net异步文件上传进度条 前台两个请求 1.上传文件的请求 2.获取上传进度的请求 1. $("#ufrm").ajaxSubmit({ url: "ReceivFile.ashx", type: "post", success: function (data) { ... 2. $.ajax({ type: "post", url: "Filepro.aspx", data: {

php ajax实现文件上传进度条_php技巧

本实例是关于php文件上传时进度条的实现,主要采用ajax技术,另外还运用了html5,有需要的朋友可以研究一下. 本实例有两个文件: upload_form.html: <!DOCTYPE html> <html> <head> <script> function _(el){ return document.getElementById(el); } function uploadFile(){ var file = _("file1"