友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
狗狗书籍 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

Java编程思想第4版[中文版](PDF格式)-第230章

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!




能使用在你机器上运行的Web 或者 FTP 服务器程序。当然这有个前提,对方必须准确地知道你目前分配到的 

IP。由于每次拨号连接获得的IP 都是随机的,怎样才能准确地掌握你的IP 呢?  

下面这个程序利用 InetAddress。getByName()来产生你的 IP 地址。为了让它运行起来,事先必须知道计算机 

的名字。该程序只在Windows 95 中进行了测试,但大家可以依次进入自己的 “开始”、“设置”、“控制面 

板”、“网络”,然后进入“标识”卡片。其中,“计算机名称”就是应在命令行输入的内容。  

  

//: WhoAmI。java  

// Finds out your network address when you're   

// connected to the Internet。  

package c15;  

import java。*;  

  

public class WhoAmI {  

  public static void main(String'' args)   



                                                                        537 


…………………………………………………………Page 539……………………………………………………………

      throws Exception {  

    if(args。length != 1) {  

      System。err。println(  

        〃Usage: WhoAmI MachineName〃);  

      System。exit(1);  

    }  

    InetAddress a =   

      InetAddress。getByName(args'0');  

    System。out。println(a);  

  }  

} ///:~  

  

就我自己的情况来说,机器的名字叫作“Colossus”(来自同名电影,“巨人”的意思。我在这台机器上有 

一个很大的硬盘)。所以一旦连通我的ISP,就象下面这样执行程序:  

java whoAmI Colossus  

得到的结果象下面这个样子(当然,这个地址可能每次都是不同的):  

Colossus/202。98。41。151  

假如我把这个地址告诉一位朋友,他就可以立即登录到我的个人Web 服务器,只需指定目标地址 

http://202。98。41。151 即可(当然,我此时不能断线)。有些时候,这是向其他人发送信息或者在自己的 

Web 站点正式出台以前进行测试的一种方便手段。  



15。1。1 服务器和客户机  



网络最基本的精神就是让两台机器连接到一起,并相互“交谈”或者“沟通”。一旦两台机器都发现了对 

方,就可以展开一次令人愉快的双向对话。但它们怎样才能“发现”对方呢?这就象在游乐园里那样:一台 

机器不得不停留在一个地方,侦听其他机器说:“嘿,你在哪里呢?”  

 “停留在一个地方”的机器叫作“服务器”(Server);到处“找人”的机器则叫作“客户机”(Client) 

或者“客户”。它们之间的区别只有在客户机试图同服务器连接的时候才显得非常明显。一旦连通,就变成 

了一种双向通信,谁来扮演服务器或者客户机便显得不那么重要了。  

所以服务器的主要任务是侦听建立连接的请求,这是由我们创建的特定服务器对象完成的。而客户机的任务 

是试着与一台服务器建立连接,这是由我们创建的特定客户机对象完成的。一旦连接建好,那么无论在服务 

器端还是客户机端,连接只是魔术般地变成了一个 IO数据流对象。从这时开始,我们可以象读写一个普通的 

文件那样对待连接。所以一旦建好连接,我们只需象第 10章那样使用自己熟悉的 IO 命令即可。这正是 Java 

连网最方便的一个地方。  

  

1。 在没有网络的前提下测试程序  

由于多种潜在的原因,我们可能没有一台客户机、服务器以及一个网络来测试自己做好的程序。我们也许是 

在一个课堂环境中进行练习,或者写出的是一个不十分可靠的网络应用,还能拿到网络上去。IP 的设计者注 

意到了这个问题,并建立了一个特殊的地址——localhost——来满足非网络环境中的测试要求。在 Java 中 

产生这个地址最一般的做法是:  

InetAddress addr = InetAddress。getByName(null);  

如果向 getByName()传递一个null (空)值,就默认为使用localhost。我们用InetAddress 对特定的机器 

进行索引,而且必须在进行进一步的操作之前得到这个 InetAddress (互联网地址)。我们不可以操纵一个 

InetAddress 的内容(但可把它打印出来,就象下一个例子要演示的那样)。创建 InetAddress 的唯一途径 

就是那个类的static (静态)成员方法getByName() (这是最常用的)、getAllByName()或者 

getLocalHost()。  

为得到本地主机地址,亦可向其直接传递字串〃localhost〃:  

InetAddress。getByName(〃localhost〃);  

或者使用它的保留 IP 地址(四点形式),就象下面这样:  

InetAddress。getByName(〃127。0。0。1〃);  

这三种方法得到的结果是一样的。  



                                                                             538 


…………………………………………………………Page 540……………………………………………………………

15。1。2 端口:机器内独一无二的场所  



有些时候,一个 IP地址并不足以完整标识一个服务器。这是由于在一台物理性的机器中,往往运行着多个服 

务器(程序)。由 IP 表达的每台机器也包含了“端口”(Port )。我们设置一个客户机或者服务器的时候, 

必须选择一个无论客户机还是服务器都认可连接的端口。就象我们去拜会某人时,IP 地址是他居住的房子, 

而端口是他在的那个房间。  

注意端口并不是机器上一个物理上存在的场所,而是一种软件抽象(主要是为了表述的方便)。客户程序知 

道如何通过机器的 IP 地址同它连接,但怎样才能同自己真正需要的那种服务连接呢(一般每个端口都运行着 

一种服务,一台机器可能提供了多种服务,比如HTTP 和 FTP 等等)?端口编号在这里扮演了重要的角色,它 

是必需的一种二级定址措施。也就是说,我们请求一个特定的端口,便相当于请求与那个端口编号关联的服 

务。“报时”便是服务的一个典型例子。通常,每个服务都同一台特定服务器机器上的一个独一无二的端口 

编号关联在一起。客户程序必须事先知道自己要求的那项服务的运行端口号。  

系统服务保留了使用端口 1 到端口 1024 的权力,所以不应让自己设计的服务占用这些以及其他任何已知正在 

使用的端口。本书的第一个例子将使用端口8080 (为追忆我的第一台机器使用的老式8 位 Intel 8080芯 

片,那是一部使用CP/M 操作系统的机子)。  



15。2 套接字  



 “套接字”或者“插座”(Socket)也是一种软件形式的抽象,用于表达两台机器间一个连接的“终端”。 

针对一个特定的连接,每台机器上都有一个“套接字”,可以想象它们之间有一条虚拟的“线缆”。线缆的 

每一端都插入一个“套接字”或者“插座”里。当然,机器之间的物理性硬件以及电缆连接都是完全未知 

的。抽象的基本宗旨是让我们尽可能不必知道那些细节。  

在Java 中,我们创建一个套接字,用它建立与其他机器的连接。从套接字得到的结果是一个 InputStream 以 

及OutputStream (若使用恰当的转换器,则分别是Reader 和 Writer),以便将连接作为一个IO流对象对 

待。有两个基于数据流的套接字类:ServerSocket,服务器用它“侦听”进入的连接;以及Socket,客户用 

它初始一次连接。一旦客户(程序)申请建立一个套接字连接,ServerSocket 就会返回(通过accept()方 

法)一个对应的服务器端套接字,以便进行直接通信。从此时起,我们就得到了真正的“套接字-套接字” 

连接,可以用同样的方式对待连接的两端,因为它们本来就是相同的!此时可以利用 getInputStream()以及 

getOutputStream()从每个套接字产生对应的 InputStream 和OutputStream 对象。这些数据流必须封装到缓 

冲区内。可按第 10章介绍的方法对类进行格式化,就象对待其他任何流对象那样。  

对于Java 库的命名�
返回目录 上一页 下一页 回到顶部 赞(1) 踩(1)
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!