第12章Java网络程序设计_第1页
第12章Java网络程序设计_第2页
第12章Java网络程序设计_第3页
第12章Java网络程序设计_第4页
第12章Java网络程序设计_第5页
已阅读5页,还剩64页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第第12章章 Java网络程序设计网络程序设计Java网络程序设计2nJava提供的网络功能有三大类: URL, Socket, Datagram.nURL是三大功能中最高级的一种,通过URL Java程序可以直接送出或读入网络上的数据.nSocket是传统网络程序最常用的方式,可以想象为两个不同的程序通过网络的通信信道.nDatagram是更低级的网络传输方式,它把数据的目的记录在数据包中,然后直接放在网络上.Java网络程序设计3主要内容主要内容n12.1 Java与网络通信n1. TCP/IP协议n2. Java中的网络功能n3. 端口n4. Socket通信机制n12.2 URL通信n

2、12.2.1 InetAddress类n12.2.2 URL类n12.2.3 URLConnection类n12.3 TCP Socket通信n1. URL通信与Socket通信的区别n2. 使用Socket通信过程n3. Socket类n4. ServerSocket类n12.4 数据报通信n作业Java网络程序设计412.1 Java与网络通信与网络通信njava语言是Internet上的世界语。借助借助HTML从网上下载从网上下载applet在程序中通过在程序中通过URL访问网上资源访问网上资源通过通过包中的类包中的类直接在程序中实现网络通讯直接在程序中实现网络通讯Java网络程序设计5

3、1. TCP/IP协议协议应用层:应用程序间沟通的层应用层:应用程序间沟通的层传输层:提供了结点间的数据传送传输层:提供了结点间的数据传送服务使用服务使用Socket、ServerSocket 类类网际层:负责提供基本的数据封包网际层:负责提供基本的数据封包传送功能。传送功能。网络接口层:对实际的网络媒体的网络接口层:对实际的网络媒体的管理,定义如何使用实际网络来传管理,定义如何使用实际网络来传送数据。送数据。应用层应用层(HTTP, FTP, telnet)传输层传输层(TCP, UDP,.)网际层网际层(IP)网络接口层网络接口层一般应用程序是靠一般应用程序是靠TCP(而不是而不是IP)实

4、现通讯功能,因为它们需要大实现通讯功能,因为它们需要大量数据的无差错传输量数据的无差错传输。Java网络程序设计61. TCP/IP协议协议Java网络程序设计72. Java中的网络功能中的网络功能针对网络通信的不同层次,针对网络通信的不同层次,Java提供的网络功能有四提供的网络功能有四大类:大类:InetAddress 、URLs、Sockets、Datagram。n InetAddress面向的是面向的是IP层,用于标识网络上的硬层,用于标识网络上的硬件资源。件资源。n URL面向的是应用层,通过面向的是应用层,通过URL,Java程序可以直程序可以直接送出或读入网络上的数据。接送出或

5、读入网络上的数据。nSockets和和Datagram面向的则是传输层。面向的则是传输层。Sockets使用的是使用的是TCP协议,这是传统网络程序最常用的方式,协议,这是传统网络程序最常用的方式,可以想象为两个不同的程序通过网络的通信信道进行可以想象为两个不同的程序通过网络的通信信道进行通信。通信。Datagram则使用则使用UDP协议,是另一种网络传协议,是另一种网络传输方式,它把数据的目的地记录在数据包中,然后直输方式,它把数据的目的地记录在数据包中,然后直接放在网络上。接放在网络上。Java网络程序设计包中的主要的类包中的主要的类n面向面向IP层的类:层的类:InetAddressn面

6、向应用层的类:面向应用层的类:URL、URLConnectionn面向传输层的类:面向传输层的类:nTCP协议相关类协议相关类:Socket、ServerSocketnUDP协议相关类:协议相关类:DatagramPacket、DatagramSocket、MulticastSocketn可能产生的可能产生的异常异常:nBindException、ConnectException、MalformedURLException、NoRouteToHostException、ProtocolException、SocketException、UnknownHostException、UnknownS

7、erviceExceptionJava网络程序设计93. 端口端口nInternet上传输的数据都带有标识目的主机与端上传输的数据都带有标识目的主机与端口号的地址信息,主机的地址由口号的地址信息,主机的地址由32位的位的IP地址标识,地址标识,IP协议通过该地址把数据发送到正确的目的主机;协议通过该地址把数据发送到正确的目的主机;端口号由一个端口号由一个16位的数字标识,位的数字标识,TCP与与UDP协议根协议根据端口号把数据传送给正确的应用程序。据端口号把数据传送给正确的应用程序。n端口号的范围是端口号的范围是065535,其中,其中11023之间的之间的端口号是为端口号是为HTTP、FTP

8、等系统应用保留等系统应用保留的,的,FTP协协议的端口号是议的端口号是21,HTTP协议的端口号是协议的端口号是80,Telnet协议的端口号是协议的端口号是23,用户应用程序只能使用,用户应用程序只能使用1024以上的端口号,其中以上的端口号,其中10244999可任意被用可任意被用户用作客户端套接字端口,户用作客户端套接字端口,500065535可任意被可任意被用户用作服务端套接字端口用户用作服务端套接字端口。Java网络程序设计10Java网络程序设计114. Socket通信机制通信机制nSocket通信机制提供了两种通信方式:通信机制提供了两种通信方式:有连接有连接方式(方式(TCP

9、)和无连接方式()和无连接方式(UDP数据报)数据报)。n有连接方式中,通信双方在开始时必须进行一次连接过有连接方式中,通信双方在开始时必须进行一次连接过程,建立一条程,建立一条通信链路通信链路。通信链路提供了。通信链路提供了可靠的、全双可靠的、全双工的字节流服务工的字节流服务。n无连接方式中,通信双方不存在一个连接过程,一次网无连接方式中,通信双方不存在一个连接过程,一次网络络I/O以一个数据报形式进行,而且每次网络以一个数据报形式进行,而且每次网络I/O可以可以和不同主机的不同进程进行。无连接方式开销小于有连和不同主机的不同进程进行。无连接方式开销小于有连接方式,但是所提供的数据传输服务接

10、方式,但是所提供的数据传输服务不可靠不可靠,不能保证,不能保证数据报一定到达目的地。数据报一定到达目的地。nJava语言同时支持有连接和数据报通信方式,语言同时支持有连接和数据报通信方式,在这两种方式中都在这两种方式中都采用了采用了Socket表示通信过程中表示通信过程中的端点的端点。Java网络程序设计124. Socket通信机制通信机制nSocket通信机制提供了两种通信方式:通信机制提供了两种通信方式:有连接有连接方式(方式(TCP)和无连接方式()和无连接方式(UDP数据报)数据报)。n有连接方式中,通信双方在开始时必须进行一次连接过有连接方式中,通信双方在开始时必须进行一次连接过程

11、,建立一条程,建立一条通信链路通信链路。通信链路提供了。通信链路提供了可靠的、全双可靠的、全双工的字节流服务工的字节流服务。n无连接方式中,通信双方不存在一个连接过程,一次网无连接方式中,通信双方不存在一个连接过程,一次网络络I/O以一个数据报形式进行,而且每次网络以一个数据报形式进行,而且每次网络I/O可以可以和不同主机的不同进程进行。无连接方式开销小于有连和不同主机的不同进程进行。无连接方式开销小于有连接方式,但是所提供的数据传输服务接方式,但是所提供的数据传输服务不可靠不可靠,不能保证,不能保证数据报一定到达目的地。数据报一定到达目的地。nJava语言同时支持有连接和数据报通信方式,语言

12、同时支持有连接和数据报通信方式,在这两种方式中都在这两种方式中都采用了采用了Socket表示通信过程中表示通信过程中的端点的端点。Java网络程序设计13Socket通信通信n端到端的连接与通信端到端的连接与通信n网络上的两个程序(进程)通过一个双向的通信网络上的两个程序(进程)通过一个双向的通信连接实现数据的交换。连接实现数据的交换。n双向链路的一端称为一个双向链路的一端称为一个socket(套接字)套接字)n主机主机端口(用于区分同一台主机上的不同的通端口(用于区分同一台主机上的不同的通信应用进程:信应用进程:01023系统系统 102465535用户)用户)Java网络程序设计14Soc

13、ket与与I/O流流n一个socket可以持有两个流输入流与输出流Java网络程序设计15Socket通信过程通信过程n服务器端的程序首先选择一个端口服务器端的程序首先选择一个端口(port)注册注册,然后调用然后调用accept()方法对此端口进行方法对此端口进行监听监听,即等,即等待其它程序的连接申请。如果客户端的程序申请和待其它程序的连接申请。如果客户端的程序申请和此端口连接,那么服务器端就利用此端口连接,那么服务器端就利用accept()方法方法来取得这个连接的来取得这个连接的Socket。客户端的程序建立。客户端的程序建立Socket时必须指定服务器的地址时必须指定服务器的地址(ho

14、st)和通信的和通信的端口端口(port),这个端口必须与服务器端监听的端口,这个端口必须与服务器端监听的端口保持一致。保持一致。Java网络程序设计1612.2 URL通信通信nURL(Uniform Resource Locator)是统一资源是统一资源定位器的简称,它表示定位器的简称,它表示Internet/Intranet上一个上一个资源的引用或地址,这些资源可以是一个文件、一资源的引用或地址,这些资源可以是一个文件、一个目录或一个对象。个目录或一个对象。 nURL是由一个字符串来描述的,是由一个字符串来描述的,URL包括协议包括协议和资源名称两部分,协议表示访问资源所需的协议,和资源

15、名称两部分,协议表示访问资源所需的协议,如如HTTP、FTP等;资源名称表示要访问的资源地等;资源名称表示要访问的资源地址。址。 n:8080Java网络程序设计1712.2.1 InetAddress类类n类类InetAddress可以用于标识网络上的硬件资源,可以用于标识网络上的硬件资源,它提供了一系列方法以描述、获取及使用网络资源。它提供了一系列方法以描述、获取及使用网络资源。nInetAddress类没有构造函数,因此不能用类没有构造函数,因此不能用new来来构造一个构造一个InetAddress实例。通常是用它提供的静态实例。通常是用它提供的静态方法来获

16、取:方法来获取:npublic static InetAddress getByName(String host) :host可以是一个机器名,也可以是一个形如可以是一个机器名,也可以是一个形如“%d.%d.%d.%d”的的IP地址或一个地址或一个DSN域名。域名。npublic static InetAddress getLocalHost() npublic static InetAddress getAllByName(String host)n这三个方法通常会产生这三个方法通常会产生UnknownHostException例外,应在程序中捕获处理。例外,应在程序中捕获处理。Java网络

17、程序设计18InetAddress类的几个主要方法:类的几个主要方法:npublic byte getAddress():获得本对象的获得本对象的IP地址(存放在字节数组中)。地址(存放在字节数组中)。npublic String getHostAddress():获得本对象获得本对象的的IP地址地址“%d.%d.%d.%d”。npublic String getHostName():获得本对象的获得本对象的机器名。机器名。n获得本地主机的获得本地主机的IP地址:地址:InetAddress addr=InetAddress.getLocalHost();import .*;public cl

18、ass TestInetAddressClass public static void main(String args) try InetAddress address=InetAddress.getByName();String hostName = address.getHostName(); / 获得主机名获得主机名String IPName = address.getHostAddress(); / 获得获得IP地址地址System.out.println(hostName);System.out.println(IPName); catch (UnknownHostExceptio

19、n e) e.printStackTrace(); Java网络程序设计19【例12.1】TestInetAddressClass.javaJava网络程序设计2012.2.2 URL类类npublic URL(String spec)n/参数参数spec是描述文件名的字符串。是描述文件名的字符串。npublic URL(String protocol, String host, String file)n/参数中的参数中的protocol为协议名;为协议名;host为主机名;为主机名;file为文为文件名;端口号使用默认值。件名;端口号使用默认值。npublic URL(String pro

20、tocol,String host,String port,String file)npublic URL(URL context,String spec)n/参数参数context为为URL对象,用于指定对象,用于指定URL位置。位置。注意注意:类:类URL的构造方法都声明抛出非运行时异常的构造方法都声明抛出非运行时异常(MalformedURLException),因此生成),因此生成URL对象时,我对象时,我们必须要对这一异常进行处理,用们必须要对这一异常进行处理,用trycatch语句进行捕获。语句进行捕获。Java网络程序设计2112.2.2 URL类类一个一个URL对象生成后,其属

21、性是不能被改变的,但可对象生成后,其属性是不能被改变的,但可以通过它给定的方法来获取这些属性:以通过它给定的方法来获取这些属性:getDefaultport():返回缺省的端口号。返回缺省的端口号。getFile():获得获得URL指定资源的完整文件名指定资源的完整文件名getHost():返回主机名。返回主机名。getPath():返回指定资源文件目录和文件名返回指定资源文件目录和文件名getPort():返回端口号,默认返回端口号,默认-1getProtocol():返回表示返回表示URL中协议的字符串对象中协议的字符串对象getRef():返回返回URL中的中的HTML文档标记,即文档标

22、记,即#号标记号标记getUserInfo():返回用户信息。返回用户信息。toExternalForm():返回完整的返回完整的URL字符串。字符串。toString():返回完整返回完整URL字符串。字符串。/生成一个生成一个URL对象,并获取它的各个属性。对象,并获取它的各个属性。URL MyURL = null;try MyURL=new URL(http:/ catch (MalformedURLException e) System.out.println(MalformedURLException: + e); System.out.println(URL String: + M

23、yURL.toString();System.out.println(Protocol: + MyURL.getProtocol();System.out.println(Host: + MyURL.getHost();System.out.println(Port: + MyURL.getPort();System.out.println(File: + MyURL.getFile();Java网络程序设计22【例【例12.2】 TestURLObject.javaJava网络程序设计23通过通过URL读取读取www信息信息通过URL类提供的方法openStream(),就可以读取一个URL

24、对象所指定的资源。public final InputStream openStream() 方法openStream()与指定的URL建立连接并返回一个InputStream对象,将URL位置的资源转成一个数据流。通过这个InputStream对象,就可以读取资源中的数据。URLJava 程序程序InputStreamJava网络程序设计24【例【例12.3】 TestURLHtml.javan用用URL类的类的openStream()成员方法获取指定的成员方法获取指定的HTML页面的源代码。页面的源代码。try URL url = new URL(/ch1/W

25、ebForm1-1.aspx);/ 用用URL对象打开一个输入流对象打开一个输入流DataInputStream d = new DataInputStream(url.openStream();String inputLine;while (inputLine = d.readLine() != null) / 从输入流读入数据从输入流读入数据System.out.println(inputLine); / 将数据显示到系统标准输出上将数据显示到系统标准输出上d.close(); / 关闭输入流关闭输入流 catch (MalformedURLException me) catch (IOE

26、xception ioe) Java网络程序设计25【例【例12.3】 TestURLHtml.javan在在JDK1.1以后以后DataInputStream的的readLine方法就过期方法就过期了了,换用换用BufferedReader。将代码将代码DataInputStream d = new DataInputStream(url.openStream();改为改为BufferedReader d=new BufferedReader(new InputStreamReader(url.openStream();就可以了就可以了Java网络程序设计26【例【例12.3】 TestUR

27、LHtml.javan说明:由于说明:由于URL的的openStream()成员方法返回的成员方法返回的是是InputStream类的对象,所以只能通过类的对象,所以只能通过read()方方法逐个字节地去读法逐个字节地去读URL地址处的资源信息。这里利用地址处的资源信息。这里利用DataInputStream对原始信息流进行了包装和处理,对原始信息流进行了包装和处理,以提高以提高I/O效率。效率。Java网络程序设计2712.2.3 URLConnection类类n通过通过URL类提供的方法类提供的方法openConnection(),就可以就可以获得一个获得一个URL连接(连接(URLCon

28、nection)对象。对象。npublic URLConnection openConnection()n通过通过URL的方法的方法openStream(),只能从网络上读取只能从网络上读取资源中的数据。通过资源中的数据。通过URLConnection类,可以在应用类,可以在应用程序和程序和URL资源之间进行交互,既可以从资源之间进行交互,既可以从URL中读取中读取数据,也可以向数据,也可以向URL中发送数据。中发送数据。URLConnection类类表示了应用程序和表示了应用程序和URL资源之间的通信连接。资源之间的通信连接。客户端客户端java程序程序OutputStreamInputSt

29、reamCGI程序程序STDINSTDOUT服务器服务器connectiongetchar()putchar()Java网络程序设计2812.2.3 URLConnection类类1创建创建URLConnection类的对象类的对象URLConnection类是一个抽象类,创建URLConnection对象分两步完成:首先创建一个URL对象,然后调用该URL对象的openConnection()方法返回一个对应其URL地址的URLConnection对象。例如:nURL MyURL=new URL(http:/ con= MyURL.openConnection();Java网络程序设计291

30、2.2.3 URLConnection类类2向服务器端写数据向服务器端写数据首先建立输出数据流:首先建立输出数据流: nPrintStream out=new PrintStream(con.getOutputStream(); 然后向服务器写入信息:然后向服务器写入信息: nout.println(String data);Java网络程序设计3012.2.3 URLConnection类类3从服务器端读数据从服务器端读数据首先建立输入数据流:首先建立输入数据流:nInputStreamReader ins=new InputStreamReader(con.getInputStream()

31、;nBufferedReader in=new BufferedReader(ins);或:或:nDataInputStream dis=newDataInputStream(con.getInputStream();然后从服务器读信息:然后从服务器读信息:in.readLine(); 或:dis.readLine();Java网络程序设计31【例【例12.4】 CommunicationCgi.javan使用使用URLConnection类从远方主机获取信息。类从远方主机获取信息。n由于安全性的约束,由于安全性的约束,Java程序只能对特定的程序只能对特定的URL进行写的操作,这种进行写的操

32、作,这种URL就是服务器上的就是服务器上的CGI程序。程序。CGI是公共网关接口是公共网关接口(CommonGatewayInterface)的简称,它是客户端浏览器与服务器端的应用程序进的简称,它是客户端浏览器与服务器端的应用程序进行通信的接口。行通信的接口。Java网络程序设计32【例【例12.4】 CommunicationCgi.java/ 建立指向网络中建立指向网络中CGI的的URL对象,对象,backwards为服务器端为服务器端CGI程序程序URL url = new URL(http:/);URLConnection connection = url.openConnectio

33、n();/将将 doOutput 标志设置为标志设置为 true,表示使用,表示使用URL连接进行输入。连接进行输入。 connection.setDoOutput(true);/读取或写入远方的计算机节点的信息时,首先要建立输入或输出数据流,利用读取或写入远方的计算机节点的信息时,首先要建立输入或输出数据流,利用URLConnection类的方法类的方法 getlnputStream()或或getOutputStream()PrintStream out = new PrintStream(connection.getOutputStream();out.println(12345); /向

34、远方计算机节点写入信息向远方计算机节点写入信息,服务器输出数据服务器输出数据out.close();InputStreamReader ins = new InputStreamReader(connection.getInputStream();BufferedReader in = new BufferedReader(ins);String inputLine;while (inputLine = in.readLine() != null) /读取远方计算机节点的信息读取远方计算机节点的信息System.out.println(inputLine); / 输出从服务器读出的数据输出从服

35、务器读出的数据in.close();Java网络程序设计3312.3 TCP Socket通信通信nTCP(Transport Control Protocol)n两主机之间两主机之间有连接的、可靠的、端对端有连接的、可靠的、端对端(end-to-end)的的数据流的传输数据流的传输.n如如http, ftp, telnet 的传输层均使用此协议的传输层均使用此协议Java网络程序设计3412.3 TCP Socket通信通信n为了支持为了支持TCP/IP面向连接的网络程序的开发,面向连接的网络程序的开发,包提供了包提供了Socket类与类与ServerSocket类,类,ServerSock

36、et类和类和Socket类均直接继承于类均直接继承于Java的的Object根类。根类。nServerSocket类用于服务端程序,它有一个类用于服务端程序,它有一个accept方法专门用来监听客户端的连接,并产生一个方法专门用来监听客户端的连接,并产生一个与客户端连接相对应的与客户端连接相对应的Socket对象;对象;nSocket类则是服务端程序和客户端程序都要用到的类则是服务端程序和客户端程序都要用到的类,该类专门用来处理连接双方的数据通信。一个类,该类专门用来处理连接双方的数据通信。一个Socket由一个由一个IP地址和一个端口号唯一确定。地址和一个端口号唯一确定。Java网络程序设计

37、351. URL通信与通信与Socket通信的区别通信的区别nURL通信与通信与Socket通信都是面向连接的通信。它们通信都是面向连接的通信。它们的区别在于:的区别在于:(1) Socket通信方式为通信方式为主动主动等待客户端的服务请求方式。而等待客户端的服务请求方式。而URL通信方式为通信方式为被动被动等待客户端的服务请求方式。等待客户端的服务请求方式。(2) 利用利用Socket进行通信时,在服务器端运行了一个进行通信时,在服务器端运行了一个Socket通通信程序,不停地监听客户端的连接请求,当接到客户端请求后,信程序,不停地监听客户端的连接请求,当接到客户端请求后,马上建立连接并进行

38、通信。利用马上建立连接并进行通信。利用URL进行通信时,在服务器端常进行通信时,在服务器端常驻一个驻一个CGI程序,但它一直处于睡眠状态,只有当客户端的连接程序,但它一直处于睡眠状态,只有当客户端的连接请求到达时才被唤醒,然后建立连接并进行通信。请求到达时才被唤醒,然后建立连接并进行通信。(3) 在在Socket通信方式中,服务器端的程序可以打开多个线程通信方式中,服务器端的程序可以打开多个线程与多个客户端进行通信,并且还可以通过服务器使各个客户端之与多个客户端进行通信,并且还可以通过服务器使各个客户端之间进行通信,这种方式适合于一些较复杂的通信。而在间进行通信,这种方式适合于一些较复杂的通信

39、。而在URL通信通信方式中,服务器端的程序只能与一个客户进行通信,这种方式比方式中,服务器端的程序只能与一个客户进行通信,这种方式比较适合于较适合于B/S通信模式。通信模式。361.Socket通信机制的基本概念通信机制的基本概念(1)建立连接)建立连接n当两台计算机进行通信时,首先要在两者之间建立当两台计算机进行通信时,首先要在两者之间建立一个连接,也就是两者分别运行不同的程序,由一一个连接,也就是两者分别运行不同的程序,由一端发出连接请求,另一端等候连接请求。端发出连接请求,另一端等候连接请求。n当等候端收到请求并接受请求后,两个程序就建立当等候端收到请求并接受请求后,两个程序就建立起一个

40、连接,之后通过这个连接可以进行数据交换。起一个连接,之后通过这个连接可以进行数据交换。此时,请求方称为此时,请求方称为客户端客户端,接收方称为,接收方称为服务器端服务器端。n应用在这两端的应用在这两端的TCP Socket分别称为分别称为服务器服务器Socket和和客户客户Socket。n基本原理类似于电话系统。基本原理类似于电话系统。371.Socket通信机制的基本概念通信机制的基本概念(2)连接地址)连接地址n为了建立连接,需要有一个程序向另一台计算机上为了建立连接,需要有一个程序向另一台计算机上的程序发出请求,其中,能够唯一识别对方机器的,的程序发出请求,其中,能够唯一识别对方机器的,

41、就是计算机的名称或就是计算机的名称或IP地址地址,称为,称为连接地址连接地址,类似,类似于电话系统中的电话号码。于电话系统中的电话号码。n计算机上的每个程序有一个唯一的端口号,通过端计算机上的每个程序有一个唯一的端口号,通过端口号指定要连接的程序。所以一个完整的连接应该口号指定要连接的程序。所以一个完整的连接应该是是IP+端口端口。n两个程序进行连接之前要约定好端口号。由服务器两个程序进行连接之前要约定好端口号。由服务器端分配端口号并等候请求,客户端利用这个端口号端分配端口号并等候请求,客户端利用这个端口号发出连接请求,当两个程序所设定的端口号一致时发出连接请求,当两个程序所设定的端口号一致时

42、连接成功。连接成功。381.Socket通信机制的基本概念通信机制的基本概念(3)TCP/IP Socket通信通信nSocket在在TCP/IP协议中定义,针对一个特定的连接,协议中定义,针对一个特定的连接,每台机器上都有一个每台机器上都有一个“套接字套接字”,可以想象在它们,可以想象在它们之间有一条虚拟的之间有一条虚拟的“线缆线缆”,线缆的每一端都插入,线缆的每一端都插入一个一个“套接字套接字”或或“插座插座”里。里。n在在Java语言中,服务器端套接字使用语言中,服务器端套接字使用ServerSocket类,客户端套接字使用类,客户端套接字使用Socket类。类。39SOCKET连接过程

43、连接过程n套接字之间的连接过程可以分为三个步骤:套接字之间的连接过程可以分为三个步骤:n服务器监听服务器监听:服务器端套接字并不定位具体的客户端套接字,:服务器端套接字并不定位具体的客户端套接字,而是处于而是处于等待连接的状态等待连接的状态,实时监控网络状态。,实时监控网络状态。n客户端请求客户端请求:是指由客户端的套接字提出连接请求,要连接:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,先描述它要连接的服务器的套接字,指出服务器端套接字的指出服务器端套接字的地址和

44、端口号地址和端口号,然后就向服务器端套接字,然后就向服务器端套接字提出连接请求提出连接请求。n连接确认连接确认:是指当服务器端套接字监听到或者说接收到客户:是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。继续处于监听状态,继续接收其他客户端

45、套接字的连接请求。4016.3.2 基于连接的基于连接的Socket通信程序设计通信程序设计Java网络程序设计412. 使用使用Socket通信过程通信过程n利用利用socket进行有连接的通信过程包括以下三个进行有连接的通信过程包括以下三个步骤:步骤:(1) 创建创建socket,建立连接,建立连接包中的两个类包中的两个类Socket与与ServerSocket分分别表示连接的别表示连接的Client端和端和Server端,进行网络通信端,进行网络通信的方法也都封装在这两个类中。建立连接首先要创的方法也都封装在这两个类中。建立连接首先要创建这两个类的对象并把它们关联起来。建这两个类的对象并

46、把它们关联起来。(2) 打开连接到打开连接到Socket的输入输出流,按照一定的的输入输出流,按照一定的协议对协议对Socket进行读写操作进行读写操作.连接建立后,要进一步获取连接上的连接建立后,要进一步获取连接上的I/O流,并通过流,并通过这些流进行数据传输。这些流进行数据传输。(3) 关闭关闭Socket.Java网络程序设计423. Socket类类socket类构造方法类构造方法npublic Socket(String host, int port) 创建一个流套接字并将其连接到指定主机上的指定端口号。创建一个流套接字并将其连接到指定主机上的指定端口号。 npublic Socke

47、t(InetAddress address, int port) 创建一个流套接字并将其连接到指定创建一个流套接字并将其连接到指定 IP 地址的指定端口号地址的指定端口号 npublic Socket(String host, int port, InetAddress localAddr, int localPort)创建一个套接字并将其连接到指定远程地址上的指定远程端口创建一个套接字并将其连接到指定远程地址上的指定远程端口npublic Socket(InetAddress address, int port, InetAddress localAddr,int localPort)创建一

48、个套接字并将其连接到指定远程地址上的指定远程端口创建一个套接字并将其连接到指定远程地址上的指定远程端口这些方法都将抛出例外这些方法都将抛出例外IOException,程序中需要捕获处理。,程序中需要捕获处理。两两个构造函数都创建了一个基于个构造函数都创建了一个基于Socket的连接服务器端流套接字的的连接服务器端流套接字的流套接字流套接字。43Socket 类常用方法类常用方法nSocket的输入的输入/输出流管理输出流管理public InputStream getInputStream()/获取与获取与Socket相关联的字节输入流,用于从相关联的字节输入流,用于从Socket中读数据中读

49、数据public OutputStream getOutputStream() /获取与获取与Socket相关联的字节输出流,用于向相关联的字节输出流,用于向Socket中写数据中写数据n这些方法都将抛出例外这些方法都将抛出例外IOException,程序中需要捕获,程序中需要捕获处理。处理。n 关闭关闭Socketpublic void close() throws IOException44Socket 类常用方法类常用方法n设置设置/获取获取Socket数据数据public InetAddress getInetAddress():获取创建获取创建Socket对象时指定的计算机对象时指定

50、的计算机IP地址。地址。public InetAddress getLocalAddress():获取创建获取创建Socket对象时客户计算机的对象时客户计算机的IP地址。地址。public int getPort() :获取创建获取创建Socket对象时远程主机对象时远程主机的端口号的端口号public int getLocalPort()public void setSoTimeout(int timeout):设定客户端接:设定客户端接口所需等到的时间限度口所需等到的时间限度n 这些方法都将抛出例外这些方法都将抛出例外SocketException。Java网络程序设计454. Serv

51、erSocket类类n构造方法:构造方法:npublic ServerSocket(int port)npublic ServerSocket(int port, int backlog):支支持指定数目的连接持指定数目的连接npublic ServerSocket(int port, int backlog, InetAddress bindAddr)n这些方法都将抛出例外这些方法都将抛出例外IOException,程序中需要捕程序中需要捕获处理。获处理。Java网络程序设计464. ServerSocket类类主要方法主要方法npublic Socket accept() :在服务器端的指

52、定端口监听在服务器端的指定端口监听客户端发来的连接请求,并与之连接。客户端发来的连接请求,并与之连接。npublic void close() :关闭:关闭Socketnpublic InetAddress getInetAddress() :返回服务器返回服务器的的IP地址地址npublic int getLocalPort() :取得取得服务器的端口号服务器的端口号Java网络程序设计47基于基于TCP的的socket编程编程n服务器程序编写:服务器程序编写:调用调用ServerSocket(int port)创建一个服务器创建一个服务器端套接字,并绑定到指定端口上;端套接字,并绑定到指定

53、端口上;调用调用accept(),监听连接请求,如果客户端请,监听连接请求,如果客户端请求连接,则接受连接,返回通信套接字。求连接,则接受连接,返回通信套接字。调用调用Socket类的类的getOutputStream()和和getInputStream获取输出流和输入流,开始网络获取输出流和输入流,开始网络数据的发送和接收。数据的发送和接收。最后关闭通信套接字。最后关闭通信套接字。Java网络程序设计48基于基于TCP的的socket编程编程n客户端程序编写:客户端程序编写:调用调用Socket()创建一个流套接字,并连接到服创建一个流套接字,并连接到服务器端;务器端;调用调用Socket类

54、的类的getOutputStream()和和getInputStream获取输出流和输入流,开始网络获取输出流和输入流,开始网络数据的发送和接收。数据的发送和接收。 最后关闭通信套接字。最后关闭通信套接字。Java网络程序设计49基于基于TCP的的socket编程编程ServerServerServerSocket(int port)Socket accept()OutputStream Socket.getOutputStream()InputStream Socket.getInputSream()Socket.close()ClientSocket(InetAddress address

55、, int port)OutputStream Socket.getOutputStream()InputStream Socket.getInputStream()Socket.close()Java网络程序设计505. TCP Socket通信程序设计举例通信程序设计举例n【例例12.5】一个完整的实现一个完整的实现Socket通信的通信的Java程序,分别为服务器端程序和客户端程序。在这个程序,分别为服务器端程序和客户端程序。在这个程序中,程序中,TCP服务器在服务器在8000端口上倾听,等待与端口上倾听,等待与客户端连接。当建立连接后,客户端向服务器端发客户端连接。当建立连接后,客户端

56、向服务器端发送一条信息,服务器收到后再向客户端发送一条信送一条信息,服务器收到后再向客户端发送一条信息,直到客户端发送息,直到客户端发送bye结束消息传递,并拆除客结束消息传递,并拆除客户端与服务器端的连接。户端与服务器端的连接。 nserver.java client.javan分析如图示: Java网络程序设计51创建服务器创建服务器(端口号端口号)定义数据成员定义数据成员服务器等待服务器等待网络连接网络连接建立建立socket流流发送谈话信息发送谈话信息接收用户谈话信息接收用户谈话信息创建创建Socket实例实例定义数据成员定义数据成员建立建立socket流流发送谈话信息发送谈话信息接收

57、服务器谈话信息接收服务器谈话信息关闭流关闭流accept() 80008000结束谈话结束谈话(Bye.)结束谈话结束谈话(Bye.)关闭流关闭流服务器端服务器端客户端客户端Java网络程序设计525. TCP Socket通信程序设计举例通信程序设计举例Java网络程序设计536.多线程的多线程的TCP服务器服务器n在【例在【例12.5】中,服务器端的程序是单线程的,不】中,服务器端的程序是单线程的,不能支持多个客户端的并发访问。而实际应用中有很多能支持多个客户端的并发访问。而实际应用中有很多客户端客户端/服务器端服务器端应用程序,其服务器端需要同时为应用程序,其服务器端需

58、要同时为多个客户端提供服务,支持多客户端的并发访问。这多个客户端提供服务,支持多客户端的并发访问。这种访问模式的实现思想是种访问模式的实现思想是服务器端应用程序采用多线服务器端应用程序采用多线程机制程机制。n其工作过程是:主线程只负责监听,一旦有客户机其工作过程是:主线程只负责监听,一旦有客户机发出连接请求,主线程将创建一个子线程,由该子线发出连接请求,主线程将创建一个子线程,由该子线程负责该客户机的通信,主线程继续监听其他客户机程负责该客户机的通信,主线程继续监听其他客户机的连接请求。的连接请求。Java网络程序设计54 解决方案:解决方案:n 将服务器写成多线程的,主程序监听一端口,等待客

59、户接入;同时构造一个线程类,准备接管会话。当一个Socket会话产生后,将这个会话交给线程处理,然后主程序继续监听。while (true) accept a connection ; create a thread to deal with the client ; end while Serverclient1client2serverthread2serverthread1Java网络程序设计55此外此外:服务器应能支持客户间的通信服务器应能支持客户间的通信n可以在服务器端将与各客户进行通信的Socket和线程管理起来,从而各客户之间可以在服务器端的协助下进行通信。服务器服务器(4444

60、)acceptsocket客客户户2IP1 client1线程线程1客客户户1IP2 client2线程线程2Java网络程序设计56【例12.6】多线程的TCP服务器程序。服务器端的部分运行结果如图12.3所示。Java网络程序设计5712.4 数据报通信数据报通信n用户数据报协议用户数据报协议UDP是传输层的是传输层的无连接无连接通信协议。通信协议。数据报是一种在网络中独立传播的自身包含地址信息数据报是一种在网络中独立传播的自身包含地址信息的消息,它能否到达目的地、到达的时间以及到达时的消息,它能否到达目的地、到达的时间以及到达时内容能否保持不变,这些都是不能保证的。由于内容能否保持不变,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论