网络编程
主讲人,xxxxxxx
重庆信息学院软件一系
Java精品课程
本章内容
? 7.1 网络编程基本概念
? 7.2 InetAddress类
? 7.3 TCP编程
? 7.4 UDP编程
? 7.5 URL编程
教学目的
掌握 Java网络编程基础知识,用 Java实现底层
网络通信
重点、难点
? 本章重点是 InetAddress 类,TCP/UDP和
URL程序设计。
? 本章难点是 Java 服务器套接字。
课前知识回顾
? 1,什么是 TCP/ IP协议?
? 2,TCP/IP有哪两种传输协议,各有什么特点?
? 3,什么是 URL?
? 4,URL和 IP地址有什么样的关系?
? 5,什么叫套接字( Socket)?
? 6,套接字( Socket)和 TCP/IP协议的关系?
? 7,URL和套接字( Socket)的关系?
一、网络编程的基本概念
? 1,OSI模型
是 Open Systems Interconnection的简称,其
中文译名为“开放式系统互联”。 OSI模型
为一种分层结构,通过这种结构,使得网络
中不同计算机间相互交换信息的方式标准化。
OSI将网络体系结构分为 7层,
OSI模型(图)























通 过 媒 介 传 输 比
特, 确 定 机 械 及
电 气 规 范
数 据 帧 的 构 成 和
点 到 点 的 传 递
负 责 数 据 包 从 源
到 目 的 的 传 递 和
网 际 互 联
提 供 端 到 端 的 可
靠 消 息 传 递 和 错
误 恢 复
建 立, 管 理 以 及
终 止 会 话
翻 译, 加 密 以 及
数 据 压 缩
允 许 访 问 网 络 资

? 1.物理层
? 2.数据链路层
? 3.网络层
? 4.传输层
? 5.会话层
? 6.表示层
? 7.应用层
1.1 物理层
物理层是 OSI模型的最低层或第一层,该层
包括物理联网媒介,如电缆连线连接器。物
理层的协议产生并检测电压以便发送和接收
携带数据的信号。
1.2数据链路层
数据链路层是 OSI模型的第二层,它控制网
络层与物理层之间的通信。
1.3网络层
OSI模型的第三层,其主要功能是将网络地
址翻译成对应的物理地址,并决定如何将数
据从发送方路由到接收方
1.4传输层
OSI模型的第四层。传输层主要负责确保数
据可靠、顺序、无错地从A点到传输到B点。
1.5会话层
会话层负责在网络中的两节点之间建立和维
持通信
1.6表示层
表示层如同应用程序和网络之间的翻译官,
在表示层,数据将按照网络能理解的方案进
行格式化,这种格式化也因所使用网络的类
型不同而不同。
1.7应用层
OSI模型的顶端也即第七层是应用层。应用
层负责对软件提供接口以使程序能使用网络
服务。
2,网络拓扑结构
? 网络拓扑结构是指网络上计算机、缆线或其
它组件的物理布局
? 通常的拓扑结构有总线型、星型、环型三种
基本类型
2.1总线型拓扑
? 优点:相对简单、便宜,易于操作,可靠性
高,而且可以有效地使用电缆。
? 缺点:如果电缆断了,那么整个网络受到影
响,而且在业务高峰期,网络传输速度变慢。
2.2.星型拓扑
HUB
? 优点:一台计算机失效不影响网络。网络扩
展和重新配置更加容易,网络的管理和监护
也可以实现中央化。
? 缺点:如果 Hub(或中央节点)失效,网络
将瘫痪
2,3环型拓扑
环形
? 优点:所有计算机都可获取信息。在高峰期,
所有的用户性能都相同,在负荷较重的网络
中,环型网表现出色。
? 缺点:网络扩展或重新规划时,网络无法工
作。
3 协议
? 3.1.IP协议
? 3.2.TCP协议
? 3.3.UDP协议
3.1.IP协议
? IP协议用于管理客户端和服务器端之间的报
文传送。 IP协议是所有 Internet协议的基石,
IP协议是一个面向包的协议,是无连接的。
IP协议已经成为世界上最重要的网际协议
例如,192.168.1.100
3.2.TCP协议
传输控制协议( TCP)提供了可靠的报文流
传输和对上层应用的连接服务,TCP使用顺
序的应答,能够按需重传报文。 TCP在两个
或多个主机之间建立面向链接的通信。 TCP
支持多数据流操作,提供数据流控制和错误
控制,甚至完成对乱序到达报文的重新排序
3.3.UDP协议
用户数据报协议( UDP)是 IP协议的另一个主机
到主机层协议。 UDP提供了一种基本的、低延时
的称为数据报的传输。 UDP的简单性使 UDP不适
合于一些应用,但对另一些更复杂的、自身提供
面向链接功能的应用却很适合。其它可能使用
UDP的情况包括:转发路由表数据交换、系统信
息、网络监控数据等的交换。这些类型的交换不
需要流控、应答、重排序或任何 TCP提供的功能
4 端口
在网络技术中,端口( Port)大致有两种:
? (1)物理意义上的端口。比如,ADSL
Modem、集线器、交换机、路由器用于连
接其它网络设备的接口,如 RJ-45端口,SC
端口等等。
? (2)逻辑意义上的端口。一般是指 TCP/IP协
议中的端口,端口号的范围从 0到 65535。比
如,用于浏览网页服务的 80端口,用于 FTP
服务的 21端口等等。
逻辑意义上的端口可分为 3大类:
? 公认端口( Well Known Ports):从 0到 1023,这些端口
紧密绑定于一些服务。通常这些端口的通讯明确表明了某
种服务的协议。
? 注册端口( Registered Ports):从 1024到 49151。它们松
散地绑定于一些服务。也就是说有许多服务绑定于这些端
口,这些端口同样用于许多其它目的。
? 动态和 /或私有端口( Dynamic and/or Private Ports):从
49152到 65535。理论上,不应为服务分配这些端口。实际
上,机器通常从 1024起分配动态端口 。
5 URL
? URL是统一资源定位符( Uniform Resource
Locator)的简称,URL表示 Internet上某一
资源的地址。 Internet上的资源包括 HTML
文件、图像文件、声音文件、动画文件以及
其它任何内容(并不完全是文件,也可以是
一个对数据库的查询等)。
? 通过 URL,就可以访问 Internet。浏览器或
其它程序通过解析给定的 URL就可以在网
络上查找相应的文件或其它资源。
? 一个 URL包括两部分内容:协议名称和资源名称,中间用
冒号隔开。
Protocol,resourceName 如,http://gis.pku.edu.cn
? 协议名称指的是获取资源时所使用的应用层协议,如 http,
ftp等,资源名称则是资源的完整地址,包括主机名、端口
号、文件名或文件内部的一个应用。当然,并不是所有的
URL都必须包含这些内容。如:
http://www.Java.sun.com
http://gis.pku.edu.cn/JavaCourse/index.html
http://www.abc.com:8080/Java/network.html#UDP
ftp://gis.pku.edu.cn/Java/PPT/lesson1.ppt
6 数据报
数据报是一种在网络中独立传播的自身包含
地址的消息。面向连接的通信是在数据报方
式基础上,加上对报文内容和顺序的校验、
流控等处理实现的。适用于不需要高质量的
通信服务,或者用流方式无法实现的应用,
如,ping”命令。
7 套接字
Java网络编程在很大程度上就是套接字
( Socket)编程。套接字是让用户与网络通
信的一种对象,它并不是物理设备,可以将
其理解为网络连接的端点。
Socket在应用程序中创建,通过一种绑定机制与驱
动程序建立关系,告诉自己所对应的 IP和端口号。
此后,应用程序送给 Socket的数据,由 Socket交给
驱动程序向网络上发送出去。计算机从网络上收
到与该 Socket绑定的 IP和端口号相关的数据后,
由驱动程序交给 Socket,应用程序便可从该 Socket
中提取接收到的数据。网络应用程序就是这样通
过 Socket进行数据的发送与接收的。如下图
应 用 程 序
驱 动 程 序
S o c k e t
2
3
1
4
调 用 b i n d 将
S o c k e t 的 信 息
通 知 给 驱 动
程 序
产 生 S o c k e t
应 用 程 序 将
要 发 送 的 数
据 传 给 S o c k e t
驱 动 程 序 从
S o c k e t 取 出 数
据 并 通 过 网
卡 发 送 出 去
8 网络数据库
? 网络数据库定义:以后台数据库为基础的,加上一定的前
台程序,通过浏览器完成数据存储、查询等操作的系统。
? 这个概念看上去很抽象,简单的说,一个网络数据库就是
用户利用浏览器作为输入接口,输入所需要的数据,浏览
器将这些数据传送给网站,而网站再对这些数据进行处理。
例如,将数据存入数据库,或者对数据库进行查询操作等,
最后网站将操作结果传回给浏览器,通过浏览器将结果告
知用户。
? 网络数据库可以实现方便廉价的资源共享,数据信息是资
源的主体,因而网络数据库技术自然而然的就成为互联网
的核心技术。
9 C/S和 B/S
1.C/S
? 客户机 /服务器( Client/Server,简称 C/S)是一种
应用程序结构,C/S事实上是一种适当安排软硬件
的概念,主要是将运算功能与资源分散在服务器
与工作站的构架,这种构架通常用于数据库处理
工作中。
? C/S系统一般为两层结构。许多工作站连接到处于
中心地位的数据存储层上。这些工作站所构成的
就是客户机层(又称为表示层),而数据存储层
则是服务器。下图 8-6显示了客户机如何在两层系
统中访问中心数据库。
客 户 机
客 户 机
数 据 库
C/S结构典型的运作过程:
? 服务器监听响应端口的输入。
? 客户机发出一个请求。
? 服务器接收到客户机发出的请求。
? 服务器处理这个请求,并把结果返回给客户
机。
? 重复前 4个过程,直至会话结束。
2.B/S
? Browser/Server(即,B/S结构)把 C/S结构分解
成一个应用服务器和一个或多个数据库服务器。
也就是说 B/S结构是三层 C/S结构转化而来的。 B/S
结构简化了 C/S结构的客户端,客户端只需要安装
操作系统、网络协议以及浏览器,而服务器端则
集中了所有的应用逻辑。开发、维护等工作集中
在服务器端。
? B/S结构将浏览器作为表示层,将大量的业务处理
程序放在应用服务器上作为应用层,而将数据库
放在数据库服务器上作为数据层。下图是典型的
B/S应用体系结构。
客 户 机
客 户 机
数 据 库
应 用 服 务 器
B/S结构与 C/S结构相比有以下优点:
? 在 B/S结构中,采用浏览器作为表示层,由于
Internet支持底层的 TCP/IP协议,使 Internet与目
前使用的几乎所有局域网都可以做到无缝连接,
从而彻底解决了异构系统间的连接问题。
? 在 B/S结构中,由于系统相对集中在几个服务器上,
因此使系统的维护和扩展都变得比较容易。
? B/S结构最大的优势在于它对异构系统及异种数据
库的支持能力及其系统扩展能力。
二,InetAddress类
? 类 InetAddress可以用于标识网络上的硬件资源,
它提供了一系列方法以描述、获取及使用网络资
源。
? InetAddress类没有构造函数,因此不能用 new来
构造一个 InetAddress实例。通常是用它提供的静
态方法来获取:
? public static InetAddress getByName(String host), host可以是
一个机器名,也可以是一个形如,%d.%d.%d.%d”的 IP地址或
一个 DSN域名。
? public static InetAddress getLocalHost()
? public static InetAddress[] getAllByName(String host)
这三个方法通常会产生
UnknownHostExceptio例外,应在程序中捕
获处理。
以下是 InetAddress类的几个主要方法:
? public byte[] getAddress(),获得本对象的 IP
地址(存放在字节数组中)。
? public String getHostAddress(),获得本对象的 IP地址
,%d.%d.%d.%d”。
? public String getHostName(),获得本对象的机器名。
例子 1
下面的例子演示 Java如何根据域名自动到 DNS(域名服务)上查找 IP地址(与
DNS服务器的连接减至一行):
? public class getIP
? {
? public static void main(String args[])
? {
? InetAddress pku = null;
? try{
? pku = InetAddress.getByName(“www.ccit.js.cn”);
? }catch(UnknownHostException e) {}
? System.out.println(pku);
? }
? }
例子 2
通过 InetAddress,可以获取本机的 IP地址:
? public class getLocalHostTest
? {
? public static void main()
? {
? InetAddress myIP = null;
? try{
? myIP = InetAddress.getLocalHost();
? }catch(UnknownHostException e){}
? System.out.println(myIP);
? }
? }
三,TCP程序设计( Socket )
? 客户端-服务器模型是最常见的网络应用程序模型。当我
们上网冲浪时,我们所使用的浏览器 (例如 IE)就是一个客
户端软件,而提供网页的站点必需运行一个 WEB服务器。
其他向 telnet和 ftp应用都存在客户端和服务器。一般而言,
主动发起通信的应用程序属于客户端。而服务器则是等待
通信请求,当服务器收到客户端的请求,执行需要的运算
然后向客户端返回结果。
? 在设计客户端 -服务器软件时,程序员必须在两种交互模
型中做出选择:面向连接的风格和无连接的风格。面向连
接的程序选择 TCP/IP协议族中的 TCP协议;面向连接的程
序选择 UDP协议。面向连接和无连接的区别需要足够的考
虑,通常依赖于应用要实现的可靠性和支撑网络所能提供
的可靠性。
? 本节我们来了解使用 Java开发面向连接的使用 TCP协议的
网络应用程序,我们分客户端和服务器两个部分分别讲解。
Socket通信
在 Java中,基于 TCP协议实现网络通信的类有两
个:在客户端的 Socket类和在服务器端的
ServerSocket类。
? 在服务器端通过指定一个用来等待的连接的端口号创
建一个 ServerSocket实例。
? 在客户端通过规定一个主机和端口号创建一个 socket
实例,连到服务器上。
? ServerSocket类的 accept方法使服务器处于阻塞状态,
等待用户请求
? 类 Socket
? 构造方法:
? public Socket(String host,int port)
? public Socket(InetAddress address,int port)
? public Socket(String host,int port,InetAddress localAddr,int localPort)
? public Socket(InetAddress address,int port,InetAddress localAddr,
? int localPort)
? 在 JDK1.1以前,Socket类可同时用于 TCP/UDP通信:
? public Socket(String host,int port,boolean stream)
? public Socket(InetAddress host,int port,boolean stream)
? 这些方法都将抛出例外 IOException,程序中需要捕获处理。
? 类 Socket
? Socket的输入 /输出流管理
? public InputStream getInputStream()
? public void shutdownInput()
? public OutputStream getOutputStream()
? public void shutdownOutput()
? 这些方法都将抛出例外 IOException,程序中需要捕获处理。
? 关闭 Socket
? public void close() throws IOException
? 设置 /获取 Socket数据
? public InetAddress getInetAddress(),public int getPort(),…
? public void setSoTimeout(int timeout),…
? 这些方法都将抛出例外 SocketException,程序中需要捕获处理。
? 类 ServerSocket
? 构造方法:
? public ServerSocket(int port)
? public ServerSocket(int port,int backlog):支持指定数目的连接
? public ServerSocket(int port,int backlog,InetAddress bindAddr)
? 这些方法都将抛出例外 IOException,程序中需要捕获处理。
? 主要方法
? public Socket accept():等待客户端的连接
? public void close():关闭 Socket
? 设置 /获取 Socket数据
? public InetAddress getInetAddress(),public int getLocalPort(),…
? public void setSoTimeout(int timeout),…
? 这些方法都将抛出例外 SocketException,程序中需要捕获处理。
? 无论一个 Socket通信程序的功能多么齐全、程序
多么复杂,其基本结构都是一样的,都包括以下
四个基本步骤:
? 1、在客户方和服务器方创建 Socket/ServerSocket。
? 2、打开连接到 Socket的输入 /输出流。
? 3、利用输入 /输出流,按照一定的协议对 Socket进行读
/写操作。
? 4、关闭输入 /输出流和 Socket。
? 通常,程序员的主要工作是针对所要完成的功
能在第 3步进行编程,第 1,2,4步对所有的通信
程序来说几乎都是一样的
Server
ServerSocket(port #)
Socket socket =
ServerSocket.accept()
接收连接
OutputStream
InputStream
Close Socket
Client
Socket(host,port #)
与服务器建立连接
OutputStream
InputStream
Close Socket
socket
? 1、建立 Socket
? 在客户端:
? try{
? Socket client = new Socket(host,4444);
? }catch(IOException e){}
? 在服务器端:
? try{
? ServerSocket server = new ServerSocket(4444);
? }catch(IOException e){}
? Socket socket = null;
? try{
? socket = server.accept(); //等待客户端连接
? }catch(IOException e){}
? 2、在客户端和服务器端同时打开输入 /输出流
? 类 Socket提供了方法 getInputStream()和 getOutputStream()来得到
Socket对应的输入 /输出流以进行数据读写操作,它们分别返回
InputStream对象和 OutputStream对象。
? 为了便于读写数据,应在返回的输入 /输出流对象上建立过滤流,
如 DataInputStram/DataOutputStram,BufferedInputStream/
BufferedOutputStream,PrintStream; InputStreamReader/
OutputStreamWriter,BufferedReader/ BufferedWriter,PrintWriter等。
? BufferedReader = new BufferedReader(
? new InputStreamReader( socket.getInputStream() ) );
? BufferedWriter = new BufferedWriter(
? new InputStreamWriter( socket.getOutputStream() ) );
? 3、关闭输入 /输出流和 Socket
? 在客户端和服务器端分别关闭输入 /输出流和 Socket:先关闭所有相
关的输入 /输出流,在关闭 Socket。
创建服务器 (端口号 )
定义数据成员
服务器等待
网络连接
建立 socket流
发送谈话信息
接收用户谈话信息
创建 Socket实例
定义数据成员
建立 socket流
发送谈话信息
接收服务器谈话信息
关闭流
accept()
4444
结束谈话 (Bye.) 结束谈话 (Bye.)
关闭流







看看这个谈话程序的运行效果:
1、服务器端
SingleTalkServer.java
2、客户端
SingleTalkClient.java
简单的 Client/Server
? 在本地机器上测试网络程序用 回绕地址
Socket socket = new Socket(“127.0.0.1”,4444);
? 建立 socket连接后,还应该建立输入输出数据流。
? 要控制好输入 /输出流和 Socket关闭的时间。
? 如果网络的一端已经关闭,另一端读到 null。
? 在运行时,服务器端程序一般应先行启动 。
支持多 Client
? 解决方案一:
在一台计算机上一次启动多个服务器程序,
只要端口号不同。
?myserver1 <-------->myclient1
?myserver2<-------->myclient2
Server1(1111)
client(2222)Server2(2222)
client(1111)
Server
? 解决方案二:
? 将服务器写成多线程的,不同的处理线程为不同的客户服务。
主线程只负责循环等待,处理线程负责网络连接,接收客户输入的信息。
? //主线程
? while (true)
? {
? accept a connection ;
? create a thread to deal with the client ;
? }end while
Serverclient1
client2
serverthread2
serverthread1
……
? serverSocket = new ServerSocket(4444);
? while (listening)
? {
? Socket socket;
? socket = serverSocket.accept(); //程序将在此等候客户端的连接
? new MultiTalkServerThread(socket,clientNumber).start();
? clientNumber++; //记录客户数目
? }
? serverSocket.close();
class MultiTalkServerThread extends Thread{
public MultiTalkServerThread(Socket socket,int clientNumber){
this.socket = socket;this.clientNumber = clientNumber + 1;
}public void run()
{ …
}}
客户 1
客户 2
服务器
线程 1( )
线程 2( )
MultiTalkServer.java
Client之间通过 Server通信
可以在服务器端将与各客户进行通信的
Socket和线程管理起来,从而各客户之间可
以在服务器端的协助下进行通信。
服务器
(4444)
accept
socket


2
IP1 client1
线程 1


1
IP2 client2
线程 2
四,UDP程序设计 (数据报 )
? UDP协议是无连接的协议,它以数据报作为数据传输的载
体。数据报是一个在网络上发送的独立信息,它的到达、
到达时间以及内容本身等都不能得到保证。数据报的大小
是受限制的,每个数据报的大小限定在 64KB以内。
? UDP协议无需在发送方和接收方建立连接,但也可以
先建立连接。数据报在网上可以以任何可能的路径传往目
的地。
? 在 Java中,基于 UDP协议实现网络通信的类有三个:
? 用于表达通信数据的数据报类 DatagramPacket
? 用于进行端到端通信的类 DatagramSocket
? 用于广播通信的类 MulticastSocket。
datagram
server client
? 类 DatagramPacket
? 构造方法
? public DatagramPacket(byte[] buf,int length)
? public DatagramPacket(byte[] buf,int offset,int length),这两个方法用于接收数据
? public DatagramPacket(byte[] buf,int length,InetAddress address,int port)
? public DatagramPacket(byte[] buf,int offset,int length,InetAddress address,
? int port),这两个方法用于发送数据
? 获取数据 ——获取接收报中的信息
? public InetAddress getAddress()
? public byte[] getData()
? public int getLength()
? public int getOffset()
? public int getPort()
? 设置数据 ——设置发送报中的信息
? setAddress(InetAddress iaddr),setPort(int iport),setData(byte[] buf)、
setData(byte[] buf,int offset,int length), setLength(int length)
? 类 DatagramSocket
? 构造方法
? public DatagramSocket()
? public DatagramSocket(int port):在指定的端口通信
? public DatagramSocket(int port,InetAddress laddr):在指定的地点运行
? 这三个方法都将抛出例外 SocketException,程序中需要捕获处理。
? 最主要的方法 ——发送与接收数据报
? public void receive(DatagramPacket p)
? public void send(DatagramPacket p)
? 这两个方法都将抛出例外 IOException,程序中需要捕获处理。
? 其他方法
? public void connect(InetAddress address,int port):与指定的机器通信
? public void disconnect():关闭与指定机器的连接
? public void close():关闭 Socket
建立数据报 socket();
建立一个数据报 packet
等待请求报文
建立数据报 socket
建立一个请求数据报
发出请求
获得对方地址
构成信息包
发送出去
创建接收包
等待接收
接收端发送端
点到点通信
SingleUDPClient.java
看看这个点到点通信程序的运行效果:
2、客户端(接收端)
SingleUDPServer.java
1、服务器端(发送端)
发送端发出数据报的标准步骤:
1,定义数据成员
? DatagramSocket socket;
? DatagramPacket packet;
? InetAddress address;(用来存放接收方的地址 )
? int port; (用来存放接收方的端口号 )
2,创建数据报 Socket对象
? try{
? socket = new DatagramSocket(4445);
? }catch(java.net.SocketException e) {}
? socket 绑定到一个本地的可用端口,等待接收客户的请
求。
3.分配并填写数据缓冲区 (一个字节类型的数组 )
? byte[] buf = new byte[256];
? 存放从客户端接收的请求信息。
4.创建一个 DatagramPacket
? packet = new DatagramPacket(buf,256);
? 用来从 socket接收数据,它只需要两个参数。
5,服务器阻塞
? socket.receive(packet);
? 在客户的请求数据报到来之前一直等待。
6,从到来的包中得到地址和端口号
? InetAddress address = packet.getAddress();
? int port=packet.getPort();
7,将数据送入缓冲区
? 或来自文件、或键盘输入
8,建立报文包,用来从 socket上发送信息
? packet = new DatagramPacket(buf,buf.length,address,
port);
9,发送数据包
? socket.send(packet);
10.关闭 socket
? socket.close();
接收端接收数据报的标准步骤:
1,定义数据成员
? int port;
? InetAddress address;
? DatagramSocket socket;
? DatagramPacket packet;
? byte[] sendBuf = new byte[256];
2,建立 socket
? socket = new DatagramSocket();
3,向服务器发出请求报文
? address = InetAddress.getByName(args[0]);
? port = parseInt(args[1]);
? packet = new DatagramPacket(sendBuf,256,address,port);
? socket.send(packet);
? 这个数据报本身带有客户端的信息
4,客户机等待应答
? packet=new DatagramPacket(sendBuf,256);
? socket.receive(packet);
? 如果没有到就一直等待,因此实用程序要设置时间限度
5,处理接收到的数据
? String received=new String(packet.getData());
? System.out.println(received);
广播通信
? DatagramSocket只允许数据报发往一个目
的地址。 java.net类包中提供了类
MulticastSocket,允许将数据报以广播的方
式发送到某个端口的所有客户。
? 类 MulticastSocket是在客户端使用,监听服
务器广播来的数据;而服务器端仍然使用
DatagramSocket来发送数据,只是发送的
数据报的目的地址有所变化。
? 类 MulticastSocket:从 DatagramSocket继承而来
? 构造方法
? public MulticastSocket()
? public MulticastSocket(int port),在指定的端口通信
? 这两个方法都将抛出例外 IOException,程序中需要捕获处理。
? 主要方法
? public void joinGroup(InetAddress mcastaddr):加入一个广播组
? public void leaveGroup(InetAddress mcastaddr):离开一个广播组
? public void setTimeToLive(int ttl):指定数据报离开时间
? public void send(DatagramPacket p,byte ttl):在指定的时间内将数据报发送出去
? 这四个方法都将抛出例外 IOException,程序中需要捕获处理。
? 继承 DatagramSocket的方法
? public void receive(DatagramPacket p):接收数据
? public void send(DatagramPacket p):发送数据
? public void connect(InetAddress address,int port):与指定的机器通信
? public void disconnect():关闭指定的连接
? public void close():关闭 Socket
MulticastSocket socket = new MulticastSocket(4446);
InetAddress address = InetAddress.getByName("230.0.0.1");
socket.joinGroup(address);
… //receive datagram
socket.leaveGroup(address);
socket.close();
InetAddress group = InetAddress.getByName("230.0.0.1");
DatagramPacket packet =
new DatagramPacket(buf,buf.length,group,4446);
socket.send(packet);
服务器端
? 广播组的 IP地址是一类特殊的 IP地址,它们没有
分配给网上的硬件资源使用,而是专门保留下来
作为广播通信使用的(就像 127.0.0.1是专门用来
描述本机 IP一样)。这一类地址的范围是从
224.0.0.0到 239.255.255.255,其中地址 224.0.0.0又
被保留不能被一般应用程序所使用。
? 当前,广播通信只能在应用程序中使用,不能在
Applet中使用。
? 许多防火墙和路由器可以配置为不允许
UDP数据报进入。因此,如果想在这种环
境下提供 UDP网络服务,就需要请求系统
管理员重新配置防火墙和路由器,以允许
UDP数据报进入。
五,URL程序设计
? URL是统一资源定位符( Uniform Resource
Locator)的简称,它表示 Internet上某一资
源的地址。 Internet上的资源包括 HTML文
件、图象文件、声音文件、动画文件以及其
他任何内容(并不完全是文件,也可以是一
个对数据库的查询等)。
? 通过 URL,就可以访问 Internet。浏览器或
其他程序通过解析给定的 URL就可以在网
络上查找相应的文件或其他资源。
在 Java中构造 URL
? 在 java.net包中,提供了类 URL来表示 URL。类 URL提供了很多构造方法来生
成一个 URL对象:
? public URL(String spec)
? public URL(URL context,String spec)
? public URL(String protocol,String host,String file)
? public URL(String protocol,String host,int port,String file)
? 以下是一些具体的构造实例:
? URL url1 = new URL(“http://www.ccit.js.cn”);
? URL base = new URL(“http://sc.pku.edu.cn”);
? URL url2 = new URL(base,“mywork1.html”);
? URL url3 = new URL(base,“mywork2.html”);
? URL url4 = new URL(“http”,“home.ccit.js.cn”,“/~lyw/test.html”);
? URL url5 = new URL(“http”,“www.abc.com”,8080,“/java/network.html”);
? 另外还有两种稍微复杂些的构造方法。
? 当创建 URL时发生错误,系统会产生例外
MalformedURLException,这是非运行时例外,必须在程
序中捕获处理。
? URL url1,url2,url3;
? try{
? url1 = new URL(“file:/D:/image/example.gif”);
? url2 = new URL(“http://sc.ccit.js.cn/map/”);
? url3 = new URL(url2,“test.gif”);
? }catch(MalformedURLException e)
? {
? DisplayErrorMessage();
? }
URL的基本方法
一个 URL对象生成后,其属性是不能被改变的,
但可以通过它给定的方法来获取这些属性:
? public String getProtocol():获取该 URL的协议名
? public String getHost(),获取该 URL的主机名
? public String getPort(),获取该 URL的端口号
? public String getPath(),获取该 URL的文件路径
? public String getFile(),获取该 URL的文件名
? public String getRef(),获取该 URL在文件中的相对位

? public String getQuery(),获取该 URL的查询名
URL和 InetAddress的联合使用
Applet中的网络通信需要将 URL和 InetAddress联合使用
来得到相关的 IP地址。
?通过类 Applet的 getCodeBase()方法获得提供它的主机的 URL实例
?利用类 URL的 getHost()方法得到主机名
?利用类 InetAddress的 getByName()得到该主机的 IP地址
?通过 IP地址,就可以进行网络通信( TCP,UDP)
URL url = getCodeBase();
String host = url.getHost();
Try{
InetAddress address = InetAddress.getByName(host);
}catch(Exception e){}
Try{
DatagramSocket socket = new DatagramSocket();
DatagramPacket packet = new DatagramPacket(buf,length,address,port);
socket.send(packet);
}catch(Exception e){}
通过 URL读取 www信息
通过 URL类提供的方法 openStream(),就可
以读取一个 URL对象所指定的资源。
public final InputStream openStream()
方法 openStream()与指定的 URL建立连接并
返回一个 InputStream对象,将 URL位置的资源转
成一个数据流。 通过这个 InputStream对象,就可
以读取资源中的数据。
URL Java 程序
InputStream
import java.net.*;
import java.io.*;
public class URLReader
{
public static void main (String args[])
{
try{
URL gis = new URL("http://sc.ccit.js.cn/test.htm");
BufferedReader in = new BufferedReader(
new InputStreamReader( gis.openStream() ) );
String line;
while( (line = in.readLine()) != null )
{
System.out.println(line);
}
in.close();
}catch(Exception e){
System.out.println(e);
}
}
}
URL连接
? 通过 URL类提供的方法 openConnection(),就可以获得一个 URL连接
( URLConnection)对象。
? public URLConnection openConnection()
? 通过 URL的方法 openStream(),只能从网络上读取资源中的数据。通
过 URLConnection类,可以在应用程序和 URL资源之间进行交互,既
可以从 URL中读取数据,也可以向 URL中发送数据。 URLConnection
类表示了应用程序和 URL资源之间的通信连接。
? try{
? URL url = new URL(“http://sc.ccit.js.cn”);
? URLConnection uc = url.openConnection();
? }catch(MalformedURLException e1){
? …
? }catch(IOException e2){
? …
? }
public class URLConnectionReader
{
public static void main (String args[])
{
try{
URL gis = new URL("http://sc.ccit.js.cn/test.htm");
URLConnection uc = gis.openConnection();
BufferedReader in = new BufferedReader(
new InputStreamReader( uc.getInputStream() ) );
String line;
while( (line = in.readLine()) != null )
{
System.out.println(line);
}
in.close();
}catch(Exception e){
System.out.println(e);
}
}
}
通过 getInputStream()
方法,应用程序就可
以读取资源中的数据。
事实上,类 URL的方法
openStream()就是通
过 URLConnection类来
实现的,它等价于:
openConnection().getInputStream();
URL中最常用的两个方法是:
public InputStream getInputStream()
public OutputStream getOutputStream()
URLConnectionReader.java
通过 URLConnection对象获取的输入流和输出流,可以
与现有的 CGI程序进行交互。
URL和 URLConnection的区别在于前者代表一个资源的
位置,后者代表一种连接。
URL url = new URL("http://sc.ccit.js.cn/~lyw/cgi-bin/test.cgi");
URLConnection uc = url.openConnection();
uc.setDoOutput(true);
PrintStream out = new PrintStream(uc.getOutputStream());
BufferedReader in = new BufferedReader(
new InputStreamReader( uc.getInputStream() ) );
客户端
java程序
OutputStream
InputStream
CGI程序
STDIN
STDOUT
服务器connection getchar()putchar()
其他 URL类
URLConnection类的其他方法以及其他 URL
类( URLClassLoader,URLDecoder,
URLEncoder,URLStreamHandler,
HttpURLConnection,JarURLConnection,
ContentHandler)的使用,需要大家在以后
的实践中去学习
六、小结
? 计算机网络是指计算机通过通信介质相互连接的集合。
网络由硬件和软件共同组成以提供各种服务。位于网
络中的计算机具有唯一的 IP地址,这样不同的主机可
以互相区分。为了便于人的记忆,为计算机赋予了不
同主机名。在应用程序中,可以通过主机名指定计算
机,而在网络层必须通过 IP地址来指定计算机。
? 客户端-服务器是一种最常见的网络应用程序模型。
服务器是一个为其客户端提供某种特定服务的硬件或
软件。客户机是一个用户应用程序,用于访问某台服
务器提供的服务。端口号是对一个服务的访问场所,
它用于区分同一物理计算机上的多个服务。套接字用
于连接客户端和服务器,客户端和服务器之间的每个
通信会话使用一个不同的套接字。 TCP协议用于实现
面向连接的会话,UDP协议用于实现无连接的会话。
? Java中有关网络方面的功能都定义在 java.net程序包
中。 Java用 InetAddress对象表示 IP地址,该对象里
有两个字段:主机名 (String)和 IP地址 (int)。
? 类 Socket和 ServerSocket实现了基于 TCP协议的客户端-服务器程序。
Socket是客户端和服务器之间的一个连接,连接创建的细节被隐藏了。
这个连接提供了一个安全的数据传输通道,这是因为 TCP协议可以解
决数据在传送过程中的丢失、损坏、重复、乱序以及网络拥挤等问题,它保证数据可靠的传送。
? 类 DatagramSocket和 DatagramPacket实现了基于 UDP协议网络程序。
DatagramPacket对象封装了 UDP数据报,在数据报中包含了客户端的
IP地址和端口号以及服务器的 IP地址和端口号。 UDP数据报通过数据
报套接字 DatagramSocket发送和接收,系统不保证 UDP数据报一定能
够安全送到目的地,也不能确定什么时候可以抵达。
? 类 URL和 URLConnection提供了最高级网络应用。 URL的网络资源的
位置来同一表示 Internet上各种网络资源。通过 URL对象可以创建当
前应用程序和 URL表示的网络资源之间的连接,这样当前程序就可以
读取网络资源数据,或者把自己的数据传送到网络上去。
课后习题
1.填空题
(1)我们使用 java.net包中有两个类 ___________和
________________,分别用于在客户机和服务器
上创建 Socket通信 。
(2)我们可分别使用 Socket的方法 ______________和
_________________来创建输入 /输出流。
(3)在服务器端程序中,可使用 ServerSocket对象的
__________方法,接收来自客户机程序的连接请
求,待通信任务完毕后,用 Socket对象的
____________方法来关闭通信 Socket。
(4)我们可以通过 _____________________类来建立数据报通信
的 Socket;用 ______________________类来创建数据报文
包。
(5)我们可通过 DatagramPacket类的方法 ____________从实例
中取得报文的 Byte数组编码;而通过 _____________来返
回一个发送或接收此数据报包文的机器的 IP地址。
(6)我们可通过调用 DatagramSocket对象的 ____________方法
来完成接收数据报的工作,通过调用 DatagramSocket对象
的 ____________方法实现发送数据报。
(7)待通信任务完毕后,用 DatagramSocket对象的
____________方法来关闭数据报通信 Socket。
(8)创建 URL对象有 种方法。
(9)new URL(URL,String)格式中,String参数表
示 。
(10)String URL.getHost( )表示获得 。
(11)String URL.getFile( )表示获得 。
2.操作题
1,利用 Socket套接字进行面向连接通信的
编程。客户端发送文件;服务器端接收并显
示客户机地址,然后返回信息“文件已收到”
给客户端。
2、无连接通信的编程,客户端输入并发送
用户名;服务器端接收并显示其用户名,并
检验它们的正确性,错则返回“对不起,你
不是我们的用户。”,对则返回“你好,欢
迎光临”。
3、编写一个读取图像文件的应用程序,参数
为图像文件的 url。
下课!