打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
带进度条的简易文件传输

客户端选择某文件发送至客户端,客户端接收并保存。使用Socket进行连接,显示文件传送进程。

1.服务器端代码

package newFile;

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import javax.swing.*;

public class Server extends JFrame {


private JPanel filePanel;

private JButton sendButton;
private JProgressBar fileProgressBar;

ServerSocket socket;
Socket connectionsocket;
boolean isConnected;
int result;
String fileName; 
String filename;
   
public Server(String title) throws Exception{
   super(title);
   setLayout(new BorderLayout());

   sendButton = new JButton("Send");
   sendButton.addActionListener(new Send());
  
   fileProgressBar = new JProgressBar(0,100);
   fileProgressBar.setStringPainted(true);
  
   filePanel = new JPanel(new FlowLayout(FlowLayout.CENTER));

   filePanel.add(sendButton);
   getContentPane().add(filePanel,BorderLayout.NORTH);
   getContentPane().add(fileProgressBar,BorderLayout.SOUTH);
  
  
   setBounds(100,100,300,200);
   setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   setVisible(true);
       
   ServerSocket localsocket = new ServerSocket(8989);
   System.out.println("服务器已启动...");
   while(true){
   connectionsocket = localsocket.accept();
   isConnected = true;
   System.out.println("客户端已连接");
   } 
}
    
   class Send implements ActionListener{
   
    public void actionPerformed(ActionEvent e){
    
     if(isConnected == true){
     
      JFileChooser fc = new JFileChooser();
      result = fc.showOpenDialog(sendButton); 
      final File file = fc.getSelectedFile();
     
      Runnable runnable = new Runnable(){
       public void run(){
        int passed = 0;
       
        if(file!=null && result==JFileChooser.APPROVE_OPTION) 
        {  
         fileName = file.getAbsolutePath();          
         System.out.println("选择打开此文件: " +fileName);
         filename = file.getName();
         long filelength = file.length();
         System.out.println("文件长度:" + filelength);
         try 
         {
          File file1=new File(fileName); 
          FileInputStream fos=new FileInputStream(file1); 
                   
          OutputStream netOut=connectionsocket.getOutputStream(); 
          DataOutputStream doc=new DataOutputStream(new BufferedOutputStream(netOut));
          
          doc.writeLong(filelength);
          doc.flush();
                    
          byte[] buf=new byte[4096]; 
          int num=fos.read(buf); 
                           
          while(num!=(-1)) 
          {              
           passed += num;
           doc.write(buf,0,num); 
           doc.flush();
           num=fos.read(buf);
          
           System.out.println(passed);
           final int x = (int) (100*(passed/(double)filelength));
           
           SwingUtilities.invokeLater(new Runnable()
              {
             public void run()
             {
              fileProgressBar.setValue(x);
              fileProgressBar.setString(String.valueOf(x)+"%");
              System.out.println("已传输:"+x+"%");
             }
              });
          } 
          
          fos.close(); 
          doc.close(); 
         } 
         catch(Exception ex) 
         {
          System.out.println(ex); 
         } 
        
        } 
        if(result == JFileChooser.CANCEL_OPTION) {
        
        }       
       }
      };
         
     Thread thread = new Thread(runnable);
     thread.start();
     }
   }
}
         
public static void main (String[] args) throws Exception {
   // TODO Auto-generated method stub  
   new Server("文件传输服务器端");      
   }         
}

2.客户端代码

package newFile;

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import javax.swing.*;

public class Client extends JFrame{

private JPanel filePanel;
private JButton saveButton;
private JProgressBar fileProgressBar;

Socket socket;
private boolean isConnected ;

JFileChooser fc;
String fileName; 
String filename;
float filelength;
int result;
    
public Client(String title) throws Exception{
   super(title);
   setLayout(new BorderLayout());

   saveButton = new JButton("Receive");
   saveButton.addActionListener(new SaveFile());
  
   fileProgressBar = new JProgressBar(0,100);
   fileProgressBar.setStringPainted(true);
   
   filePanel = new JPanel(new FlowLayout(FlowLayout.CENTER));

   filePanel.add(saveButton);
   getContentPane().add(filePanel,BorderLayout.NORTH);
   getContentPane().add(fileProgressBar,BorderLayout.SOUTH);
    
   setBounds(100,100,300,200);
   setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   setVisible(true);
        
    socket = new Socket("localhost", 8989);
   System.out.println("已连接");
   isConnected = true;
}

class SaveFile implements ActionListener {
  
   public void actionPerformed(ActionEvent e){
    if (isConnected ==true){
    
     fc = new JFileChooser();
     result = fc.showSaveDialog(saveButton);
     File file1 = fc.getSelectedFile();
    
     fileName = file1.getAbsolutePath();
     System.out.println("fileName:"+fileName);
    
     if(file1!=null && result==JFileChooser.APPROVE_OPTION) 
     {
      Runnable run = new Runnable(){
       public void run()
       {
        try{
         File file2=new File(fileName);
         file2.createNewFile();
           
                 RandomAccessFile raf=new RandomAccessFile(file2,"rw");

                 InputStream netIn=socket.getInputStream();
                 DataInputStream in=new DataInputStream(new BufferedInputStream(netIn));

                 long filelength = in.readLong();
                 System.out.println("要接收的文件长度为"+filelength+"字节");
                 
                 byte[] buf=new byte[4096];
                 int num=in.read(buf);   
                 int passed = 0;
                 while(num!=(-1)){                                
                 raf.write(buf,0,num);
                     raf.skipBytes(num);
                     passed += num;
                     num=in.read(buf);
                   
                     final int x = (int) (100*(passed/(double)filelength));
                
                     SwingUtilities.invokeLater(new Runnable()
                        {
                     public void run()
                     {
                        fileProgressBar.setValue(x);
                        fileProgressBar.setString(String.valueOf (x)+"%");
         
                     }
                        });
                    
                 }
                 
                 in.close();
                 raf.close();
               
                 System.out.println("文件已收到");
                
        }
        catch(Exception ex) 
        {
        
        } 
       }
      };
     
      Thread t = new Thread(run);
      t.start();
     
     }
     if(result == JFileChooser.CANCEL_OPTION) {
      
     }    
    }
    isConnected = false;  
   }
}

public static void main(String[] args) throws Exception {
  
   new Client("文件传输客户端"); 
}
}

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
Java实现的断点续传功能
(5)用Oracle数据库存储图片文件
线程知识
干货分享|Java多线程面试知识点汇总(超详细总结)
初学者第63节之线程安全详解(五)
多线程下的锁
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服