基于TCP方式的二进制文件传输
一个基于Java Socket协议之上文件传输的完整示例,基于TCP通信完成。
除了基于TCP的二进制文件传输,还演示了JAVA Swing的一些编程技巧,Demo程序
实现主要功能有以下几点:
1. 基于Java Socket的二进制文件传输(包括图片,二进制文件,各种文档work,
PDF)
2. SwingWorker集合JProgressBar显示实时传输/接受完成的百分比
3. 其它一些Swing多线程编程技巧
首先来看一下整个Dome的Class之间的关系图:
下面按照上图来详细解释各个类的功能与代码实现:
服务器端:
FileTransferServer类的功能首先是在端口9999创建一个服务器套接字并
开始监听连接。相关代码如下:
[java] view plaincopy
private void startServer(int port) {
try {
serverSocket = new ServerSocket(port);
System.out.println("Server started at port :" + port);
while(true) {
Socket client = serverSocket.accept(); // blocked & waiting for income socket
System.out.println("Just connected to " + client.getRemoteSocketAddress());
FileReceiveTask task = new FileReceiveTask(client);
bar.setValue(0); // reset it now
task.addPropertyChangeListener(new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
if ("progress".equals(evt.getPropertyName())) {
bar.setValue((Integer) evt.getNewValue());
}
}
});
task.execute();
}
} catch (IOException e) {
e.printStackTrace();
}
}
关于PropertyChangeListener, Java提供了一个非常有力的工具类来
监控任意Bean Model的数据改变,程序通过添加该监听器实现对
SwingWorker的progress属性值改变的事件捕获,然后更新JProgressBar
实例对象,实现了UI的刷新。FileTransferServer类的完整源代码如下:
[java] view plaincopy
package com.gloomyfish.socket.tutorial.filetransfer;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.IOException;
import http://www.wendangwang.com.ServerSocket;
import http://www.wendangwang.com.Socket;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
im
port javax.swing.JPanel;
import javax.swing.JProgressBar;
public class FileTransferServer extends JFrame implements ActionListener {