作者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
1F:推 AmosYang:期待 LMRTFMFY.com 的出现… XD 11/09 16:59
2F:推 godfat:我又笑了 XDDDD 是不是还要有 LMWTFCFY.com 11/09 17:12
3F:→ AmosYang:(叉题) 事实上 LMWTFCFY.com / LMDTFCFY.com 或许还蛮有 11/09 17:48
4F:→ AmosYang:(搞笑)潜力的; LMRTFMFY.com 在技术上一下想不到该怎麽作 11/09 17:50
5F:→ godfat:比方说把传进去的文字用语音读出来...XD 不知 D 是哪个字? 11/09 17:55
6F:推 slalala:非常感谢 这篇对我受益良多 11/09 18:44
7F:推 slalala:事实上我今天早上的解法也是约定一个终止符号ORZ 11/09 18:49
8F:→ AmosYang: 'D'ebug XD 11/10 00:32
9F:→ godfat:看来是我太久没在板上debug了...XD一时只想到draw, display 11/10 00:56