简单实现文件在网络中的传输,要实现高级功能,在此基础上进行修改即可。
分2个类实现,FileSender负责文件发送,FileIncepter负责文件接受:
import java.io.BufferedInputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class FileSender { private ServerSocket ss = null; public FileSender() { } public void startSend(String filePath, int port) { // socket输出流 DataOutputStream os = null; // 文件输入流 DataInputStream is = null; // 建立socket连接 Socket socket = null; try { // 选择进行传输的文件 File file = new File(filePath); // 建立socket监听 ss = new ServerSocket(port); socket = ss.accept(); os = new DataOutputStream(socket.getOutputStream()); // 将文件名及长度传给客户端。这里要真正适用所有平台,例如中文名的处理,还需要加工, // 具体可以参见Think In Java 4th里有现成的代码。 os.writeUTF(file.getName()); os.flush(); os.writeLong((long) file.length()); os.flush(); is = new DataInputStream(new BufferedInputStream( new FileInputStream(filePath))); // 缓冲区大小 int bufferSize = 8192; // 缓冲区 byte[] buf = new byte[bufferSize]; // 传输文件 while (true) { int read = 0; if (is != null) { read = is.read(buf); } if (read == -1) { break; } os.write(buf, 0, read); } os.flush(); } catch (IOException e) { e.printStackTrace(); } finally { // 关闭所有连接 try { if (os != null) os.close(); } catch (IOException e) { } try { if (is != null) is.close(); } catch (IOException e) { } try { if (socket != null) socket.close(); } catch (IOException e) { } try { if (ss != null) ss.close(); } catch (IOException e) { } } } public static void main(String[] args) { new FileSender().startSend("E:\\JDK_API_1_6_zh_CN.CHM", 8821); } }
import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.FileOutputStream; import java.io.IOException; import java.net.Socket; import java.net.UnknownHostException; public class FileIncepter { public FileIncepter() { } public void getFile(String savePath, String ip, int port) { // 建立socket连接 Socket socket = null; try { socket = new Socket(ip, port); } catch (UnknownHostException e1) { e1.printStackTrace(); } catch (IOException e1) { e1.printStackTrace(); } // 建立socket输入流 DataInputStream inputStream = null; try { inputStream = new DataInputStream(new BufferedInputStream(socket .getInputStream())); } catch (IOException e1) { e1.printStackTrace(); } try { // 缓冲区大小 int bufferSize = 8192; // 缓冲区 byte[] buf = new byte[bufferSize]; int passedlen = 0; long len = 0; // 获取文件名称 savePath += inputStream.readUTF(); DataOutputStream fileOut = new DataOutputStream( new BufferedOutputStream(new BufferedOutputStream( new FileOutputStream(savePath)))); // 获取文件长度 len = inputStream.readLong(); System.out.println("文件的长度为:" + len + " KB"); System.out.println("开始接收文件!"); // 获取文件 while (true) { int read = 0; if (inputStream != null) { read = inputStream.read(buf); } passedlen += read; if (read == -1) { break; } System.out.println("文件接收了" + (passedlen * 100 / len) + "%"); fileOut.write(buf, 0, read); } System.out.println("接收完成,文件存为" + savePath); fileOut.close(); } catch (Exception e) { e.printStackTrace(); return; } } public static void main(String[] args) { new FileIncepter().getFile("F:\\", "localhost", 8821); } }