黑马程序员_网络编程(URL)

---------- android培训java培训、java学习型技术博客,期待与您交流!----------
        URL路径是网络访问中常用的方法,java.net包中封装了与之相关的类,因此在网络编程时不再需要繁琐的编写数据封包和拆包,调用其中的方法即可。
        在使用URL、URLConnection等类时,会抛出URL地址非法的异常MalformedURLException,这在现实情况中不能忘记处理。URL类中我们常用的方法有这么一些:getProtocol() 获取此URL的协议名称;getHost() 获取此URL的主机名称;getPort() 获取此URL的端口号;getPath() 获取此URL的路径部分;getFile() 获取此URL的文件名;getQuery() 获取此URL的查询部分。其中getPath() 和getFile() 两个方法获取的内容很相似,有时甚至完全一样,我们可以视getFile() 获取的内容是getPath() 获取的内容和getQuery() 获取的内容相加而来。
        对URL相关类使用的理解,通过下面一个小程序来进行。需要说明的是,该程序可以看成一个简陋到不行的浏览器,同时对其进行响应的服务器是在本机上通过Tomcat搭建的。
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
class MyIEByGUI2{
	private Frame f;
	private TextField tf;
	private Button but;
	private TextArea ta;

	private Dialog d;
	private Label lab;
	private Button okBut;

	MyIEByGUI2(){
		init();
	}

	public void init(){
		f = new Frame("my window");
		f.setBounds(300,100,600,500);
		f.setLayout(new FlowLayout());

		tf = new TextField(60);

		but = new Button("转到");

		ta = new TextArea(25,70);

		d = new Dialog(f,"提示信息-self",true);
		d.setBounds(400,200,240,150);
		d.setLayout(new FlowLayout());
		lab = new Label();
		okBut = new Button("确定");

		d.add(lab);
		d.add(okBut);

		f.add(tf);
		f.add(but);
		f.add(ta);

		myEvent();
		f.setVisible(true);
	}
	private void myEvent(){
		okBut.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				d.setVisible(false);
			}
		});
		d.addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent e){
				d.setVisible(false);
			}
		});

		tf.addKeyListener(new KeyAdapter(){
			public void keyPressed(KeyEvent e){
				try{
					if(e.getKeyCode()==KeyEvent.VK_ENTER)
					showDir();
				}
				catch (Exception ex) {
					
				}
			}
		});

		but.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				try{
					showDir();
				}
				catch (Exception ex) {
					
				}
			}
		});

		f.addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent e){
				System.exit(0);
			}
		});
	}

	private void showDir() throws Exception {
		ta.setText("");
		String urlPath =tf.getText();

		URL url = new URL(urlPath);

		URLConnection conn = url.openConnection();

		InputStream in = conn.getInputStream();

		byte[] buf = new byte[1024];

		int len = in.read(buf);

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

	public static void main(String[] args) {
		MyIEByGUI2();
	}
}

        代码中,用URLCollection类中的getInputStream() 方法获取输入流也可以替换成使用URL类中的openStream() 方法来获取,查看API文档可以知道openStream() 方法其实就是openConnection().getInputStream()的缩写。该小程序中,之所以采用步骤多些的方式,是因为创建URLCollection的对象后能够方便调用该类下的其他一些URL类中不具备的方法。来对比下不调用java封装的URL等相关类的方法,自己完成这部分功能的代码(只贴最直观的showdir() 部分):
private void showDir() throws Exception {
		ta.setText("");
		String url =tf.getText();

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

		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);
	//	ta.setText(str+"...."+path);

		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: 192.168.1.254:11000");
		out.println("Connection: closed");

		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();
	}

        可以很明显的看出,调用封装类的方法能够精简大量繁琐的代码,而且上面的自写代码还没能完成java本身封装的URL相关类中的大多数功能。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值