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();
}
}
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相关类中的大多数功能。