分享
 
 
 

Java联网增强技术

王朝java/jsp·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

Java联网增强技术

――研究J2SE1.4中最新的联网特姓

作者:John Zukowski 本文选自:IBM DW中国 2003年05月20日

随着 Merlin 的发布,java.net 包发生了很大的变化。不仅添加了六个类和三个异常,而且现有的类中有许多都进行了更改以支持额外的功能(比如改进 URL 编码和解码)。在本文中,John Zukowski 向您说明了用 Java 技术进行联网有什么新鲜和不同之处,其中包括 J2SE 1.4 中最新的联网功能:IPv6 支持、URI、网络接口、安全套接字和非绑定套接字。

Java 编程中的联网包括了定位和识别资源的能力以及通过 TCP 和 UDP 连接进行通信的能力。首先,您需要识别具有象 www.ibm.com 这样名称的资源,然后打开到该资源的连接,最后在您自己和连接的另一端之间发送信息包。由于安全姓原因,可能会包括其它任务,但是整个过程是一样的。对于 Java 平台,会在 java.net 包中找到支持这些操作的类。从 Java 编程的早期到现在,这些操作中大多数都未曾发生太大的变化。但是,随着 Merlin 的发展,这些基本操作中有些已经作了改进,以支持有价值的新功能。在本文中,我们将研究五个此类功能:IPv6 支持、URI、网络接口、非绑定套接字和安全套接字。

对 IPv6 地址的支持

首先让我们研究一下对下一代因特网协议 V6(Internet Protocol V6,IPv6)寻址体系结构的新支持。借助于 InetAddress 的两个新子类(Inet4Address 和 Inet6Address),您能够与基于 TCP 和 UDP 的应用程序进行连接。Inet4Address 支持大多数机器所支持的较旧的(而且通常是唯一的)IP 寻址样式,localhost 的格式为 127.0.0.1。RFC2373(请参阅参考资料)中所定义的新寻址方案提供了一种用冒号隔开的格式,其中 0:0:0:0:0:0:0:1 是与 127.0.0.1 等价的回送地址。新的类允许应用程序支持一种或这两种寻址方案。

对 IPv6 的支持取决于底层平台是否支持它,Solaris 8 和更高版本,以及 Linux 2.1.2 和更高(RedHat 6.1+)版本都支持 IPv6,而 Microsoft Windows 并不支持它(Microsoft 的 Window 2000 实现是个有限的实现)。希望 J2SE 1.4 的 Windows 版本以后能支持 IPv6。

认识统一资源标识符

java.net 包现已包括了统一资源标识符(uniform resource identifier,URI)类。可将 URI 看作是幕后没有协议处理程序的统一资源定位符(uniform resource locator,URL)。通常,URL 看上去象 http://www.ibm.com。为了使 Java 语言运行时理解 URL,它需要知道该怎么处理以 http: 开头的信息。以前,如果您提出新协议(例如,象 jdbc:database),那么若没有协议处理程序,则您不能将 jdbc:database 字符串作为 URL 处理。相反,您不得不严格地将它作为字符串处理,这正是 JDBC 现在所做的。

URI 的典型格式是:[scheme:][//authority][path][?query][#fragment],其中 authority 通常就是主机名。但是,它还可以包括用户登录信息和端口:[userInfo@]host[:port]。URI 类自身提供了一系列的 getter 方法,以便了解 URI 各个特定的部分。在您先前传递看上去象 URL 的字符串(但这仅为了描述 URL 而非使用它)的地方,您应当使用该类。

用 NetworkInterface 列出网络连接

您是否曾经想知道哪个联网接口是可用的,但是在不回复到本机代码的情况下又不知道该如何询问呢?通常,连接至因特网的大多数机器中有两个连接:到其自身的本地循环和到其本地服务供应商的连接。但是,有些机器是多宿主的。它们有多个网卡,每个网卡都有一个到因特网的独立连接并且都有自己的名称和地址。有了这个新的 NetworkInterface 接口,您就可以在向外发送多点广播数据报时指定使用哪个网卡,或查看网络连接是否正常。清单 1 演示了该类的用法:

清单 1. 列出网络接口 import java.net.*;

import java.util.Enumeration;

public class Nets {

public static void main(String args[]) throws SocketException {

Enumeration enum = NetworkInterface.getNetworkInterfaces();

while (enum.hasMoreElements()) {

NetworkInterface net = (NetworkInterface)enum.nextElement();

System.out.println(

"Names: " + net.getName() + " / " + net.getDisplayName());

Enumeration enum2 = net.getInetAddresses();

while (enum2.hasMoreElements()) {

InetAddress address = (InetAddress)enum2.nextElement();

System.out.println("\tAddress: " + address.getHostAddress());

}

}

}

}

您运行该程序所得的结果肯定是不同的。清单 2 包括了您想看到的输出样本:

清单 2. 清单 1 的样本结果 Names: lo / MS TCP Loopback interface

Address: 127.0.0.1

Names: eth0 / 3Com EtherLink PCI

Address: 192.168.0.109

对未连接套接字和非绑定套接字的支持

通常,象在套接字之间进行读写之类的操作都是阻塞操作。在操作完成之前,调用线程都不能继续运行。在 Merlin 新 I/O(NIO)类的帮助下,联网类现在可以是非阻塞型的。无论哪一种情况(阻塞或非阻塞),新的 InetSocketAddress 和 SocketAddress 类都允许您打开到主机和端口的连接,然后在真正连接到主机之前为该连接设置一些选项。清单 3 显示了基本的操作序列:

清单 3. 连接至主机和端口 String hostname = ...;

int port = ...;

SocketAddress socketAddress =

new InetSocketAddress(host, port);

SocketChannel channel = SocketChannel.open();

channel.configureBlocking(false);

channel.connect(socketAddress);

请在下个月的专栏文章中查阅有关 NIO 包的更多信息。

用安全套接字进行连接

Merlin 中有一个新的包:javax.net.ssl。该包提供了使用 Java 安全套接字扩展(Java Secure socket extension,JSSE)的安全通信,该扩展更常用的名称是 https URL 的安全套接字层(secure sockets layer,SSL)支持。您不再需要用标准扩展库来实现 SSL 支持 - 它现已随核心库一起提供。通过请求来自 SSLSocketFactory 的 SSL 套接字,您自动地就获得了一个安全连接(假设您所连接的服务器支持该功能)。获取套接字后,您不必再执行任何特殊的操作了 - 它会完全象普通套接字那样进行通信。

在清单 4 中,我们使用 SSL 来连接用户指定的站点,或 Verisign,并获取该站点的入口页面。可以随意将输出保存到文件中,以便查看。

清单 4. 通过安全套接字进行连接 import java.io.*;

import java.net.*;

import javax.net.*;

import javax.net.ssl.*;

public class SslSample {

static final int HTTPS_PORT = 443;

public static void main(String args[]) throws IOException {

String hostname;

// If host not provided, connect to Verisign

if (args.length == 0) {

hostname = "www.verisign.com";

} else {

hostname = args[0];

}

// Get socket factory

SocketFactory factory = SSLSocketFactory.getDefault();

// Get socket from factory

Socket socket = factory.createSocket(hostname, HTTPS_PORT);

// Send request

OutputStream os = socket.getOutputStream();

PrintWriter pw = new PrintWriter(os);

// Setup command

String command = "GET / HTTP/1.0\r\n\r\n";

pw.print(command);

pw.flush();

// Get response

InputStream is = socket.getInputStream();

InputStreamReader isr = new InputStreamReader(is);

BufferedReader br = new BufferedReader(isr);

String line;

while ((line = br.readLine()) != null) {

System.out.println(line);

}

pw.close();

br.close();

socket.close();

}

}

还有一个 HttpsURLConnection 类,可以象 jave.net.URLConnection 那样使用它。

旧的类,新的技巧

并不是所有的联网增强技术都是在新的类(和包)中实现的。许多现有的类也得到了增强。有些功能主要是在后台进行的,比如改进的 FTP 协议处理程序。现在,Merlin 的功能和 RFC1738 和 RFC959 的功能(请参阅参考资料)匹配得更加紧密了,包括对被动方式的支持。另外,URLEncoder 和 URLDecoder 类

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有