⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 server.java

📁 飞鸽传书的源代码 快速的局域网传输软件
💻 JAVA
字号:
/*
 * Server.java
 *
 * Created on 2007年7月1日, 下午4:29
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package trans;

/**
 *
 * @author 鹏飞
 */
import java.awt.GridLayout;
import java.util.*;
import java.net.*;
import java.io.*;
import javax.swing.*;
public class Server implements  Runnable
{
       private boolean listenner;
       private Socket mySocket;
       private long totalSize;
       private String baseFile="DownLoad";
       private long fileSize;
       private String fileName;
       private long receiveSize;
       private long skipSize;
       private long receivedSize;
       public static boolean configed = false;
        Server(boolean listenner,Socket so)
        {
            this.listenner=listenner;
            mySocket=so;
        }
	public void run()
	{
            if(listenner)
            {
		try
		{
                    ServerSocket server=new ServerSocket( MainFrame.PORT );
                    while(true)
                    {
			Socket so=server.accept();
			Thread newThread=new Thread(new  Server(false,so));
                        newThread.setPriority(6);
                        newThread.start();
                    }
		}
		catch(Exception e) 
		{
			JOptionPane.showMessageDialog(null, e.getMessage() + this.getClass (),"错误", JOptionPane.ERROR_MESSAGE);
		}
            }
            else
            {            
               try
		{
                   long count ;
                   byte[] buffer=new byte[1024];
                   DataOutputStream out=new  DataOutputStream(mySocket.getOutputStream());
                   BufferedInputStream  inb=new BufferedInputStream(mySocket.getInputStream(),8192);
                   DataInputStream in=new  DataInputStream(inb);
                   ObjectInputStream oin = new ObjectInputStream( mySocket.getInputStream ());
                   ObjectOutputStream oout = new ObjectOutputStream ( mySocket.getOutputStream () );
                   Vector fileVector = ( Vector ) oin.readObject ();
                   configed = false;
                   fileSelect f = new fileSelect (fileVector,mySocket.getLocalAddress ().getHostName (),2 );
                   f.setLocationRelativeTo ( null );
                   f.setVisible ( true );
                   
                   //receive file
                   while ( !f.closed )
                   {
                       Thread.currentThread ().sleep(300);
                   }                   
                   oout.writeObject (fileVector ) ;
                   oout.flush ();
                   f.dispose ();
                   
                   totalSize = in.readLong();
                   int rSize ;
                   long KBSize = totalSize / 1024 + 1;
                  if( totalSize > 0 )
                   {
                       
                       JFrame frame = new JFrame();
                       frame.setTitle("接收文件");
                       JLabel lable1 = new JLabel();
                       JLabel lable2 = new JLabel();
                       JLabel lable3 = new JLabel();           
                       frame.add(lable1,"North");
                       //frame.add(lable2,"Center");
                       frame.add(lable3,"South");
                       receivedSize = 0;
                       String  Lmessage1="总共要接收:  "+String.valueOf(totalSize/1024)+"  KB";
                       String  Lmessage2="已接收:      "+String.valueOf(receivedSize/1024)+"  KB   "+ "速度: 0";
                       String  Lmessage3="正在接收文件:";
                       lable1.setText(Lmessage1);
                       lable2.setText(Lmessage2);
                       lable3.setText(Lmessage3);
                        JProgressBar bar = new JProgressBar ( 0 , (int)(totalSize/1024));
                        JProgressBar bar1 = new JProgressBar ();
                        bar.setForeground(new java.awt.Color(102, 255, 102));
                        bar.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(204, 204, 204)), "\u603b\u8fdb\u5ea6", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Dialog", 0, 13), new java.awt.Color(0, 0, 255)));
                        bar.setDoubleBuffered(true);
                        bar.setStringPainted ( true ) ;
                        bar1.setSize (320,20);
                        bar.setSize (320,20);
                        bar1.setForeground(new java.awt.Color(102, 255, 102));
                        bar1.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(204, 204, 204)), "当前进度", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Dialog", 0, 13), new java.awt.Color(0, 0, 255)));
                        bar1.setDoubleBuffered(true);
                        bar1.setStringPainted ( true );
                        JPanel jp = new JPanel();
                        jp.setLayout ( new GridLayout( 3 , 1 ));
    //                            jp.add ( new JLabel ("总进度:    "));
                        jp.add ( bar );
    //                            jp.add ( new JLabel( "当前进度:  " ));
                        jp.add ( bar1 );
                        jp.add ( lable2 );
                        frame.add ( jp );
                        
                       String answer="";
                       JFileChooser chooser = new JFileChooser();
                       chooser.setDialogTitle("保存文件");
                       chooser.setDialogType(javax.swing.JFileChooser.SAVE_DIALOG);
                       chooser.setFileSelectionMode(chooser.DIRECTORIES_ONLY);
                       int returnVal = chooser.showOpenDialog(null);
                       if(returnVal == JFileChooser.APPROVE_OPTION)
                                baseFile=chooser.getSelectedFile().getAbsolutePath();
                       else
                            JOptionPane.showMessageDialog(null, "文件将默认保存在:\r\n"
                                    + new File(baseFile).getAbsolutePath(),"提示", JOptionPane.DEFAULT_OPTION);
                       frame.setBounds(450,300,400,200);
                       frame.setResizable ( false );
                       frame.setVisible(true);
                       RandomAccessFile outFile;
                       long baseTime=new Date().getTime();
                       int fileNum = 0;
                       while( true )
                       {
                            count = 0;
                            skipSize = 0;
                            fileSize = in.readLong();
                            int locate =in.readInt();
                            byte [] fileRandom = new byte [10]; 
                            in.read ( fileRandom , 0 ,10 );
                            rSize = in.read(buffer);
                            
                            fileName = new String(buffer,0,rSize,"UTF-8");
                            jp.setToolTipText ( "正接收:" + fileName.substring ( 1 ) );
                            bar1.setMinimum ( 0 ) ;
                            bar1.setMaximum ((int) fileSize / 1024);
                            lable3.setText("已接收" + ( fileNum ++ ) + "个文件");
                            frame.setTitle ( "正在接收文件: " + fileName.substring ( 1 ) );
                            if(fileSize < 0 && "#发送完毕#".equals( fileName ) )
                                break;
                            File tempFile = new File( baseFile + fileName );
           
                            if( tempFile.exists() )
                           {
                                if( !compare ( locate , fileRandom ,tempFile ))
                                 {
                                      JOptionPane.showMessageDialog(null,"已包含与" + tempFile.getName()+
                                              "\r\n同名的文件,将重命名为:" + tempFile.getName()+".q","提示", JOptionPane.DEFAULT_OPTION);
                                      tempFile = new File(baseFile + fileName+".qiu");
                                      answer = "R";
                                      tempFile.getParentFile().mkdirs();
                                 }
                                 else 
                                 {
//                                    JOptionPane.showMessageDialog(null,tempFile.getName()+
//                                              "已存在","提示", JOptionPane.DEFAULT_OPTION);
                                  int option = JOptionPane.showOptionDialog (null,tempFile.getName()+"已存在","提示",JOptionPane.YES_NO_CANCEL_OPTION,JOptionPane.WARNING_MESSAGE,
                                        null, new String[]{"续传","覆盖","取消"}, null);
                                  if( option == JOptionPane.NO_OPTION )
                                  {
                                        tempFile.delete ();
                                        answer = "R";
                                        tempFile.getParentFile().mkdirs();
                                  }
                                  else if(option==JOptionPane.CANCEL_OPTION || tempFile.length() == fileSize )
                                 {
                                     answer = "S";
                                     receivedSize += fileSize;
                                     count = fileSize;
                                     bar.setValue ( ( int ) receivedSize / 1024 );
                                     bar1.setValue ( ( int )count / 1024 );
                                 }                     
                                 else 
                                 {
                                     if(tempFile.length() > 1024)
                                     {
                                        answer = "C";
                                        skipSize = tempFile.length()-1024;
                                        receivedSize += skipSize;
                                        count += skipSize;
                                        bar.setValue ( ( int )receivedSize / 1024 );
                                        bar1.setValue ( ( int )count / 1024 );
                                     }
                                     else answer = "R";
                                 }
                                 }
                                
                           }
                           else
                           {
                                answer = "R";
                                tempFile.getParentFile().mkdirs();
                           }
                            lable2.setText("速度: "+
                                                String.valueOf( receivedSize * 1000 / (new Date().getTime()-baseTime + 1) / 1024)+"  KB/s");
                           out.writeLong( skipSize );
                           byte data2[] = answer.getBytes("UTF-8");
                           out.write( data2 );
                           out.flush();
                          if(!"S".equals( answer ))
                          {
                                    outFile = new RandomAccessFile( tempFile, "rw" );
                                    if("R".equals(answer))receiveSize = fileSize;
                                    else
                                    {
                                       outFile.seek( skipSize );
                                       receiveSize = fileSize - skipSize;
                                    }
                                    while(receiveSize>0)
                                    {
                                        if(receiveSize>=1024)
                                        rSize=inb.read(buffer);
                                        else if(receiveSize<1024)
                                        {
                                            int tempSi=(int)receiveSize;
                                            rSize=in.read(buffer,0,tempSi);
                                        }
                                        receivedSize += rSize;
                                        count += rSize;
                                        bar.setValue ( ( int )receivedSize / 1024 );
                                        bar1.setValue ( ( int )count / 1024 );
                                        lable2.setText("速度: "+
                                                String.valueOf(receivedSize*1000 / ( new Date().getTime() - baseTime + 1) / 1024 )+"  KB/s");
                                        receiveSize -= rSize;
                                        outFile.write(buffer, 0, rSize);
                                    }
                                  //  System.out.println("leftsize:"+receiveSize);
                                    outFile.close();
                          }
                       }
                       frame.setVisible(false);
                       JOptionPane.showMessageDialog(null,"传送完成!","提示", JOptionPane.DEFAULT_OPTION);
                   }
                  else
                  {
                       String answer="N";
                       byte data[]=answer.getBytes("UTF-8");
                       out.write(data);
                  }
                   in.close();
                   out.close();
                   mySocket.close();
		}
		catch(Exception e) 
		{
			JOptionPane.showMessageDialog(null,"接收文件错误:"+e.getMessage(),"错误", JOptionPane.ERROR_MESSAGE);
		} 
            }
	}
        boolean compare ( int locate , byte [] b ,File file)
        {
         byte [] data = new byte [10];
         if ( locate == -1 )return false ;
         try
         {      
             RandomAccessFile rf = new RandomAccessFile(file,"r");
             rf.seek ( locate );
             rf.read ( data , 0 ,data.length);
             rf.close ();
         }
         catch (Exception e)
         {
             
         }
         for ( int i = 0 ; i < 10 ; i++)
         {
                if ( b[ i ] != data [i]) return false;
         }
         return true;
        }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -