Re: [J2SE] Socket getInputStream
※ 引述《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
推
11/09 16:59, , 1F
11/09 16:59, 1F
推
11/09 17:12, , 2F
11/09 17:12, 2F
→
11/09 17:48, , 3F
11/09 17:48, 3F
→
11/09 17:50, , 4F
11/09 17:50, 4F
→
11/09 17:55, , 5F
11/09 17:55, 5F
推
11/09 18:44, , 6F
11/09 18:44, 6F
推
11/09 18:49, , 7F
11/09 18:49, 7F
→
11/10 00:32, , 8F
11/10 00:32, 8F
→
11/10 00:56, , 9F
11/10 00:56, 9F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 3 之 3 篇):