您的位置:首页 > 运维架构 > Tomcat

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

2012-01-29 16:11 78 查看
---------------------- 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培训、期待与您交流! ----------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: