返回列表 发帖

[原创]Java网络编程的学习笔记

[这个贴子最后由风灵风之子在 2005/02/12 10:18pm 第 1 次编辑] 第一部分 查找Internet地址 Java.net.InetAddress类是Java的IP地址封装类。 一.InetAddress有适合于初始化InetAddress对象的3个静态方法,它们是: 1)public static InetAddress InetAddress.getByName(String hostName) throws UnknowHostException 它需要将寻找的主机名作为参数,并使用DNS查找主机的IP地址 2)public static InetAddress[] InetAddress.getAllByName(String hostname) throws UnknowHostException 有些计算机具有一个以上的Internet地址,给定一个主机名,InetAddress.getAllByName()会返回一个包含了与该主机名相对应的所有地址的数组。 例如:InetAddress[] address=InetAddress.getAllByName(“www.apple.com”) 3)public static InetAddress InetAddress.getLocalHost() throws UnknowHostException InetAddress.getLocalHost()执行在一个计算机上,它将返回该机器的InetAddress。 Java.net包的几个其他方法也能返回InetAddress对象。 二.InetAddress类包含了三个将主机名作为字符串返回并将IP地址既作为字符串又作为字节数组返回的方法: 1) public String getHostName() getHostName()方法返回一个String,该字符串包含了具有该InetAddress对象表示的IP地址的主机名称,如果没有主机名返回一个具有点分形式的数字IP地址。 2) public byte[] getAddress() getAddress()将IP地址以网络字节顺序作为字节数组返回。 例如:InetAddress me =InetAddress.getLocalHost(); byte[ ] address=me.getAddress(); getAddress()返回的字节是无符号的,Java没有无符号字节的基本数据类型。值超过127以上的字节会作负数看待。因此需要做以下的改进: int unsignedByte=signedByte<0?signedByte+256:signedByte; 3) public String getHostAddress() getHostAddress()方法返回一个字符串,该字符串包含了点分格式的IP地址 InetAddress类中没有与它们相对应的setHostName()和setAddress()方法,因此Java可以确保主机名和IP地址的匹配。 三.java.net.IentAddress类继承了java.lang.Object。该类可以访问java.lang.Object中的所有方法。它重载了3个方法并提供了更加特殊的功能 1)public Boolean equals(Object o) 仅当对象本身是InetAddress类的一个实例并且它具有相同的IP地址时,该对象等同于一个InetAddress对象。但是不需要具有相同的主机名。即只要IP地址相同就可以了。 2)public int hashCode() hashCode()方法返回一个int,当InetAddress对象在散列表中作为关键字使用时需要这个int值。hashCode()返回的int仅仅是被转换的int的4个字节的IP地址。该值对每两个不等同的InetAddress对象是不同的。如果两个InetAddress对象具有相同的地址,则即使它们具有不同的主机名也会具有相同的散列码。因此使用等同的InetAddress对象作为关键字在散列表中存储两个对象,则第二个对象会重载第一个对象。解决方法是使用getHostName()方法返回的String作为关键字来代替InetAddress本身。 3) public String toString() toString()产生的字符串具有下面的形式:主机名/点分地址 并非所有的InetAddress对象都有主机名,无主机名就用点分格式的IP地址来代替,该格式不明确地调用toString()。如要调用,语法很简单: InetAddress thisComputer=InetAddress.getLocalHost(); String address=thisComputer.toString();

[原创]Java网络编程的学习笔记

[这个贴子最后由风灵风之子在 2005/02/17 12:33pm 第 2 次编辑]

第二部分 用URL检索数据
一.URL类
Java程序定位和检索网络上的数据最简单的方法是使用URL类。
Java.net.URL类是对统一资源定位符的抽象。URL对象建立后,它的字段就不再改变。
构造java.net.URL实例的六个构造器:
1)  用字符串构造URL
public URL(String url) throws MalformedURLException
2)用组件构造URL
public URL(String protocol,String hostname,String file) throws MalformedURLException
这个构造器将端口设置为-1,所以协议的所有默认端口都可以用。
3)用组件构造URL
public URL(String protocol,String host,int port,String file) throws MalformedURLException
对于默认端口不正确的极少见情况,这个构造器可以明确地用int变量指定端口
4)  构造相对URL
public URL(URL base,String relative) throws MalformedURLException
这个构造器根据相对URL和基本URL构造绝对URL
例如:
try
{
      URL u1=new URL(“http://metalab.unc.edu/javafaq/index.html”);
      URL u2=new URL(u1,”mailinglists.html”);
}
catch (MalformedURLException e)
{
     System.err.println(e);
}

5)  指定URLStreamHandler
public URL(URL base,String relative,URLStreamHandler handler) throws MalformedURLException
这个构造器由一个基本URL和相对part构建一个相对URL,然后用指定的处理器处理URL
6) 指定URLStreamHandler
public URL(String protocol,String host,int port,String file,URLStreamHandler handler) throws MalformedURLException
这个构造器从它的组件部分构建URL,然后用指定的处理器处理URL。

除了这些构造器,Java类库中还有许多其他方法返回URL对象。其中大多数只是简单的获取方法,只返回用户可能已经知道的URL,因为用户已经首先用它来创建对象。

二.分解URL
URL可以认为是由五部分组成的:
1)  策略(scheme),也可以认为是协议
2)  权限
权限可以进一步分为用户信息、主机和端口。
3)  路径
4)  参考(ref),也称为节(section)或者已命名锚(named anchor)
5)  查询字符串

以只读方式访问URL这五部分的公共方法:
1)  public String getProtocol()
getProtocol()方法返回一个String,包含URL的策略:比如:”http”,”https”,”file”等等。
2)  public String getHost()
getHost()方法返回一个String,包含URL的主机名。
3)  public int getPort()
getPort()方法返回端口号,该数值是一个在URL中指定的int。如果在URL中没有指定端口,那么getPort()方法返回-1,标志着URL没有明确指定端口,同时使用协议的默认端口。
4)  public String getFile()
getFile()方法返回一个String,其中包含URL的路径和文件部分。从主机名后的第一个“/”开始,到另起一部分的“#”之前的符号,全部认为是文件部分。
5)  public String getPath()
它与getFile()方法意义相同。
6) public String getRef()
getRef()返回URL的命名锚部分。如果URL没有一个已命名的锚,那么这个方法返回null。
例如:
try
{
       URL u=new URL(“http://metalab.unc.edu/javafaq/javafaq.html#xtocid1902914”);
       System.out.println(“The ref of ”+u+ “ is ”+u.getRef();
}
catch (MalformedURLException e)
{
      System.err.println(e);
}

这段代码返回中,getRef()返回的字符串xtocid1902914

7) public String getQuery()
getQuery()方法返回URL的查询字符串。如果URL没有查询字符串,那么这个方法返回null。
8)public String getUserInfo()
某些URL包含用户名,并且甚至包含密码信息。它位于策略之后和主机名之前,“@”符号划定它的范围。如果URL不包含任何用户信息,那么这个方法返回null。Mailto URL会出现例外,在mailto:elharo@metalab.unc.edu 这样的URL中,elharo@metalab.unc.edu是路径,而不是用户信息和主机名。
9)public String getAuthority()
getAuthority()返回URL的权限。包括用户信息、主机名和端口。

三.从URL检索数据
1)  public final InputStream openStream() throws IOException
openStream()方法连接URL参考的资源,实现客户机和服务器之间所有必要的握手连接,并且从可读数据返回InputStream。从InputStream得到的数据是URL参考文件的原始(即没有解析过的)内容。
2)  public URLConnection openConnection() throws IOException
openConnection()方法打开一个到指定URL的套接字并且返回一个URLConnection对象。URLConnection代表一个到网络资源的开放连接。
3)  public final Object getContent() throws IOException
getContent()方法检索URL参考的数据,并且试图把它转换成对象的某个类型。
4)  public final Object getContent(Class[] classes) throws IOException
getContent()方法的重载变量使得可以选择我们想要的类作为返回内容,这个方法试图按数组中的顺序返回URL的内容。
例如:
URL u=new URL(“http://nwu.org”);
Class[] types=new Class[3];
types[0]=String.class;
types[1]=Reader.class;
types[2]=InputStream.class;
object o=u.getContent(types);

然后必须用instanceof测试返回对象的类型
if (o instanceof String)
{
     System.out.println(o);
}
else if (o instanceof Reader)
{
     int c;
     Reader r=(Reader) c;
     while ((c=r.read()) != -1)
         System.out.print((char) c);
}
else if (o instanceof InputStream)
{
      int c;
      InputStream in=(InputStream) o;
      While ((c=in.read()) != -1)
           System.out.write(c);
}
else
{
     System.out.println(“Error:unexcepted type ”+o.getClass());
}


四.工具方法
1)  public boolean sameFile(URL other)
sameFile()方法测试测试两个URL对象是否指向同一个文件。sameFile()执行的检测非常肤浅,它只是比较相对立的字段是否相等。sameFile()和equals()有相似之处,差别在于equals()需要考虑所有任何参数,而sameFile()不考虑。此外,任何类都可以传递到equals(),却只有URL类能传递到sameFile()。
2)  public String toExternalForm()
toExternalForm()和toString()方法相同。

五.对象方法
URL是从java.lang.Object继承来的,所以可以访问Object类的全部方法。类似于IentAddress类的对象方法。

六.协议处理器方法
1)  public static synchronized void setURLStreamHandlerFactory(URLStreamHandleFactory factory)
这个方法为应用程序设置URLStreamHandleFactory,如果已经设置了类库,则此方法触发一个通用Error。
2)  public void set(String protocol,String host,int port,String authority,String userInfo,String path,String query,String ref)

七.URLEncoder和URLDecoder类
java.net.URLEncoder类包含一个叫encode()的单一静态方法
public static String encode(String s)
URLEncoder.Encoder()把任何非文字数字字符(除了空格、下划线、连字号、句点和星号)都转换位%序列,空格被转换为加号。
URLEncoder的主要用途在于为使用GET的CGI程序的通信准备查询字符串。

URLDecoder类把所有的加号转换位空格,把所有的百分号转义符转换为相应的字符。
public static String decode(String s) throws Exception
如果字符串包含一个百分号,而其后没有两个十六进制的数字,那么就会触发一个IllegalArgumentException。这个方法传递的是非转义字符,所以用户可以传递一个完整的URL。

TOP

返回列表 回复 发帖