📄 server.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 + -