作者qrtt1 (null)
看板java
標題Re: [J2SE] Socket getInputStream
時間Mon Nov 9 10:30:12 2009
※ 引述《slalala (no car ,no girlfriend )》之銘言:
: sktReader = new BufferedReader(new InputStreamReader(skt.getInputStream()));
: String message;
: StringBuffer sb = new StringBuffer();
: while((message = sktReader.readLine()) != null) {
: sb.append(message);
: }
: //讀完了 可是沒辦法到這邊 DEBUG時 確定卡在迴圈
: System.out.println("到這邊阿 打我阿笨蛋!");
: 請問這是什麼回事? 之前寫text file 讀寫都沒碰過這樣的問題
: 剛剛嘗試用read的方式 讀出字元
: 也是一樣 無法判斷 讀出來的int是否為-1
: 是不是socket有一些特性我沒釐清qq?
: 煩請板上的高手教化我一下orz
遇到問題「為什麼沒有 null 或 -1 出現」,
您該在 google 之前先查手冊,
http://java.sun.com/j2se/1.4.2/docs/api/java/io/
BufferedReader.html
#readLine%28%29
<%
Returns:
A String containing the contents of the line,
not including any line-termination characters,
or
null if the end of the stream has been reached
%>
http://java.sun.com/j2se/1.4.2/docs/api/java/io/
Reader.html#read%28char[],%20int,%20int%29
<%
Returns:
The number of characters read,
or
-1 if the end of the stream has been reached
%>
手冊說明了, null 或 -1 出現的條件。
另外,您提到良葛格檔案讀寫的範例,
我試著找一下:
http://caterpillar.onlyfun.net/Gossip/JavaGossip-V2/
BufferedReaderWriter.htm
他有提到:
<%
下次這個程式示範了BufferedReader與BufferedWriter的使用,
您可以在文字模式下輸入字元,程式會將您輸入的文字儲存至指
定的檔案中,如果要結束程式,null的判斷則依平台而有所不同
,在UNIX-Like平台下,使用Ctrl+d 字元作為讀取結束或檔案結
束,在 Windows之下,則是在使用者按下Enter鍵後,接著Ctrl+
z表示讀取結束或檔案結束
%>
因為範例使用的是 System.in 作為輸入來源,
它不是一般的檔案,不會讀完後遇上檔案結束的符號。
因此,您需要自己製造這樣的符號。
到目前為止,至少能規納一些注意到的事:
1. 沒有遇到串流的終點,所以不會有 null 或 -1 出現
2. 能否自己製造串流的終點呢?
事實上,當 client 結束連線的時候,您會遇到 null
http://pastie.org/689598 (test sample)
所以,您可以透過在 client 端呼叫 close() 來產生 null。
大致探索完滿足 end of stream 的情況後,
您得回到您正在處理的問題:
1. 目前的方式滿足你的需要:client 應該要主動關閉。
2. 目前的方式不符您的需要:client 不應該主動關閉。
您的需要為 1. 時,那麼 client.close() 就完成了。
您的需要為 2. 時,那麼您就不該以下列式子做為終止條件:
((message = sktReader.readLine()) != null)
您應該由 client 送來的內容作為判斷,
可以參考前一篇版友回應的:
http://stackoverflow.com/questions/1577719/
java-sockets-bufferedreader-and-readline-hang
http://tinyurl.com/yckcfqu
文中之到,以 Http Client 為例,
您可以在 Request Header 加上 Connection: close。
要求 Server 端處理完畢後結束連線。
雖然您的情況是相反的(您寫Server),但方式是一致的
「約定一個作為處理結束的符號」
=========================================================
今天怎麼突然多話了起來呢?
上一篇 Let Me Google For You 雖然有答案,
但是,弟覺得在 Google 找解答前,
我們有該先讀閱的手冊,亦有該先自我思考、歸納的材料
順便分享一下文章:
對自己好一些:談技術手冊閱讀
http://blog.linux.org.tw/~jserv/archives/002008.html
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.165.131
推 AmosYang:期待 LMRTFMFY.com 的出現… XD 11/09 16:59
推 godfat:我又笑了 XDDDD 是不是還要有 LMWTFCFY.com 11/09 17:12
→ AmosYang:(叉題) 事實上 LMWTFCFY.com / LMDTFCFY.com 或許還蠻有 11/09 17:48
→ AmosYang:(搞笑)潛力的; LMRTFMFY.com 在技術上一下想不到該怎麼作 11/09 17:50
→ godfat:比方說把傳進去的文字用語音讀出來...XD 不知 D 是哪個字? 11/09 17:55
推 slalala:非常感謝 這篇對我受益良多 11/09 18:44
推 slalala:事實上我今天早上的解法也是約定一個終止符號ORZ 11/09 18:49
→ AmosYang: 'D'ebug XD 11/10 00:32
→ godfat:看來是我太久沒在板上debug了...XD一時只想到draw, display 11/10 00:56