客户端选择某文件发送至客户端,客户端接收并保存。使用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("文件传输客户端");
}
}
联系客服