由於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();
}
}
}
}
}