檔案上傳的阻塞狀態
阿新 • • 發佈:2020-12-23
最近複習Java基礎中的網路程式設計,好多東西忘記了。導致遇見一個小坑,分享出來。
我們知道Java中提供了Socket套接字類來實現網路資料傳輸。
定義客戶端
public static void main(String[] args) throws IOException {
FileInputStream fs = new FileInputStream("src/com/kang/Updata/abc.jpg");
Socket sk = new Socket("127.0.0.1", 8887 );
OutputStream sos = sk.getOutputStream();
int len=0;
byte [] bytes= new byte[1024];
while ((len = fs.read(bytes))!= -1) {
sos.write(bytes,0,len);
}
sk.shutdownOutput();
System.out.println("客戶端寫完");
//用socket的輸入流物件,讀取服務端給客戶端寫入的資料
InputStream sis = sk.getInputStream();
while ((len = sis.read(bytes) )!= -1) {
System.out.println( new String(bytes,0,len));
}
fs.close();
sk.close();
}
**定義伺服器類**
public static void main(String[] args) throws IOException {
//建立服務端物件
ServerSocket ssk = new ServerSocket(8887);
File file = new File("d:\\updata");
if (!file.exists()) {
file.mkdir();
}
Socket accept = ssk.accept();
//接受socket輸入流
InputStream is = accept.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
String fileName="com.kang"+System.currentTimeMillis()+ new Random().nextInt();//防止重名
FileOutputStream fos = new FileOutputStream(file+"\\"+fileName+".jpg");// 加上兩個\\表示路徑分割
int len=0;
byte [] bytes=new byte[1024];
while (( bis.read())!=-1){
fos.write(bytes,0,len);
}
//接受socket輸出流,回寫資料給客戶端
accept.getOutputStream().write("上傳成功了".getBytes());
fos.close();
accept.close();
}
我們知道一個檔案的上傳就是下面這種程式碼
while ((len = fs.read(bytes))!= -1) {
sos.write(bytes,0,len);
}
用個輸入流去讀檔案,給socket的輸出流寫檔案。
關鍵在於這個socket的輸出流就寫不到檔案結束的那個字元
導致了在伺服器的程式碼
while (( bis.read())!=-1){
fos.write(bytes,0,len);
}
這個while迴圈一直在死迴圈,因為讀不到結束
而客戶端也休想得到服務端的回寫,這下好了,兩個人就一直等吧。
但是問題也好解決,直接在客戶端自己新增寫完標準就好了,具體是呼叫socket的shutdownOutput()方法,表明自己已經寫完了。
也就是下面這樣
while ((len = fs.read(bytes))!= -1) {
sos.write(bytes,0,len);
}
sk.shutdownOutput();
ok問題解決