A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 戴振良 黑马帝   /  2012-4-18 08:03  /  3515 人查看  /  14 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 戴振良 于 2012-4-23 23:26 编辑

这是服务器端的代码:
  1. import java.io.*;
  2. import java.net.*;
  3. class Test
  4. {
  5.         public static void main (String[] args) throws Exception {
  6.                 ServerSocket ss = new ServerSocket(10008);
  7.                 Socket s = ss.accept();
  8.                 System.out.println(s.getInetAddress().getHostAddress() + "is connecting");
  9.                 PrintWriter out = new PrintWriter(s.getOutputStream(),true);
  10.                 out.println("客户端你好!");
  11.                 s.close();
  12.                 ss.close();
  13.         }
  14. }
复制代码
然后我运行了这个服务,接着我在IE输入:http://127.0.0.1:10008,回车,我重复了N次这样的操作,结果是只有一、两次在IE里输出了“客户端你好!”,如下图:

而很多次出现的结果却是,如下图:

而在我的服务器端,每次都会打印出连接成功如下图:


这是为什么捏???

14 个回复

倒序浏览
本帖最后由 戴振良 于 2012-4-18 08:16 编辑

神奇了,我在上面代码中的
  1. out.println("客户端你好!");
复制代码
在这代码的下面加了4句代码:
  1.         InputStream in = s.getInputStream();
  2.                 byte [] buf = new byte[5000];
  3.                 int len = in.read(buf);
  4.                 System.out.println(new String(buf,0,len));
复制代码
之后就每一次在IE访问后都能在IE出现 “客户端你好!”了,这到底是为什么呀??
回复 使用道具 举报
。。同样求高手解答
回复 使用道具 举报
打酱油可不可以 ,我表示无语。
回复 使用道具 举报
我的为什么不添加也不出错呢

点评

意思是你的每次都能看到IE里出现“客户端你好!”吗?  发表于 2012-4-18 15:16
回复 使用道具 举报
我有点不明白楼主的问题
你的Test.java 执行了几次?
如果是一次的话,只有第一浏览器访问的时候是通过你的的服务端把“客户端你好”打给浏览器的,后面的访问都是浏览器拿的它自己的缓存。于此同时,你的服务端接收完一次请求之后就调用close()f方法关闭了。当你关了当前浏览器,或者你换个浏览器的时候,浏览器里面的缓存就会被清除,你也就得不到第一次访问得到的那条信息了。

点评

当然是启动一次服务器端就在IE访问一次,我知道服务器端被访问一次就关掉了!您可以复制代码试一下。  发表于 2012-4-18 15:19
回复 使用道具 举报
李斌 中级黑马 2012-4-18 13:50:22
7#
回帖有奖励 围观一下 哈~
回复 使用道具 举报
刘基军 黑马帝 2012-4-18 13:56:01
8#
Writer内部有缓冲数组的,你在写完后,没有使用flush()刷新的话,它不会立即输出的,除非其缓存数组满了后,才会输出.
你的第一个代码中,也没有写: out.flush();
这就导致,你刷新了很多次,才会出现一次的现象.
而字节流没有缓存数组,会直接写到目的地.
----------------------------------------------------------个人观点,欢迎批评

点评

我用的是PrintWriter流,那个写到IE的数据用的是PrintWriter.println()方法,这个方法是会自动刷新缓冲区的,这就是我选择用这个流的原因,欢迎复制代码测试  发表于 2012-4-18 15:24
回复 使用道具 举报
学习中,拿钱
回复 使用道具 举报
两个我怎么试了都一样呢,没问题呀
回复 使用道具 举报
伊文龙 发表于 2012-4-18 13:32
我有点不明白楼主的问题
你的Test.java 执行了几次?
如果是一次的话,只有第一浏览器访问的时候是通过你的 ...

(⊙o⊙)…,遇到同样的问题了。。
回复 使用道具 举报
你那是不是浏览器缓存的问题啊。就那“客户端你好!”字符量也不算很大的啊,个人感觉加不加缓存语句看都可以的,你可以试试在后面加个输出时间语句,或者加个清除浏览器缓存的语句试试看,这样避免浏览器自己调用之前缓存的页面,或者其他错误页面。(试试看,嘿嘿ie,我没试的)

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 了无尘 于 2012-4-19 09:29 编辑

这个可能是浏览器的问题,代码用java客户端测试木有什么问题
像我这边的遨游会出现一个问题,使劲点刷新,然后就会出现根本没连服务器的问题,也就是说服务器这边没有接到连接请求
这可能浏览器的刷新导致的链接重置问题,关闭页面之后重新输入地址没有问题。
不过这都是猜测,呵呵

建议还是在写完数据之后对输出流flush一下,虽然不见得就有用
flush本身也只是提交委托,至于平台本身是否真的写完了,这个也没办法保证,如果你这边还没写完流就被关掉了也会出问题


回复 使用道具 举报
学长治学的态度让人敬佩啊,
我觉得可能跟浏览器载入速度有关吧,自定义个java客户端接收没任何问题。估计是因为浏览器连接上以后还没来及加载页面那边已经执行完并关闭了所以浏览器就没加载到数据,PrintWriter out = new PrintWriter(s.getOutputStream(),true);前面叫线程睡上个100毫秒左右浏览器就没问题了,具体睡多长时间估计和机器以及浏览器的性能有关。
学习了。
回复 使用道具 举报
看看...............
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马