admin 管理员组

文章数量: 887021


2024年2月29日发(作者:service controller)

辽宁省高等教育自学考试 计算机软件技术 专业

实 验 报 告 书

课程名称:网络编程技术及应用

助学单位

姓 名

准考证号

成 绩

二O一二年 九 月

实验五 Java的Internet应用 报告

一、实验目的:

1. 基本掌握查找Internet地址。

2. 熟练掌握用URL检索数据。

3. 基本掌握收发电子邮件。

二、实验任务:

1. 查找Internet地址

2. 用URL检索数据

3. 收发电子邮件

三、实验器材:

1.装有 Windows 系统计算机。

工具。

四、实验内容与步骤:

练习:

(一)查找Internet地址

dress类是Java的IP地址封装类。

一.InetAddress有适合于初始化InetAddress对象的3个静态方法,它们是:

1)public static InetAddress ame(String hostName)

UnknowHostException

它需要将寻找的主机名作为参数,并使用DNS查找主机的IP地址

2)public static InetAddress[]

UnknowHostException

ByName(String hostname) throws

throws

有些计算机具有一个以上的Internet地址,给定一个主机名,ByName()会返回一个包含了与该主机名相对应的所有地址的数组。

例如:InetAddress[] address=ByName(“/)

3)public static InetAddress alHost() throws UnknowHostException

alHost()执行在一个计算机上,它将返回该机器的InetAddress。

包的几个其他方法也能返回InetAddress对象。

二.InetAddress类包含了三个将主机名作为字符串返回并将IP地址既作为字符串又作为字节数组返回的方法:

1) public String getHostName()

getHostName()方法返回一个String,该字符串包含了具有该InetAddress对象表示的IP地址的主机名称,如果没有主机名返回一个具有点分形式的数字IP地址。

2) public byte[] getAddress()

getAddress()将IP地址以网络字节顺序作为字节数组返回。

例如:InetAddress me =alHost();

byte[ ] address=ress();

1

getAddress()返回的字节是无符号的,Java没有无符号字节的基本数据类型。值超过127以上的字节会作负数看待。因此需要做以下的改进:

int unsignedByte=signedByte<0?signedByte+256:signedByte;

3) public String getHostAddress()

getHostAddress()方法返回一个字符串,该字符串包含了点分格式的IP地址

InetAddress类中没有与它们相对应的setHostName()和setAddress()方法,因此Java可以确保主机名和IP地址的匹配。

三.dress类继承了。该类可以访问中的所有方法。它重载了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=alHost();

String address=ng();

(二)用URL检索数据

一.URL类

Java程序定位和检索网络上的数据最简单的方法是使用URL类。

类是对统一资源定位符的抽象。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

{

2

URL u1=new URL(“/javafaq/”);

URL u2=new URL(u1,””);

}

catch (MalformedURLException e)

{

n(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。

3

例如:

try

{

URL u=new URL(“/javafaq/#xtocid1902914”);

n(“The ref of ”+u+ “ is ”+();

}

catch (MalformedURLException e)

{

n(e);

}

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

7) public String getQuery()

getQuery()方法返回URL的查询字符串。如果URL没有查询字符串,那么这个方法返回null。

8)public String getUserInfo()

某些URL包含用户名,并且甚至包含密码信息。它位于策略之后和主机名之前,“@”符号划定它的范围。如果URL不包含任何用户信息,那么这个方法返回null。Mailto URL会出现例外,在mailto:******************.edu这样的URL中,******************.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(“”);

Class[] types=new Class[3];

types[0]=;

types[1]=;

types[2]=;

object o=tent(types);

4

然后必须用instanceof测试返回对象的类型

if (o instanceof String)

{

n(o);

}

else if (o instanceof Reader)

{

int c;

Reader r=(Reader) c;

while ((c=()) != -1)

((char) c);

}

else if (o instanceof InputStream)

{

int c;

InputStream in=(InputStream) o;

While ((c=()) != -1)

(c);

}

else

{

n(“Error:unexcepted type ”+ss());

}

四.工具方法

1) public boolean sameFile(URL other)

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

2) public String toExternalForm()

toExternalForm()和toString()方法相同。

五.对象方法

URL是从继承来的,所以可以访问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类

5

oder类包含一个叫encode()的单一静态方法

public static String encode(String s)

r()把任何非文字数字字符(除了空格、下划线、连字号、句点和星号)都转换位%序列,空格被转换为加号。

URLEncoder的主要用途在于为使用GET的CGI程序的通信准备查询字符串。

URLDecoder类把所有的加号转换位空格,把所有的百分号转义符转换为相应的字符。

public static String decode(String s) throws Exception

如果字符串包含一个百分号,而其后没有两个十六进制的数字,那么就会触发一个IllegalArgumentException。这个方法传递的是非转义字符,所以用户可以传递一个完整的URL。

(三)收发电子邮件

1、用.我们可以通过任何支持sun规范中的包的JSP引擎(如JSWDK)发送mail。

(警告:使用内置的internal Sun规范包,这将影响到你的jsp程序的可移植性。)

以下scriptlet利用SmtpClient类在jsp文件中发送email。

<%@ page import="ient, .*" %>

<%

Stringfrom="*********************";Stringto="****************,****************";try{

SmtpClient client = new SmtpClient("");

(from);

(to);

PrintStream message = essage();

n("To: " + to);

n("Subject: Sending email from JSP!");

n("This was sent from a JSP page!");

n();

n("Cool beans! :-)");

n();

n("Govind Seshadri");

n("");

n();

erver();

}

catch (IOException e){

n("ERROR SENDING EMAIL:"+e);

}

%>

2、JavaMail是官方的 Java mail API(可参考

/products/javamail/ 。)

6

虽然该API比 ient更丰富或者说更复杂,但它是可移植的。这里重新创建了一个 MailSender类,它包含了 JavaMail API。如下所示:

// ms_ prefix is for MailSender class variables

// str prefix is for String

// astr prefix is for array of Strings

// strbuf prefix is for StringBuffers, etc.

public MailSender(

String strFrom, // sender

String[] astrTo, // recipient(s)

String[] astrBCC, // bcc recipient(s), optional

String strSubject, // subject

boolean debugging)

{

ms_strFrom = strFrom; // who the message is from

ms_astrTo = astrTo; // who (plural) the message is to

ms_debugging = debugging; // who (plural) the message is to

// set the host

Properties props = new Properties();

("", ms_strSMTPHost);

// create some properties and get the default Session

Session session = aultInstance(props, null);

ug(ms_debugging);

try {

// create a message

ms_msg = new MimeMessage(session);

// set the from

InternetAddress from = new InternetAddress(strFrom);

ms_m(from);

// set the to

InternetAddress[] address = new InternetAddress[];

for (int i = 0; i ; ++i)

{

address[i] = new InternetAddress(astrTo[i]);

}

ms_ipients(, address);

// set the bcc recipients

if (astrBCC != null)

{

address = new InternetAddress[];

for (int i = 0; i ; ++i)

7

{

("astrBCC[" + i + "] is: " + astrBCC[i] + "");

address[i] = new InternetAddress(astrBCC[i]);

}

ms_ipients(, address);

}

// set the subject

ms_ject(strSubject);

// set up the string buffer which will hold the message

ms_strbufMsg = new StringBuffer();

} catch (MessagingException mex) {

tackTrace();

} catch (Exception ex) {

tackTrace();

}

}

public void ms_add(String strText)

{

ms_(strText);

}

public void ms_send()

{

try {

// set the content as plain text

ms_tent(new String(ms_strbufMsg), "text/plain");

// and away

(ms_msg);

} catch (Exception ex) {

n("Caught exception in _send: " + ex);

}

}

总结:

本实验练习了1. 查找Internet地址,2. 用URL检索数据,3. 收发电子邮件的使用,基本上完成了各项任务。

8


本文标签: 方法 返回 对象 主机名