1、教学目标教学目标n13.1 Java网络技术概述n13.2 URL与网络应用n13.2.1 URL类n13.2.2 用applet访问URL资源n13.2.3 Web浏览器的设计n13.2.4 URLConnection类n13.3 基于流套接字的客户/服务器通信n13.3.1 InetAddress类n13.3.2 Socket类n13.3.3 ServerSocket类n13.3.4 基于流套接字的客户/服务器的通信过程n13.3.5多线程实现多用户网上聊天教学目标教学目标(续续)n13.4 基于数据报套接字方式的客户/服务器通信n13.4.1 DatagramPacket类n13.4.2
2、 DatagramSocket类n13.4.3基于数据报套接字的客户/服务器的通信应用实例13.1 Java13.1 Java网络技术概述网络技术概述nJava提供两种网络支持机制:n URL的类n用于访问Internet网上资源的应用n Socket通信的类n基于TCP/IP协议中传输层接口Socketn针对Client/Server模型的网络应用n以及实现某些特殊协议的网络应用。n网络通信包:包含有网络通信所需要的类和接口 13.1 Java13.1 Java网络技术概述网络技术概述n基于流套接字(stream sockets)的网络通信n应用程序将网络通讯看做是数据流;n面向连接的网络服
3、务n用于传送的协议是TCP(Transmission Control Protocol)协议。n基于数据报套接字(datagram sockets)的网络通信n程序将要传递的数据打包分成一个个小的数据包。n服务主机跟客户机是无连接的n传送的协议是UDP(User Datagram Protocol)协议。13.2 URL13.2 URL与网络应用与网络应用 n URL(Uniform Resource Locator):URL(Uniform Resource Locator):n用于表示用于表示InternetInternet上的网络资源上的网络资源;n利用利用URLURL对象中提供的方法,
4、可直接读写网络中的数对象中提供的方法,可直接读写网络中的数据。据。n 一个一个URLURL组成组成:协议名、主机名、端口号、路径文件(文件协议名、主机名、端口号、路径文件(文件路径及文件名)。路径及文件名)。例如,例如,http:/:80/home/homepage.htmhttp:/:80/home/homepage.htm 表示表示:协议协议:http:http,主机地址主机地址: 端口号端口号:80:80,路径文件路径文件:/home/homepage.htm:/home/homepage.htm。13.2.1 URL13.2.1 URL类类 nJava将URL封装成URL类.n创建UR
5、L对象的构造方法:(1)URL(String spec)用指定的一个String来创建一个URL对象;(2)URL(String protocol,String host,int port,String file):用指定的协议、主机名、端口号、路径文件来创建一个URL对象(3)URL(String protocol,String host,String file)用指定的协议、主机名、路径及文件名来创建URL对象;(4)URL(URL context,String spec)用已存在的URL对象来创建URL对象。13.2.1 URL13.2.1 URL类类n获取URL对象属性的常用方法:v
6、String getProtocol():获取URL传输的协议;v String getHost():获取URL的机器名称;v int getPort():获取URL的端口号;v String getFile():获取URL的文件名,包括路径和文件名;v Obect getContent():获取URL的内容;v InputStram openStream():打开与URL的连接,返回一个输入流,通过这个输入流读取数据;v URLConnection openConnection():返回与URL进行连接的URLConnection对象;13.2.1 URL13.2.1 URL类类n例例13-
7、1 URL13-1 URL对象的创建及使用。对象的创建及使用。import .import .*;public class Myurlpublic class Myurl public static void main(String args)public static void main(String args)try try URL url=new URLURL url=new URL (http:/:80/home/homepage.htm);(http:/:80/home/homepage.htm);System.out.println(the Protocol:System.out.
8、println(the Protocol:“+url.getProtocol();+url.getProtocol();System.out.println(the hostname:+url.getHost();System.out.println(the hostname:+url.getHost();System.out.println(the port:+url.getPort();System.out.println(the port:+url.getPort();System.out.println(the file:+url.getFile();System.out.printl
9、n(the file:+url.getFile();System.out.println(url.toString();System.out.println(url.toString();catch(MalformedURLException e)catch(MalformedURLException e)System.out.println(e);System.out.println(e);13.2.2 13.2.2 用用AppletApplet访问访问URLURL资源资源 n例例13-213-2利用利用AppletApplet显示网络上其他显示网络上其他HTML文档。文档。在IE浏览器执行
10、showdoc.htm文件执行后,将在新的IE窗口中显示163网站的内容。n利用applet的AppletContect接口中的方法showDocument(),将使执行Applet的浏览器显示指定的URL资源。showDocument(URL url,String target)target:指定显示URL内容的窗体.Target值为“_bank”表示在新开的窗体URL资源。/showdoc.javashowdoc.javaimport javax.swing.import javax.swing.*;import java.awt.import java.awt.*;import .imp
11、ort .*;public class showdoc extends JApplet public class showdoc extends JApplet URL docur=null;URL docur=null;public void paint(Graphics g)public void paint(Graphics g)try try docur=new URL(http:/);docur=new URL(http:/);catch(MalformedURLException e)catch(MalformedURLException e)System.out.println(
12、Can ope the URL);System.out.println(Can ope the URL);if(docur!=null)if(docur!=null)getAppletContext().showDocument(docur,_blank);getAppletContext().showDocument(docur,_blank);/showdoc.htm/showdoc.htmapplet code=showdoc.class width=600 height=50013.2.3 Web13.2.3 Web浏览器的设计浏览器的设计n用application实现一个简单的Web
13、浏览器。n使用swing GUI组件JEditorPane,显示Web服务器上的文件内容。nJEditorPane组件能显示无格式或带格式的HTML文本。nJEditorPane的方法setPage(URL url),将下载由url定位的文档并显示在JEditorPane组件中。n用户在窗体顶部的JTextField中输入URL后,将URL的HTML格式的文本,在JEditorPane中显示。13.2.3 Web13.2.3 Web浏览器的设计浏览器的设计 13.2.3 Web13.2.3 Web浏览器的设计浏览器的设计n如果JEditorPane含有的HTML文档中含有超链接,当用户单击其中
14、一个超链接时,则JEditorPane产生事件HyperlinkEvent(javax.swing.event包中),并通知所有已注册的HyperlinkListener对象。nHyperlinkListener接口的方法hyperlinkUpdate()n处理超链接事件HyperlinkEvent:n在JEditorPane中显示超链接的Web网页。13.2.3 Web13.2.3 Web浏览器的设计浏览器的设计 wcontentsArea.addHyperlinkListener(new HyperlinkListener()/if user clicked hyperlink,go to
15、 specified page public void hyperlinkUpdate(HyperlinkEvent event)if(event.getEventType()=HyperlinkEvent.EventType.ACTIVATED)getThePage(event.getURL().toString(););nHyperlinkEvent类中包含一个嵌套内部类EventType,此内部类声明的三个静态常量:nACTIVEDACTIVED(表示用户单击一个超链接以改变(表示用户单击一个超链接以改变WebWeb网页)网页)nENTEREDENTERED(表示用户把鼠标移到一个超链接
16、上)(表示用户把鼠标移到一个超链接上)nEXITED(EXITED(表示用户把鼠标移离一个超链接表示用户把鼠标移离一个超链接)。13.2.3 Web13.2.3 Web浏览器的设计浏览器的设计n例例13-313-3用用JavaJava的应用程序实现一个简单的的应用程序实现一个简单的WebWeb浏浏览器。览器。假定用户在窗体顶部的JTextField中输入google的Web地址后,将在JEditorPane中显示google的Web页面。用户单击其中一个超链接“高级搜索”,将显示超链接“高级搜索”的Web网页 13.2.4 URLConnection13.2.4 URLConnection类类
17、nURLConnectionURLConnection是一个抽象类,它提供了与是一个抽象类,它提供了与URLURL资资源的双向通信(读写操作)。源的双向通信(读写操作)。nURLConnectionURLConnection对象的构造对象的构造:通过调用通过调用URLURL对象的方法对象的方法:URLConnection openConnection()来得到一个来得到一个URLounechonURLounechon对象,但这并未建立与对象,但这并未建立与指定的指定的URLURL的连接,还必须调用的连接,还必须调用URLConnectionURLConnection对对象的象的connect(
18、)connect()方法建立连接。方法建立连接。13.2.4 URLConnection13.2.4 URLConnection类类nURLConnectionURLConnection对象的常用方法:对象的常用方法:void connect():void connect():打开到此打开到此 URL URL 引用的资源的通信链接。引用的资源的通信链接。int getContentLength()int getContentLength():获得文件的长度;:获得文件的长度;String getContentType()String getContentType():获得文件的类型;:获得文件
19、的类型;long getDate()long getDate():获得文件创建的时间;:获得文件创建的时间;long getLastModified()long getLastModified()/获得文件最后修改的时间;获得文件最后修改的时间;InputStream getInputStream()InputStream getInputStream():获得输入流,以便读:获得输入流,以便读取文件的数据;取文件的数据;OutputStream getOutputStream()OutputStream getOutputStream():获得输出流,以便:获得输出流,以便写文件。写文件。1
20、3.2.4 URLConnection13.2.4 URLConnection类类n例例13-4 13-4 从从WebWeb服务器上将服务器上将URLURL文件下载到本机,文件下载到本机,并将文件的信息显示到屏幕。并将文件的信息显示到屏幕。该程序运行后,将文件http:/:80/home/homepage.htm 下载到本机的当前文件夹下,并在屏幕上输出文件homepage.htm内容。13.3 13.3 基于流套接字的客户基于流套接字的客户/服务器通信服务器通信 n基于流套接字的数据传递方式:n在两个网络应用程序(服务器应用和客户机应用)之间发送和接收信息时,需要建立一个可靠的连接。nJav
21、a中与流套接字相关的类:nInetAddress对象描绘了32位或128位IP地址nServerSocket对象用在服务器应用中nSocket对象是建立网络连接时使用的 nInternet上通过IP地址或域名标识主机,而类InetAddress用来表示与Internet地址的相关的操作。nInetAddress类没有构造方法,要创建该类的实例对象,通过该类的静态方法获得该对象。13.3.1 InetAddress13.3.1 InetAddress类类 13.3.1 InetAddress13.3.1 InetAddress类类nInetAddress类的常用一组静态方法:InetAddres
22、s getLocalHost():获得本地机的 InetAddress对象。InetAddress getByName(Stung host):获得由host指定的InetAddress对象,host是计算机的域名。InetAddressgetAllmyName(String host):在Web中,可以用相同的名字代表一组计算机获得具有相同名字的一组InetAddress对象。13.3.1 InetAddress13.3.1 InetAddress类类nInetAddrss对象的常用一组方法:byte getAddress():得到IP地址;String getHostName():得到主机
23、名字;String toString():得到主机名和IP地址的字符串。13.3.1 InetAddress13.3.1 InetAddress类类n例例13-5 InetAddress13-5 InetAddress类的应用类的应用.程序运行的机器已经与Internet网连接好,程序运行后的输出结果:import .import .*;class InternetAddress class InternetAddress public static void main(String args)public static void main(String args)trytry InetAdd
24、ress iads;InetAddress iads;iads=InetAddress.getByName();iads=InetAddress.getByName();System.out.println(hostname=+System.out.println(hostname=+iads.getHostName();iads.getHostName();System.out.println(iads.toString();System.out.println(iads.toString();catch(Exception e)catch(Exception e)System.out.pr
25、intln(e);System.out.println(e);13.3.2 Socket13.3.2 Socket类类 nSocket是建立网络连接时使用的n在连接成功时,客户和服务器应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。n当客户程序需要与服务器程序通讯的时候,客户程序在客户机要创建一个Socket对象。nSocket类的常用构造方法:(1)Socket(InetAddress addr,int port)(2)Socket(String host,int port)两个构造方法都创建了一个用于连接服务器主机和指定端口的客户端流套接字。13.3.2 Socke
26、t13.3.2 Socket类类n在创建了一个Socket对象,应用程序n通过调用Socket对象的getInputStream()方法:获得输入流,以读取对方传送来的信息;n通过调用Socket对象的 getOutputStream()方法获得输出流,向对方发送消息。n在读写活动完成之后,调用close()方法关闭流和流套接字。n例如:创建了一个服务器应用的主机地址为198.163.227.6,端口号为50000的客户端Socket对象,然后从这个新创建的Socket对象中读取输入流和输出流,最后再关闭Socket对象和流。13.3.2 Socket13.3.2 Socket类类Socket
27、 s=new Socket(198.163.227.6,50000);InputStream inputstream=s.getInputStream();OutputStream outputstream=s.getOnputStream();./Read or write from the inputstream/outputstreaminputstream.close();outputstream.close();connection.close();13.3.3 ServerSocket13.3.3 ServerSocket类类n服务器程序需要创建一个ServerSocket对象,用
28、于在指定端口上监听客户端连接请求。nServerSocket类的构造方法:(1)ServerSocket(int port)ServerSocket(int port)在指定端口上创建一个ServerSocket对象。服务器应用使用ServerSocket监听指定的端口,端口建议使用大于1024。(2)ServerSocket(int port,int queueLength)Server在指定端口上监听客户端连接请求,并指定允许连接的客户最大数目。13.3.3 ServerSocket13.3.3 ServerSocket类类n创建一个ServerSocket对象后,接下来服务程序进入无限循
29、环之中.n无限循环从调用ServerSocket的accept()方法开始,n在调用开始后,accept()方法将导致调用线程阻塞直到连接建立。n在建立连接后accept()返回一个最近创建的Socket对象,该Socket对象绑定了客户程序的IP地址或端口号。n然后双方就可利用建立起来的流套接字进行通信。13.3.4 13.3.4 基于流套接字的客户基于流套接字的客户/服务器的通信过程服务器的通信过程 传送数据连接成功请求连接(1)为客户机创建Socket对象注册服务器地址和端口,请求连接连接成功时建立Socket连接对象(2)用Socket连接创建流对象:OutputStream和 Inp
30、utStream(4)关闭连接,关闭Stream(3)通过流进行通信数据处理用InputStream对象发送数据用OutputStream接受数据创建ServerSocket对象对象(1)创建ServerSocket对象注册服务器端口和允许连接的用户最大数服务器端应用(2)ServerSocket对象.accept()监听来自客户端的连接连接成功时建立Socket连接对象(3)用Socket连接创建流对象:OutputStream和 InputStream(4)通过流进行通信数据处理用InputStream对象发送数据用OutputStream接受数据创建ServerSocket对象对象(5)
31、关闭连接,关闭Stream客户端应用13.3.4 13.3.4 基于流套接字的客户基于流套接字的客户/服务器的通信过程服务器的通信过程n例子说明如何建立服务器的应用和客户机的应用。例13-7 客户端的应用.运行输出结果:例13-6 服务器端的应用.运行输出结果:13.3.5 13.3.5 多线程实现多用户网上聊天多线程实现多用户网上聊天 n实现多用户网上能同时聊天,由于存在单个服务器程序与多个客户程序通讯的可能,要求:l 服务器程序响应客户程序不应该花很多时间,否则客户程序在得到服务前有可能花很多时间来等待通讯的建立l 还有,服务程序和客户程序的会话有可能是很长的(与电话类似)n为了加快对客户
32、程序连接请求的响应,典型的方法:n服务器主机在响应每一个客户连接请求时运行一个后台通信服务线程,n这个后台线程处理和客户程序之间的通讯。n又由于在服务器主机上创建每一个后台通信服务线程,都需要花费一定的主机资源,因此对允许与服务器连接的客户数应有一个限制。13.3.5 13.3.5 多线程实现多用户网上聊天多线程实现多用户网上聊天 例例13-8 13-8 服务器聊天程序的实现服务器聊天程序的实现.nChatServer.javaChatServer.java声明了一个外部类声明了一个外部类ChatServer ChatServer 和一个内部类和一个内部类CommunicationThread
33、CommunicationThread。n在在ChatServerChatServer类的类的main()main()方法方法:创建了一个创建了一个ChatServerChatServer对象,对象,并通过调用构造方法来创建并通过调用构造方法来创建ServerSocketServerSocket对象,以监听端口对象,以监听端口5000050000上的连接请求,如果连接成功上的连接请求,如果连接成功,ChatServer,ChatServer进入一个无进入一个无限循环中,交替调用限循环中,交替调用ServerSocketServerSocket的的accept()accept()方法来等待连方法
34、来等待连接请求,同时启动后台线程处理连接(接请求,同时启动后台线程处理连接(accept()accept()返回的请求)。返回的请求)。n后台线程由后台线程由CommunicationThreadCommunicationThread继承的继承的start()start()方法开始,并方法开始,并执行执行CommunicationThreadCommunicationThread的的run()run()方法中的代码。方法中的代码。一旦一旦run()run()方法运行,线程将向当前连接的客户应用发送用户号方法运行,线程将向当前连接的客户应用发送用户号clientIDclientID,接着循环读此
35、用户发送来的聊天信息,接着循环读此用户发送来的聊天信息,并转发给当并转发给当前参与聊天的各个用户,直到此用户发出信息前参与聊天的各个用户,直到此用户发出信息“stop chatstop chat”为为止。止。n运行运行ChatChatServer.classServer.class后,就可以运行多个后,就可以运行多个ChatClientChatClient程序。程序。13.3.5 13.3.5 多线程实现多用户网上聊天多线程实现多用户网上聊天 例例13-9 13-9 客户端聊天程序的实现客户端聊天程序的实现.n客户端聊天程序是一个客户端聊天程序是一个AppletApplet。功能:。功能:n提
36、供客户聊天界面,用于输入信息和显示信息;提供客户聊天界面,用于输入信息和显示信息;n接受通过服务器转发的其它客户聊天信息并显示。接受通过服务器转发的其它客户聊天信息并显示。n两个客户端聊天程序的界面两个客户端聊天程序的界面:13.4 13.4 基于数据报套接字方式的客户基于数据报套接字方式的客户/服务器通信服务器通信 n数据报套接字:n无连接的的数据传递方式。n它的传输速度快,n但不能保证所有数据都能到达目的地,所以一般用于非重要的数据传输。n与数据报套接字相关的有三个类,位于包。nDatagramPacket类:用来创建数据包nDatagramSocket:用于发送和接收数据包的套接字nMu
37、lticastSocket:描绘了能进行多点传送的套接字,13.4.1 DatagramPacket13.4.1 DatagramPacket类类n使用数据报方式首先将数据打包.DategramPacket类用来创建数据包。数据包分有两种:n要发送数据的数据包,该数据包有要到达的目的地址;n用来接收数据的数据包。(1)要创建接受数据包,使用DatagramPackett类的构造方法:DatagramPacket(byte ibuft,int ilength)ibuf:接受数据包的存储数据的缓冲区,ilength:从传递过来的数据包中读取的字节数。13.4.1 DatagramPacket13.
38、4.1 DatagramPacket类类(2)要创建发送数据包,使用DatagramPacket类的构造方法:DatagramPacket(byt ibuf,int ilength,InetAddrss iaddr,int port)ibuf:要发送数据的缓冲区;ilength:发送数据的字节数;iaddr:数据包要传递到的目标地址;iport:目标地址的程序接受数据包的端口号。13.4.1 DatagramPacket13.4.1 DatagramPacket类类nDatagramPacket数据包对象的操作方法,以获取数据包的信息:(1)netAddrss getAddrss()获得数据包
39、要发送的目标地址(2)bytegetData()获得数据包中的数据(3)public int getLength()获得数据包中数据的长度(4)int getPOrt()获得数据包中的目标地址的主机端口号 13.4.2 DatagramSocket13.4.2 DatagramSocket类类 n发送和接收数据包,需要发送和接收数据包的DatagramSocket对象,用DatagramSocket类构造此对象。nDatagramSocket类的构造方法如下:(1)Datagramsocket():用本地机上任何一个可用的端口,创建一个发送或接收数据包的套接字。(2)DatagramSocke
40、t(int port)用一个指定的端口,创建一个发送/接受数据包的套接字。13.4.2 DatagramSocket13.4.2 DatagramSocket类类nDatagramSocket对象的方法:(1)void receive(Datagrampacket p):接收数据包。(2)void send(DatagramPacket p):发送数据包。(3)int getLocalPort():得到本地机的端口。13.4.3 13.4.3 基于数据报套接字的客户基于数据报套接字的客户/服务器的通信应用实例服务器的通信应用实例n基于数据报套接字的方式下,服务器应用程序和客户机应用程序之间发送
41、和接收信息。完成的功能:n在客户端应用程序中,用户在文本框中输入一行信息,按下回车键后,会将此行信息发送到服务器上。n服务器接受到此信息后,将此信心在服务器的GUI界面上显示,并完成将此行信息发回到客户机上。n客户即收到此信息后,即将此信息显示。例例13-1013-10服务器应用程序的实现服务器应用程序的实现.Server.java中完成:n构造方法:n建立了GUI界面,显示接收到的数据包,n建立了的服务器套接字DatagramSocket对象,并将服务器套接字绑定在端口5000上。n方法waitForPackets(),用无限循环等待客户发送过来的数据分组。n建立一个接收数据包Datagra
42、mPacket对象,n用socket的方法receive等待数据包到达服务器,此方法的调用一直阻塞,直到分组到来,则将分组存储到receivePacket中。n接着调用方法displayMessage,将分组信息显示。n调用sendPacketToClient()将服务器接收到的分组发回到客户机。n方法sendPacketToClient(DatagramPacket receivePacket)n创建发送数据包 DatagramPacket对象sendPacket,然后调用socket的方法send将数据包发送出去。n在main方法:n创建服务器应用程序类Server的对象,n调用方法wai
43、tForPacket(),等待客户发送过来的数据分组。例例13-1113-11客户机应用程序的实现。客户机应用程序的实现。客户应用程序类客户应用程序类Client.javaClient.java完成的任务:完成的任务:n构造方法构造方法:建立了建立了GUIGUI界面供输入信息和显示接收到的数据包。界面供输入信息和显示接收到的数据包。n建立了的套接字建立了的套接字DatagramSocketDatagramSocket对象。对象。n在输入文本字段的事件处理代码在输入文本字段的事件处理代码actionPerformedactionPerformed方法中方法中n取用户输入的信息,创建要发送给服务器
44、的数据包,在此构造数据包对象时,取用户输入的信息,创建要发送给服务器的数据包,在此构造数据包对象时,将服务器的主机地址和端口号捆绑。接着用将服务器的主机地址和端口号捆绑。接着用DatagramSocketDatagramSocket对象的方法对象的方法send()send()发送数据包。发送数据包。n方法方法waitForPackets()waitForPackets(),用无限循环等待服务器发送过来的数据,用无限循环等待服务器发送过来的数据分组。分组。n首先建立一个接收数据包首先建立一个接收数据包DatagramPacketDatagramPacket对象对象,用用socketsocket的
45、方法的方法receivereceive等等待数据包到达服务器,此方法的调用一直阻塞,直到分组到来,则将分组待数据包到达服务器,此方法的调用一直阻塞,直到分组到来,则将分组存储到存储到receivePacketreceivePacket中。中。n接着调用方法接着调用方法displayMessagedisplayMessage,将分组信息显示。,将分组信息显示。n在在mainmain方法方法:n先创建客户应用程序类先创建客户应用程序类ClientClient的对象,的对象,n调用方法调用方法waitForPackets()waitForPackets(),等待服务器发送过来的数据分组。,等待服务器发送过来的数据分组。n 小结小结 nJava 提供的网络功能按层次使用分为:URL、流套接字和数据报套接字。nURL类:为访问网络资源提供的API接口,利用URL对象中的方法可以直接读取网络中的资源;nURLConnection类:可双向访问(及可读可写)网络上的资源。n流套接字:面向连接的网络服务,用于传送的协议是TCP协议。n数据报套接字:无面向连接的网络服务,传送的协议是UDP协议。n 习题习题n1,2,3,4n实验20小结小结作业书上本章习题中:3 4 5 6.7.8.9.
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。