Java 上傳文件 Socket類應用 多線程上傳 有註釋哈,上傳完請看看文件大小是否正常

由於Java上傳文件到服務器是流之間的相互流淌,所以文件名是個問題,我採用的首先把文件名傳到服務器,使用用戶上傳的文件名進行保存,

同時進行了文件覆蓋問題的操作,若是服務器存在同名文件,則重新命名後保存,這時有個問題!

就是在查找是否有重名文件時客戶端已經再上傳文件了,所以導致報錯不能到達想要的效果,

我採用的是在服務器查找重名文件時,使客戶端處於掛起狀態,

即服務器重命名完成後纔會給客戶頓返回一個標誌,收到標誌客戶端纔會進行上傳文件操作。

具體請看代碼哈,歡迎交流!

文件上傳使用的是:打印流,比較高效且自動刷新


import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;
import java.net.SocketException;

/**
 * 服務器線程類
 * 
 * @author kaifang
 * 
 */
public class ServerUp implements Runnable {
	private Socket socket = null;

	public ServerUp(Socket socket) {
		this.socket = socket;
	}

	@Override
	public void run() {
		BufferedOutputStream outputStream = null;
		try {
			System.out
					.println(socket.getInetAddress().getHostAddress() + " 連接");
			// 讀取傳過來的文件字節流對象,避免文件名重複覆蓋
			BufferedInputStream inputStream = new BufferedInputStream(
					socket.getInputStream());
			// 存儲上傳文件的文件夾
			File dir = new File("F:\\temp");
			if (!dir.exists()) {
				dir.mkdir();
			}
			// 讀取客戶端發過來的文件名
			int len = 0;
			byte[] bys = new byte[1024 * 10];
			len = inputStream.read(bys);
			String name = new String(bys, 0, len);
			File file = new File(dir, name);
			int count = 0;
			// 如果服務器存在此文件則重名命名
			while (file.exists()) {
				count++;
				file = new File(dir, name.replaceAll("(.+)\\.(.+)", "$1("
						+ count + "\\).$2"));
			}
			// 告知客戶端
			PrintStream writer = new PrintStream(socket.getOutputStream(), true);
			writer.write("ok".getBytes());
			System.out.println(file.getAbsolutePath());
			// 寫入文件到服務器字節流
			outputStream = new BufferedOutputStream(new FileOutputStream(file));
			// 循環讀寫文件到服務器
			while ((len = inputStream.read(bys)) != -1) {
				outputStream.write(bys, 0, len);
				outputStream.flush();
			}
			// 告知客戶端接收完畢
			writer.write("上傳成功!".getBytes());
			socket.shutdownOutput();
		} catch (SocketException se) {
			System.out.println("客戶端連接丟失!\n\t" + se.getMessage());
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			// 關閉資源
			if (outputStream != null) {
				try {
					outputStream.close();
					socket.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 服務器類
 * 
 * @author kaifang
 * 
 */
public class ServerSocketUp {

	public ServerSocketUp() {
		super();
		// TODO Auto-generated constructor stub
	}

	public static void main(String[] args) {
		System.out.println("服務器啓動。。。");
		getFiles();
		System.out.println("服務器關閉。。。");
	}

	public static void getFiles() {
		// 創建ServerSocket對象
		ServerSocket server = null;
		try {
			server = new ServerSocket(10001);
		} catch (IOException e1) {
			e1.printStackTrace();
		}
		Socket socket = null;
		while (true) {
			try {
				// 獲取服務器Socket對象
				socket = server.accept();
				new Thread(new ServerUp(socket)).start();
			} catch (IOException e) {
				e.printStackTrace();
			} finally {
//				try {
//					// 關閉服務器,一般不會關閉的
//					server.close();
//				} catch (IOException e) {
//					e.printStackTrace();
//				}
			}
		}
	}
}

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

/**
 * 客戶端類
 * 
 * @author kaifang
 * 
 */
public class SocketUp {
	public static void main(String[] args) {
		System.out.println("客戶端啓動。。。");
		upFiles();
		System.out.println("客戶端關閉。。。");
	}

	public static void upFiles() {
		Socket socket = null;
		BufferedInputStream inputStream = null;
		try {
			// 連接遠程主機
			socket = new Socket(InetAddress.getLocalHost(), 10001);
			// 讀取本地文件的字節流
			// File file = new File("F:\\Nano\\歲月的童話1.rmvb");
			// File file = new File("aa.jpg");
			File file = new File("cpy.mp3");
			if (file.exists()) {
				inputStream = new BufferedInputStream(new FileInputStream(file));
				// 通過Socket獲取輸出字節流
				PrintStream writer = new PrintStream(socket.getOutputStream(),
						true);
				// 首先發送文件名到服務器
				writer.write(file.getName().getBytes());
				// 接收服務器回饋
				BufferedInputStream reader = new BufferedInputStream(
						socket.getInputStream());
				byte[] bys = new byte[1024 * 10];
				int len = 0;
				len = reader.read(bys);
				String flag = new String(bys, 0, len);
				if ("ok".equals(flag)) {
					// 循環讀取文件併發送
					while ((len = inputStream.read(bys)) != -1) {
						writer.write(bys, 0, len);
					}
					// 告知服務器上傳完畢
					socket.shutdownOutput();
					// 接收服務器回饋
					len = reader.read(bys);
					System.out.println(new String(bys, 0, len));
				}
			} else {
				System.out.println("文件不存在!");
			}
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			// 關閉資源
			if (inputStream != null) {
				try {
					inputStream.close();
					socket.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章