黑马程序员技术交流社区

标题: 关于网络编程的问题 [打印本页]

作者: 戴振良    时间: 2012-4-18 08:03
标题: 关于网络编程的问题
本帖最后由 戴振良 于 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里输出了“客户端你好!”,如下图:

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

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


这是为什么捏???
作者: 戴振良    时间: 2012-4-18 08:15
本帖最后由 戴振良 于 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出现 “客户端你好!”了,这到底是为什么呀??
作者: 朱鹏举    时间: 2012-4-18 11:47
。。同样求高手解答
作者: 邱俊杰    时间: 2012-4-18 12:51
打酱油可不可以 ,我表示无语。
作者: 张明星    时间: 2012-4-18 13:20
我的为什么不添加也不出错呢
作者: 伊文龙    时间: 2012-4-18 13:32
我有点不明白楼主的问题
你的Test.java 执行了几次?
如果是一次的话,只有第一浏览器访问的时候是通过你的的服务端把“客户端你好”打给浏览器的,后面的访问都是浏览器拿的它自己的缓存。于此同时,你的服务端接收完一次请求之后就调用close()f方法关闭了。当你关了当前浏览器,或者你换个浏览器的时候,浏览器里面的缓存就会被清除,你也就得不到第一次访问得到的那条信息了。
作者: 李斌    时间: 2012-4-18 13:50
回帖有奖励 围观一下 哈~
作者: 刘基军    时间: 2012-4-18 13:56
Writer内部有缓冲数组的,你在写完后,没有使用flush()刷新的话,它不会立即输出的,除非其缓存数组满了后,才会输出.
你的第一个代码中,也没有写: out.flush();
这就导致,你刷新了很多次,才会出现一次的现象.
而字节流没有缓存数组,会直接写到目的地.
----------------------------------------------------------个人观点,欢迎批评
作者: 韩新凯    时间: 2012-4-18 15:23
学习中,拿钱
作者: 韩新凯    时间: 2012-4-18 15:26
两个我怎么试了都一样呢,没问题呀
作者: 伊文龙    时间: 2012-4-18 15:42
伊文龙 发表于 2012-4-18 13:32
我有点不明白楼主的问题
你的Test.java 执行了几次?
如果是一次的话,只有第一浏览器访问的时候是通过你的 ...

(⊙o⊙)…,遇到同样的问题了。。
作者: 褚代江    时间: 2012-4-18 16:04
你那是不是浏览器缓存的问题啊。就那“客户端你好!”字符量也不算很大的啊,个人感觉加不加缓存语句看都可以的,你可以试试在后面加个输出时间语句,或者加个清除浏览器缓存的语句试试看,这样避免浏览器自己调用之前缓存的页面,或者其他错误页面。(试试看,嘿嘿ie,我没试的)
作者: 刘蕴学    时间: 2012-4-19 09:24
本帖最后由 了无尘 于 2012-4-19 09:29 编辑

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

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



作者: 王宝康    时间: 2012-7-16 23:58
学长治学的态度让人敬佩啊,
我觉得可能跟浏览器载入速度有关吧,自定义个java客户端接收没任何问题。估计是因为浏览器连接上以后还没来及加载页面那边已经执行完并关闭了所以浏览器就没加载到数据,PrintWriter out = new PrintWriter(s.getOutputStream(),true);前面叫线程睡上个100毫秒左右浏览器就没问题了,具体睡多长时间估计和机器以及浏览器的性能有关。
学习了。
作者: 徐传任    时间: 2012-9-19 19:40
看看...............




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2