黑马程序员技术交流社区

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

作者: 李啸    时间: 2012-5-20 03:02
标题: 关于网络编程的两个问题

有两个疑问
第一个-->TCP协议是通过三次握手建立连接 途中我只在浏览器中访问了一次而在我的服务端中有三次访问 是不是可以理解为就是三次握手
第二个-->我在处理结果的时候向客户端打印了一句话为什么浏览前中现实不出来

作者: 邱俊杰    时间: 2012-5-20 07:08
应该没问题的啊、可能还要关流吧,
作者: 李保成    时间: 2012-5-20 07:33
本帖最后由 踩单车的幸福 于 2012-5-20 07:39 编辑

呵呵
第一个问题可以那么理解,这些都是底层操作。
第二个问题瞅了半天 测试了一下 终于发现了点眉头 不知道对不对  socket通信本身就是一种阻塞式的 我是这么认为的 就是当你客户端链接过来以后 服务器这边会首先使用read()来等待数据,当你不处理的时候,这儿就会有个问题,就是当明知道下一个字符返回空,它还是会进行next读取,这样就陷入了一个假死的状态,没办法向下运行,所以这儿应该加一个读取,简单处理一下就可以了。如果你想使用while()循环,最后还需要关流。
        public static void main(String[] args) throws IOException {

                ServerSocket ss = new ServerSocket(9090);
                while(true){
                Socket s = ss.accept();
                System.out.println(s.getInetAddress().getHostAddress()+".....connected");
               
                InputStream in = s.getInputStream();
               
                byte[] buf = new byte[1024];
               
                int len = in.read(buf);

               
                //给客户端一个反馈信息。
                PrintWriter out = new PrintWriter(s.getOutputStream(),true);
               
                out.println("客户端你好");
                s.close();
                ss.close();
                }        
        }

作者: 胥江    时间: 2012-5-20 20:02
打印了那3句话,应该是3次握手过程中浏览器端向你写的服务器程序发了3次TCP协议的报文吧,所以打印了3次。
而你要在浏览器上显示你用输出流输出的字符是不现实的吧,应为浏览器毕竟不是你自己的客户端程序,没有一直建立一个Socket,然后接收输入流,然后再打印。
紧个人观点。。
作者: 李啸    时间: 2012-5-20 20:42
胥江 发表于 2012-5-20 20:02
打印了那3句话,应该是3次握手过程中浏览器端向你写的服务器程序发了3次TCP协议的报文吧,所以打印了3次。
...

127.0.0.1就是我本地主机的ip  用浏览器当作客户端去访问是可行的你可以试试
作者: 胥江    时间: 2012-5-20 20:57
李啸 发表于 2012-5-20 20:42
127.0.0.1就是我本地主机的ip  用浏览器当作客户端去访问是可行的你可以试试 ...

我运行的结果是:
应该是客户端(浏览器)连接后收不到响应的回复报文,超时后断开连接了,而服务器端与客户端断开了,发不出,你写的那个消息也出了异常

未命名.jpg (29.89 KB, 下载次数: 25)

未命名.jpg





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