java 板


LINE

不好意思小弟又來發問了= =a 先跟上次很用心幫我的人說聲感謝(LaPass和tkcn兩位) 經過了一段時間的奮戰 我的整個程式大致底定 能傳檔案 能看目錄 但是卻有一個我不知道該怎嚜解決的地方 這是Client端實做put的程式碼 String filen = comm.substring(4,comm.length()); System.out.println(filen); File file = new File(filen); try { FileInputStream fos = new FileInputStream(file); OutputStream netOut = clientSocket.getOutputStream(); OutputStream doc = new DataOutputStream(new BufferedOutputStream(netOut)); byte[] buf = new byte[2048]; int num = fos.read(buf); while (num != ( - 1)) //是否讀完文件 { doc.write(buf, 0, num); //把文件資料寫出網絡緩衝區 doc.flush(); //重整緩衝區把資料寫往客戶端 num = fos.read(buf); //繼續從文件中讀取資料 } System.out.println("File "+ filen +" has been uploaded to FTPServer " + serverAddress); fos.close(); doc.close(); }catch(Exception e) { e.printStackTrace(); } } 以及Server端再Client打put時接收檔案的程式碼 String fileName = get.substring(4,get.length()); String l = inFromClient.readLine(); File file = new File(fileName); //如果文件已經存在,先刪除 if (file.exists()) file.delete();// int ts = 0; RandomAccessFile raf = new RandomAccessFile(file, "rw"); InputStream netIn = cs.getInputStream(); InputStream in =new DataInputStream(new BufferedInputStream(netIn)); // len =Long.parseLong(l) ; byte[] buf = new byte[2048]; while (true) //是否讀完所有資料 { int num = 0; if(in != null) { num = in.read(buf); } ts += num; if(ts == num) { break; } raf.write(buf, 0, num); //將資料寫往文件 } System.out.println("ftpserver>Client "+ clientAddressString+" has uploaded the file : " + fileName); comm = "";//初始化comm使他離開put執行 //in.close(); raf.close(); 這是新的Server 但是這樣子變成= =a 完全不會寫入檔案了orz 雖然有跑出那端成功上傳的話 但是實際上全部都卡在getInputStream了 雖然執行上可以讓client再輸入下一個指令 但是輸入第二個指令出現 NumberFormatException:test01put test02.txt 也就是我test01.txt裡的test01沒被丟進文件= =a 反而直接卡住了... 到底錯在哪裡呢ˊˋ ---------------------- 基本上兩段程式碼 經過測試 都是能成功傳送檔案無誤 但是問題卻出在最後的close這個東西上... 一但close掉 我要再傳送一次 就會出現socket is close的狀況 但是如果我不關掉 另外一端卻會無法接收結束 一直處於接收中的while迴圈裡出不來 EX: Clinet輸入put test01.txt Server接收到test01.txt (確實有傳送成功,因為我有故意加字在裡面去檢查) Client輸入put test02.txt 跳出錯誤說明寫著Socket is close 不知道要用什麼方法才能在不去close任何socket下 而能讓對面知道已經傳送完成並且結束接收回到等待指令輸入的狀態 有查到說可以試著先送出檔案大小 不過我實作後卻一直跑出啥Native method還啥的= =a 所以想請教眾版友是否知道如何避免使用close這段程式碼 --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.57.219.8
1F:→ tkcn:在開始傳檔案之前先傳個 "檔案大小" 吧,兩邊溝通好就行了 04/30 22:29
2F:→ twonia:所以是在while(num != -1)外面再包一個偵測檔案大小? 04/30 22:48
3F:→ twonia:還是說直接用file.setlength這函式強制設定他? 04/30 22:56
4F:→ tkcn:num!=-1 是在偵測 EOF,也就是斷線(close)時才會發生 04/30 23:07
5F:推 LaPass:我那時候很偷懶的使用ObjectStream,所以沒什麼問題.... 04/30 23:09
6F:→ LaPass:你現在問的這些,在之後我打算寫跨語言的連線時,就遇到了 04/30 23:11
7F:→ LaPass:那時候我的方法是開另外一條連線去傳。應該會有更好的方法 04/30 23:13
8F:→ twonia:while (file.length()< Long.parseLong(l)) 這樣失敗XD 04/30 23:14
9F:→ tkcn:只要定義好協定並讓兩端確實遵守就可以了,剩下就只是實作。 04/30 23:29
※ 編輯: twonia 來自: 61.57.219.8 (05/01 01:49)
10F:→ twonia:悲劇...作不出來...看了網路的寫法依舊失敗了= = 05/01 01:50
11F:→ twonia:Server的新程式碼已經補在上面原本Server的地方了QAQ 05/01 01:51
12F:→ twonia:結果都不是上述問題= =今天神來一筆解決了~晚點PO方法... 05/01 09:47







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:iOS站內搜尋

TOP