3.2基于 URL和 Socket的网络程序设计
? 本节主要内容
– 基于 URL的网络程序设计
– 基于 Socket的网络程序设计
? 任务
1,实现通过客户端查询读者信息功能;
2,实现用户网络登录图书馆管理系统功能。
3.2.1基于 URL的网络程序设计
? URI( Uniform Resource Identifier,统一资源标识符)
标识 Internet上的数据 。
? URL的语法格式是,
– <传输协议名 >,//<主机名 >,<端口号 >/<文件名 >#<引用 >
? <传输协议名 >指明获取资源所使用的应用层网络传输协议,如
Http,ftp( File Transfer Protocol,文件传输协议)等
? <主机名 >是网络中的计算机域名或 IP地址 ;
? <端口号 >是计算机中代表一个服务进程的编号,如 Web服务器
的默认端口号为 80,FTP服务器的默认端口号为 21等 ;
? <文件名 >是服务器上资源名称,它包括文件的路径和名称 ;
? <引用 >是文件中的标记 ;
3.2.1基于 URL的网络程序设计
? 1.URL类
– URL类表示一个统一资源定位器,它是指向互联网
上某一资源的指针,这个资源可以是主机上的一个
文件或路径,也可以是文件上的一个引用。
– URL类有四种构造方法,
? URL(String spec)
? URL(URL context,String spec)
? URL (String protocol,String host,String file)
? URL(String protocol,String host,int port,String file)
3.2.1基于 URL的网络程序设计
? 例如,下面的语句分别创建了一个 URL对象,
– URL u1 = new URL(”http://www.sina.com/”);
– URL u2 = new URL(u1,”index.html”);
– URL u3 = new URL(“http”,
“www.sohu.com”,”/news/index.html”);
– URL u4 = new
URL(“http”,”www.sohu.com”,”80”,”/news/index.html
”);
3.2.1基于 URL的网络程序设计
? 示例 3.2.1 创建一个参数为
,http://java.sun.com/docs/books/tutorial.intro.html#DOW
NLOAD”的 URL对象,并输出该对象的信息。
– 分析,要实现该任务首先要用 URL类去创建一个
URL对象,并指定其连接的 URL的地址为
,http://java.sun.com/docs/books/tutorial.intro.html
#DOWNLOAD”,然后使用其常用方法将其信息取
出并显示出来,如程序(见书 P170)
3.2.1基于 URL的网络程序设计
3.2.1基于 URL的网络程序设计
? 示例 3.2.2 创建一个参数为,http://www.shou.com”的
URL对象,然后读取这个对象的文件。
– 分析:根据上述获取定位器所指资源的步骤来完成资源的获
取。其主要步骤是:首先用 URL类创建一个题中所给 URL的
资源定位器对象;其次用定位器对象中的 openStream()方法
打开连接并构建了一个网络输入流 InputStream对象 ; 然后用
该输入流去创建一个缓冲读取器 BufferedReader对象 ;最后用
读取器从网络上读取所指定的资源信息并用输出语句显示所
访问的信息资源。
– 程序见书 P172
3.2.1基于 URL的网络程序设计
3.2.1基于 URL的网络程序设计
? 2.URLConnection类
– URLConnection类支持 URL连接的输入 /输出流方式
的通信,并可以获得 URL对象资源的相关信息。
– URLConnection类是所有应用程序和 URL连接通信
类的父类。可以用它来输出 /输入 URL对象所表示的
Internet上的资源。
3.2.1基于 URL的网络程序设计
? 要创建一个连接到 Sun网站的连接,如下面的程序段,
? try {
? URL sun = new URL("http://www.sun.com/"); //创建一个指向 sun网站的资
源定位器
? //在当前端与 SUN网站端之间建立连接
? URLConnection sunConnection = sun.openConnection();
? } catch (MalformedURLException e) { // 当创建 URL失败后的处理
?,,,
? } catch (IOException e) { // 连接失败
?,,,
? }
3.2.1基于 URL的网络程序设计
? 示例 3.2.3 创建参数为,www.sohu.com” 的
URLConnection对象,在本地机屏幕上输出该
对象的数据。
– 分析:要完成题中的任务,首先要创建一个 URL对
象 ;其次用 URL对象中的 openConnection()方法来创
建连接和 URLConnection对象 ;然后用
URLConnection对象去创建一个输入流读取器 ;最后
通过输入流的读入方法读取 URL指定的资源。
– 源程序见书 P174
3.2.1基于 URL的网络程序设计
? 3.InetAddress类
– InetAddress类用于表示一个 IP地址。通过它可以很
容易获得网络资源的各种信息。
– InetAddress对象是不能直接创建的。可通过调用该
类的 getLocalHost(),getByName()或
getAllByName()方法来创建新的 InetAddress对象。
3.2.1基于 URL的网络程序设计
? InetAddress类的常用方法有,
– static InetAddress getLocalHost()
? 返回包含本地机器的 IP地址的 InetAddress对象
– static InetAddress getByName(String host)
? 根据主机名 host确定主机的 IP地址的 InetAddress对象
– static InetAddress [] getAllByName(String host)
? 根据主机名 host确定主机的所有 IP地址的 InetAddress对象
– String getHostName()
? 取当前 IP地址的主机名
– String getHostAddress()
? 取当前 IP地址字符串
– byte[] getAddress()
? 取当前对象的 IP地址的字节数组
– String toString()
? 转换 IP地址为字符串
3.2.1基于 URL的网络程序设计
? 示例 3.2.4 创建主机名为,www.shou.com”的
InetAddress对象,并输出它们的 IP地址。
– 分析:由于 InetAddress类是不能直接创建 InetAddress对象的,
因此就必须使用该类中的静态方法创建。依题意,本示例可
采用 getByName或 getAllByName两种方法来创建指定主机名
的 InetAddress对象,但是由于所指定的主机域名可能会有多
个 IP地址,故在本次创建 InetAddress对象时采用
getAllByName方法来获取该主机的所有 IP地址信息。
– 源程序见 P176
3.2.2 基于网络套接字的网络程序设计
? 1.Socket和连接
– 在 Client/Server模式下,通常按照它们在网络中所
起的作用不同,可以分为两类:客户机端和服务器
端。它们的工作过程分别如下,
– 创建 Socket对象;
– 打开连接到 Socket对象的输入 /输出流;
– 按照一定的协议对 Socket对象进行读 /写操作;
– 关闭 Socket对象(即释放 Socket对象所绑定的连接)。
3.2.2 基于网络套接字的网络程序设计
? 2.Socket类
– 在 Java语言的 java.net包中提供了用于客户机端通信的 Socket
类。 Socket对象可以用来向服务器发出连接请求,并交换数
据。
– 在 Java中 Socket类有四种构造方法,如下,
? Socket(InetAddress address,int port);
? Socket(String host,int port);
? Socket( String host,int port,InetAddress localAddr,int
localPort) ;
? Socket( InetAddress address,int port,InetAddress localAddr,
int localPort) ;
3.2.2 基于网络套接字的网络程序设计
? 在创建 Socket连接时需要注意如下几个方面,
– 每个端口提供一种特定的服务,用户只有给出正确
的端口时,才能获得需要的服务。
– 在创建 Socket时可能会抛出异常,因此需要在程序
中进行异常捕获和处理。
3.2.2 基于网络套接字的网络程序设计
? 在 Socket类中也提供了一些常用的方法,
– InetAddress getLocalAddress() 获取 Socket对象绑定的本地
机器地址
– int getLocalPort() 获取 Socket对象绑定的本地机器端
口号
– InetAddress getAddress() 获取 Socket对象绑定的远程主
机地址
– int getPort() 获取 Socket对象绑定的远程主机端口

– OutputStream getOutputStream() 获取 Socket对象的输出流
– InputStream getInputStream() 获取 Socket对象的输入流
3.2.2 基于网络套接字的网络程序设计
? 示例 3.2.5 使用 Java语言中 Socket类编写一个
电子邮件发送程序。
– 分析:实现该功能需要如下四个步骤来完成,
? 编辑一封待发的邮件,在编辑界面中输入发送人地
址、收件人地址、邮件服务器地址、邮箱账号、密
码、信件标题和信件内容;
? 用 Socket创建一个与邮件服务器的连接,通常邮件
服务器的默认使 25号端口来接受客户的连接请求,
因此,可采用如下程序语句来实现创建连接,并从
连接中取得输入 /输出流。
3.2.2 基于网络套接字的网络程序设计
? 通过输出流向服务器发送相关 smtp协议命令,相关的 smtp命令如
下,
HELO 用户名 //服务器问候命令,当命令被正确执行,服务器就会给出编号为
250的应答
AUTH LOGIN //请求服务器对客户进行身份验证,这时就需要给出相应的账号
和密码
//当身份验证通过后,服务器会给出,235 Authentication successful”的应

MAIL FROM,<发信人的邮件地址 > //发送发信人的 Email地址给服务器
RCPT TO,<收信人的邮件地址 > //发送收信人的 Email地址给服务器
DATA //告知服务器开始发送邮件正文,服务器响应后告知客户以,.”为结束
标志
<邮件正文 > //邮件正文,其中包括邮件标题和正文
,//邮件正文发送结束
QUIT //发送完毕退出
3.2.2 基于网络套接字的网络程序设计
? 关闭 Socket连接中的输入 /输出流,并与服务器断开连接,可
以通过下面的程序语句来实现,
? in.close(); //关闭输入流
? out.close(); //关闭输出流
? s.close(); //断开连接
– 通过设计 MailTestFrame类来实现邮件的编辑和发送功能,
类中主要提供了如下方法,
? public void sendMail() //主要实现连接创建、邮件的发送功能
? public void send(String s) //发送一行信息给邮件服务器
? public void receive() //接收邮件服务器的反馈信息
? public void actionPerformed(ActionEvent evt) //按钮行为事件
处理方法
3.2.2 基于网络套接字的网络程序设计
? 邮件发送处理的顺序图如图 3.2.4所示。
3.2.2 基于网络套接字的网络程序设计
? 运行后的结果如下图所示,
3.2.2 基于网络套接字的网络程序设计
? 3.ServerSocket类
– 在 Java中,要构建客户端就需要借助 java.net包中的
Socket类来提供可靠的网络通讯。而服务器端则需
要由 ServerSocket类来实现服务器端的 Socket。
– ServerSocket对象监听网络中来自客户端的服务请
求,它根据请求来创建连接,并响应客户请求的服
务。
3.2.2 基于网络套接字的网络程序设计
? ServerSocket类有四个构造函数,
– ServerSocket( int port)
– ServerSocket( int port,int count)
– ServerSocket( int port,int backlog)
– ServerSocket( int port,int backlog,InetAddress bindAddr)
? 例如,要创建一个监听 8080端口的 Socket服务端,可
以使用下面的语句来实现。
– ServerSocket server = new ServerSocket(8080);
3.2.2 基于网络套接字的网络程序设计
? 在 ServerSocket类中提供了一些常用方法,
– InetAddress getInetAddress() 获取 Socket的本地地址
– int getLocalPort() 获取 Socket监听的端口号
– Socket accept()
? 用于等待一个连接的建立,本方法将中断当前线程的运行(也
就是进行等待请求连接的状态),直到连接建立起来为止。本
方法返回一个 Socket对象,通过该对象,服务程序就可以与连
接的客户机进行通信。
– void close() 关闭服务器套接字
– void setSoTimeout(int timeout)
? 设置连接所允许花费的最大时间,以毫秒为单位。
3.2.2 基于网络套接字的网络程序设计
? 要构建客户 /服务模式中的服务器端通常需要 5个步骤,
– 1)创建一个 ServerSocket对象,以实现对指定端口的监听。可用下
面的程序语句来创建,
? ServerSocket server = new ServerSocket(port);
– 2)服务器无限期地监听客户连接请求。为了监听客户连接,程序调
用 ServerSocket方法 accept。
? Socket connection = server.accept();
– 3)通过获取的 Socket对象来取得 OutputStream和 InputStream对象,
使服务器能够通过发送和接收字节与客户进行通信。
– 4)通信阶段。在这个阶段中,客户和服务器通过 OutputStream和
InputStream对象进行通信。
– 5)当传输完成时,服务器通过调用流和套接字的 close方闭连接。
3.2.2 基于网络套接字的网络程序设计
? 示例 3.2.6 设计一个基于 Socket结构的简易聊天
程序。
– 要求,
? 需要提供图形用户界面 ;
? 服务器只能为单个客户机提供服务。
– 分析 (程序见 P190)
3.2.2 基于网络套接字的网络程序设计
– 运行结果如图所示,
任务解决
? 通过前面知识的学习,获得了解决任务 1中的相关技术
方法。
– 分析,
? 服务器类 ——LibServer类主要实现接受客户端的连接,并响应
客户端发送的命令,本次是完成读者信息查询的命令,在回送
命令结果时通常是将结果信息封装在一个序列化的对象中进行
传送,本次任务中是将读者对象作为查询结果传输到网络中。
? 主要由下面的一些属性和方法组成,
– private ServerSocket ss; 服务器套接字
– private Socket cs; 通信套接字
– private BufferedReader oin; 网络输入流
– private ObjectOutputStream oout; 网络对象输出流,
任务解决
– 服务器类的主要成员方法,
? ObjectInputStream openUserDB(String fileName) 以随机读取
的方式打开指定的用户数据库
? UserRecord findReaderByName(String readerName) 根据读者
姓名查询读者信息
? void createConn() 创建网络连接
? void closeConn() 关闭连接输入 /输出流
? void send(Object msg ) 通过网络的对象输出流向客户端发送服
务端响应对象
? void protocol() 图书馆管理网络协议命令解析器,它执行客户端
的命令
? void start() 启动服务端程序
任务解决
? 2)客户端类 ——LibClient类主要是负责响应用户的操作和显示操作的结果。
它主要由下面的一些属性和方法组,
– 客户端类的主要属性,
? Socket cs; 通信套接字
? PrintWriter out; 网络输出流,主要用于传输客户端的命令
? ObjectInputStream in; 网络对象输入流,主要用于接收服务端的查询结果
? ClientFrame frame; 客户端界面
– 客户端类的主要成员方法,
? void initConn() 初始化网络端口
? void sendFindReader(String msg) 发送客户查找读者命令
? void actionPerformed(ActionEvent arg0) 查询按钮行为事件处理方法
? void closeConn() 关闭网络通信连接
? void receive() 接收网络信息
? void start() 启动客户端
任务解决
? 3)读者信息类 ——UserRecord类主要用于描述
读者信息,在本书的 1.2节任务解决中已经对其
进行了详细描述。
? 4)客户端界面类 ——ClientFrame类,主要实现
客户端的图形界面。
任务解决
? 运行后的结果如图,
精练
? 请根据前述的对任务 1的实现,完成项目中所提的任务
2。
– 分析,
? 针对服务端而言,只需在服务器端增加对登录命令 ——Login命
令的解析处理就可以完成客户登录认证的功能,即:在
LibServer类的 protocol方法中加入对 Login命令的处理即可。其
处理方法就是根据客户端传送过来的用户编号和口令搜索用户,
以判别该用户是否存在,如果存在就允许登录进入本系统,否
则拒绝并断开网络连接。
? 而客户端则只需要更改客户的操作界面,为客户端提供一个登
录操作界面,如图 3.2.9所示。再由客户的行为事件提请服务端
的登录请求。
精练
图 书 系 统 登 录
图 书 系 统 登 录
用 户 编 号,
J a m e s
口 令,
* * * * * * * * *
登 录 退 出
小结
? 1.面向网络应用层协议的网络程序设计
– URL( Uniform Resource Locator,统一资源定位器)是指向
互联网上某一资源的指针,这个资源可以是主机上的一个文
件或路径,也可以是文件上的一个引用。 URL格式是,
– <传输协议名 >,//<主机名 >,<端口号 >/<文件名 >#<引用 >
? 2.InetAddress类
– InetAddress类用于表示一个 IP地址。通过它可以很容易获得
网络资源的各种信息。
小结
? 3.面向传输层的网络程序设计
– 通信的基本步骤如下,
? 1)创建 Socket对象 ;
? 2)打开连接到 Socket对象的输入 /输出流 ;
? 3)按照一定的协议对 Socket对象进行读 /写操作 ;
? 4)关闭 Socket对象(即释放 Socket对象所绑定的连接)。
? 4.Socket类
– 在 Java语言的 java.net包中提供了用于客户机端通信的 Socket
类。 Socket对象可以用来向服务器发出连接请求,并交换数
据。
小结
? 5.ServerSocket类
– 在 Java中,创建服务器端需要由 ServerSocket类来
实现服务器端的 Socket。 ServerSocket对象监听网
络中来自客户端的服务请求,它根据请求来创建连
接,并响应客户请求的服务。