黑马程序员_自定义浏览器访问tomcat

来源:互联网 发布:欧德堡牛奶 知乎 编辑:程序博客网 时间:2024/05/18 02:33

---------------------- android培训、java培训、期待与您交流! ----------------------

进入第24天的学习了,感觉挺有意思的,因为很多以前关于浏览器或者网络服务器的疑惑解开了不少,而且了解的比较透彻,当然本人的还是初级水平。通过这一整天的学习领略了自己做服务端,让浏览器访问,或者做一个“山寨”版的浏览器去访问tomcat服务器,真的是其乐无穷。现在我跟大家一起分享一下经验。

浏览器的界面需要用到gui章节的知识,幸亏还有存档,直接拿来用。网络编程这部分的知识需着重介绍,这里有两种方式可供参考:

第一种:

首先我们要考虑的是从文本框中获得url,其次要对url进行处理,具体代码如下:

String url=ta.getText();//http://192.168.1.254:8080/myweb/demo.html

        int index1=url.indexOf("//")+2;

        int index2=url.indexOf("/");

        String str=url.substring(index1,index2);

        String []arr=str.split(":");

        String host=arr[0];

        int port =Integer.parseInt(arr[1]);

     String path=url.substring(index2);

上述代码完成的功能是获取主机名,端口号和资源路径。接下来就是定义Socket,完成浏览器提交访问请求的功能,具体代码如下:

          Socket s=new Socket(host,port);

          PrintWriter out=new PrintWriter(s.getOutputStream(),true);

          out.println("GET"+ path+"HTTP/1.1");

          out.println("Accept:*/*");

          out.println("Accept-Language: zh-CN");

          out.println("Host: 127.0.0.1:12000");

          //out.println("Connection: Keep-Alive");

          out.println("Connection: closed");//连接保持的方式,如果是keep-Alive则连接一直保持,如果是closed则表示为发完数据就结束

          out.println("");//一定要空一行,区分消息头,和请求数据体

       out.println("");

提交请求完成之后,就从流中读取服务器端反馈的数据,代码如下:

     BufferedReader bufr=new BufferedReader(new InputStreamReader(s.getInputStream()));

          String line=null;

          while((line=bufr.readLine())!=null)

          {

             ta.append(line+"\r\n");

          }

       s.close();

上述所有的代码皆放在文本框监视器事件中。这种方法实现的浏览器功能其实是在传输层完成的,所以从服务端得到的数据包含消息报头和所请求的数据。

第二种方法则不然:

首先我们把从文本框中获得字符串封装成URL对象,然后调用openConnection()方法实现远程连接,但此方法会返回URLConnection对象,其功能就等同于Socket建立连接发送请求,因而URLConnection中也提供了获得读取流的方法getInputStream()方法供其对象调用,最后老生常谈的动作,定义缓冲区,读取数据并显示在文本域中,具体代码如下:

String urlpath=ta.getText();//http://192.168.1.254:8080/myweb/demo.html

      URL url=new URL(urlpath);

    URLConnection conn=url.openConnection();

    //System.out.println(conn);

      InputStream in=conn.getInputStream();//URLConnection类中有获得读取流的方法,本质是socket中的方法

    byte []buf=new byte[1024];

    int len=in.read(buf);

  ta.setText(new String(buf,0,len));

在此,我想说明一下,URL类提供了很多很方便的方法供我们使用,不必再像第一种方式那样,苦苦寻找恰当的数据,譬如以下代码:

     URL url=new URL("http://127.0.0.1/myweb/demo.html?name=wangwu&age=89");

    System.out.println("Protocol:"+url.getProtocol());

    System.out.println("Host:"+url.getHost());

    System.out.println("Port :"+url.getPort());

    System.out.println("Path :"+url.getPath());

    System.out.println("File :"+url.getFile());

    System.out.println("Query :"+url.getQuery());

这种方式很高效,而且使得代码变的清爽易懂,不过个人强调一点,上面中的getFile()方法返回的值是getPath()的返回值加上getQuery()的返回值,如果getQuery()的返回值为空,则其值则于getPath() 的值相同的,同时getQuery()的返回值是资源路径后面的查询部分。

 

---------------------- android培训、java培训、期待与您交流! ----------------------

原创粉丝点击