《教学课件第十一章Java的网络功能》由会员分享,可在线阅读,更多相关《教学课件第十一章Java的网络功能(48页珍藏版)》请在金锄头文库上搜索。
1、第十一章第十一章JavaJava的网络功能的网络功能n主要内容:主要内容:1 1、了解、了解URLURL的构成,学会利用的构成,学会利用URLURL读取网络资读取网络资源源2 2、熟悉、熟悉包包3 3、了解、了解TCP/IPTCP/IP协议协议4 4、掌握、掌握SocketSocket的基本使用方法,学会建立的基本使用方法,学会建立SocketSocket连接,实现客户端和服务器端通信连接,实现客户端和服务器端通信5 5、掌握利用、掌握利用UDPUDP通信的方法通信的方法6 6、了解多客户端通信概念,掌握进行多客户、了解多客户端通信概念,掌握进行多客户通信的方法通信的方法n11.111.1基本
2、知识基本知识n11.1.1 11.1.1 计算机网络就是利用通信线路连计算机网络就是利用通信线路连接起来的、相互独立的,计算机集合接起来的、相互独立的,计算机集合n计算机协议就是针对计算机进行通信计算机协议就是针对计算机进行通信时,关于信息交互方式、交互秩序等所时,关于信息交互方式、交互秩序等所作出的规定。作出的规定。n常用协议:常用协议:nTCPTCP、IPIP、UDPUDP、SNMPSNMP、SMTPSMTP、FTPFTP、HTTPHTTP11.1.3 Java11.1.3 Java的网络功能的网络功能作为一门成功的网络编程语言,作为一门成功的网络编程语言,JavaJava为用户提供了十分
3、完善的网络功能:为用户提供了十分完善的网络功能:获取网络上的各种资源获取网络上的各种资源与服务器建立连接和通信与服务器建立连接和通信传递本地数据传递本地数据当一个进程向另一个进程发送数据当一个进程向另一个进程发送数据时,只需将数据写入到相应接口的输出时,只需将数据写入到相应接口的输出流上,而另一个进程在接口的流上,而另一个进程在接口的“另一端另一端”从输入流上读取数据从输入流上读取数据JavaJava是通过使用流模式来实现网络是通过使用流模式来实现网络信息交互的。这种模式下,一个接口同信息交互的。这种模式下,一个接口同时拥有两个流输入流和输出流。时拥有两个流输入流和输出流。11.1.4 11.
4、1.4 通信模式通信模式JJ包提供了低级和高级的包提供了低级和高级的网络功能。它包含了大部分用于访问网络功能。它包含了大部分用于访问网络资源的类。网络资源的类。11.1.5 J包一、用于网络定位的类一、用于网络定位的类URLURL类类URLConnectionURLConnection类类HttpURLConnectionHttpURLConnection类类InetAddressInetAddress类类二、用于建立服务器和客户端通信的类二、用于建立服务器和客户端通信的类SocketSocket类类ServerSocketServerSocket类类三、基于数据报的通信三、基于数据报的通信D
5、atagramSocketDatagramSocketDatagramPacketDatagramPacket类类11.211.2网络功能与使用方法网络功能与使用方法n11.2.1 URL11.2.1 URLn这种方法是通过这种方法是通过URLURL的网络资源表达的网络资源表达式形式确定数据在网络中的位置,利用式形式确定数据在网络中的位置,利用URLURL类中提供的方法,直接读入网络中的类中提供的方法,直接读入网络中的数据,或者将本地数据传送到网络的另数据,或者将本地数据传送到网络的另一端。一端。网络功能按层次与使用方法分为三类网络功能按层次与使用方法分为三类n11.2.2 Socket11.
6、2.2 Socketn是指两个程序通过网络进行通信的是指两个程序通过网络进行通信的一种方式。在一种方式。在TCP/ IPTCP/ IP协议下,客户端和协议下,客户端和服务器端通常使用服务器端通常使用socketsocket来进行信息交来进行信息交流。这种方式也是传统中常用的一种方流。这种方式也是传统中常用的一种方式。式。11.2.3 DataGram11.2.3 DataGramnDatagramDatagram方式是三种网络功能中最方式是三种网络功能中最低级的一种,它是一种面向非连接的、低级的一种,它是一种面向非连接的、以数据报方式工作的通信以数据报方式工作的通信。适用于网络适用于网络状况不
7、稳定下的数据传输和访问状况不稳定下的数据传输和访问11.311.3URLURL11.3.1 Internet11.3.1 Internet上的寻址上的寻址 IP IP是标识连接到是标识连接到InternetInternet上的上的计算机的唯一的数字地址。计算机的唯一的数字地址。IPIP地址实际上是用地址实际上是用3232位二进制数组成,位二进制数组成,如:如:202.199.28.6.202.199.28.6.人们更熟悉的是它的符号形式,也就是人们更熟悉的是它的符号形式,也就是域名,如:域名,如: 。URLURL标识了计算机上的所有资源标识了计算机上的所有资源URLURL是是Unoform R
8、esource LocatorUnoform Resource Locator的缩写。的缩写。URLURL的基本结构:的基本结构: :/:password/:/:password/ 如:如:http:/http:/download-windows.htmldownload-windows.htmlnURLURL对象是通过定义在对象是通过定义在JJ包中的包中的URLURL类来进行构造的。构造方法有四种:类来进行构造的。构造方法有四种:n1.Public URL(String spec)1.Public URL(String spec)n spec spec表示表示URLURL的字符串的字符串n例
9、:例:URL url1=new /”)URL url1=new /”)n2.Public URL(URL context,String 2.Public URL(URL context,String spec)spec)n 用于表示相对用于表示相对URLURL位置的定义。位置的定义。n例:例:URL url2=new URL url2=new nURL(getCodeBase(),”myfile.text”)URL(getCodeBase(),”myfile.text”) n3.public URL(String protocol,3.public URL(String protocol,n
10、String host,String file) String host,String file)n4. public URL(String protocol,4. public URL(String protocol,n String host,int port,String file) String host,int port,String file)nString protocolString protocol协议协议nString hostString host主机名主机名nint portint port端口端口nString fileString file文件名文件名二二. .与与
11、URLURL相关的异常相关的异常在使用上述构造方法时,会存在某些问题,因在使用上述构造方法时,会存在某些问题,因此,在类此,在类URLURL的构造方法中都声明抛出非运行的构造方法中都声明抛出非运行时异常时异常MalformedURLException,MalformedURLException,所以在生所以在生成成URLURL对象时要捕获,进行异常处理。对象时要捕获,进行异常处理。例:例:URLURLurl3=newURL(“http”,url3=newURL(“http”, ””,”myfile.txt”)””,”myfile.txt”)例:例:URLURLurl4=newURL(“http
12、”,url4=newURL(“http”, ””,80,”myfile.txt”)””,80,”myfile.txt”)三三. .常用方法常用方法String getProtocol()String getProtocol()获取传输协议获取传输协议String getHost()String getHost()获取主机名称获取主机名称String getPort()String getPort()获取通信端口号获取通信端口号String getFile()String getFile()String toString()String toString() 获取资源文件名获取资源文件名称称Tr
13、yTryURLURLurl3=newurl3=newURL(“http”,URL(“http”, ””,”myfile.txt”) ””,”myfile.txt”) catch(MalformedURLException e)catch(MalformedURLException e) . . 创建创建URLURL对象、链接到相应主页的代码:对象、链接到相应主页的代码: try try url1=new URL(s1); url1=new URL(s1); catch(MalformedURLException g) catch(MalformedURLException g) (“ (“不正
14、确的不正确的 URL:+url1);URL:+url1); text1.setText( text1.setText(哈尔滨工业大学哈尔滨工业大学);); getAppletContext().showDocument(url1);getAppletContext().showDocument(url1); 例:链向另外的例:链向另外的WebWeb页页UrlEx.javaUrlEx.java用于建立流的代码:用于建立流的代码:trytryurl=new URL(getCodeBase(),ReadFromUrl.java);url=new URL(getCodeBase(),ReadFromU
15、rl.java);dis=dis=new DataInputStream(url.openStream();new DataInputStream(url.openStream();catch(MalformedURLException q)catch(MalformedURLException q)System.out.println(MalformedURLException:+qSystem.out.println(MalformedURLException:+q);); InputStream openStream() InputStream openStream() 打开输入流打开输
16、入流 用以读取用以读取URLURL位置的数据,其返回值是位置的数据,其返回值是一个一个InputStreamInputStream数据流数据流例:读指定文件在屏幕上显示例:读指定文件在屏幕上显示 ReadFromURL.java ReadFromURL.java从流中读取数据的代码:从流中读取数据的代码:trytry while(readstring=while(readstring=dis.readLine()!=dis.readLine()!=null)null) e.drawString(readstring,10,i );e.drawString(readstring,10,i );
17、i=i+20; i=i+20; e.drawString(end of the e.drawString(end of the file,10,i);file,10,i); dis.close(); dis.close(); catch(IOException g)catch(IOException g) System.out.println(IOException:+g);System.out.println(IOException:+g);11.411.4同服务器进行通信同服务器进行通信11.4.1 11.4.1 套接字(套接字(SocketSocket和和ServerSocket)Ser
18、verSocket)IPIP地址标识地址标识InternetInternet上的计算机上的计算机端口号标识正在计算机上运行的进程端口号标识正在计算机上运行的进程端口号定义为端口号定义为0-655350-65535之间的一个之间的一个1616位整数,其中位整数,其中0 010231023被一些特定被一些特定服务器占用如:服务器占用如:telnettelnet占用端口占用端口2323httphttp占用端口占用端口8080SMTPSMTP占用端口占用端口2525端口号与端口号与IPIP地址的组合得出一个网络套接字地址的组合得出一个网络套接字普通用户端口号普通用户端口号只能是只能是1024-6553
19、5之间之间11.4.2 客户端建立套接字客户端建立套接字客户端程序可使用客户端程序可使用SocketSocket类建立与服务器的套接字类建立与服务器的套接字连接,连接,SocketSocket类的构造方法是:类的构造方法是:例:例:Socket mysocket=new Socket(Socket mysocket=new Socket( “http:/ “http:/ host,int port)Socket(String host,int port) host- host-服务器地址服务器地址 port- port-端口号端口号当当 用本地机充当用本地机充当服务器时服务器时,host用用“
20、localhost”表示表示Socket mysocket=new Socket(Socket mysocket=new Socket( “ localhost”,2880); “ localhost”,2880);建立套接字时可能发生建立套接字时可能发生IOExceptionIOException异常,应当捕异常,应当捕获,格式如下:获,格式如下:trytry Socket mysocket=new Socket( Socket mysocket=new Socket( “http:/”,2880);“http:/”,2880); catch(IOException e) . catch(I
21、OException e) .当套接字连接当套接字连接mysocketmysocket建立后可使用建立后可使用getInputStreamgetInputStream()()方法获得一个输入流方法获得一个输入流,用于接收服务器发来的信用于接收服务器发来的信息息使用使用getOutputStream()getOutputStream()方法获得一个输出流方法获得一个输出流,用用于将信息发送至服务器端于将信息发送至服务器端11.4.3 11.4.3 建立服务器套接字建立服务器套接字为响应客户端的呼叫,服务器端必须建立一个等为响应客户端的呼叫,服务器端必须建立一个等待接收客户套接字的服务器套接字待接
22、收客户套接字的服务器套接字可用可用ServerSocketServerSocket类创建服务器套接字类创建服务器套接字ServerSocketServerSocket的构造方法是:的构造方法是:ServerSocket(int port)ServerSocket(int port)port-port-客户端建立连接时使用的同一端口号客户端建立连接时使用的同一端口号ServerSocket serversocket=new ServerSocket serversocket=new ServerSocket( ServerSocket(28802880);); Socket mysocket=n
23、ew Socket mysocket=new Socket(“ localhost”,Socket(“ localhost”,28802880););建立服务器套接字时可能发生建立服务器套接字时可能发生IOExceptionIOException异异常,应当捕获,格式如下:常,应当捕获,格式如下:trytry ServerSocket serversocket=new ServerSocket serversocket=new ServerSocket(2880); ServerSocket(2880); catch(IOException e)catch(IOException e) . .
24、11.4.4 11.4.4 接收客户端套接字接收客户端套接字当服务器端的套接字连接当服务器端的套接字连接serversocketserversocket建立后,可使建立后,可使用用ServerSocketServerSocket类中的类中的accept()accept()方法接收客户端套接方法接收客户端套接字字mysocket, mysocket, 格式为:格式为: 接收客户端套接字的过程也可能发生接收客户端套接字的过程也可能发生IOExceptionIOException异常,应当捕获异常,应当捕获: :trytry Socket sc=serversocket.accept(); Sock
25、et sc=serversocket.accept(); catch(IOException e).catch(IOException e).Socket sc=serversocket.accept();Socket sc=serversocket.accept();n收到客户套接字后,放到一个收到客户套接字后,放到一个SocketSocket对对象象scsc中,那么服务器套接字中,那么服务器套接字scsc就是客户就是客户端套接字端套接字mysocketmysocket。n服务器端也可以通过服务器套接字服务器端也可以通过服务器套接字scsc使使用方法用方法 getInputStream()g
26、etInputStream() 获得一个输获得一个输出流有,用于向客户端发送信息出流有,用于向客户端发送信息n使用方法使用方法 getOutputStream getOutputStream() () 获得一个获得一个输入流,用于接收客户端发来的信息输入流,用于接收客户端发来的信息客户端客户端服务器端服务器端ServerSocket(port)accept()OutputStreamInputStreamOutputStreamInputStreamclose()close() Socket(host,port)建立客户端建立客户端套接字套接字建立服务器端建立服务器端套接字套接字接收客户接收客
27、户套接字套接字获得客户端获得客户端输入输出流输入输出流获得服务器端获得服务器端输入输出流输入输出流网络连接模式网络连接模式至此,就将网络至此,就将网络通信转化为通信转化为IO操作操作trytrymysocket=new mysocket=new Socket(localhost,3456); Socket(localhost,3456); in=new DataInputStream( in=new DataInputStream( mysocket.getInputStream();mysocket.getInputStream(); out=new DataOutputStream( ou
28、t=new DataOutputStream( mysocket.getOutputStream();mysocket.getOutputStream();建立套接字,建立套接字,获得获得IO对象对象out.writeUTF(hello!);out.writeUTF(hello!);向服务器发送信息向服务器发送信息while(true)while(true) s=in.readUTF(); s=in.readUTF(); if(s!=null) break;if(s!=null) break; mysocket.close(); mysocket.close(); 等待接收服务器等待接收服务器
29、发送的信息发送的信息例:一个简单的通信程序客户例:一个简单的通信程序客户端的主要代码端的主要代码ncatch(IOException e)catch(IOException e)n System.out.println(not System.out.println(not nconnected);connected);n System.out.println(s); System.out.println(s);n trytryserver=new ServerSocket(3456);server=new ServerSocket(3456);catch(IOException e1)catc
30、h(IOException e1) System.out.println(Error:+e1);System.out.println(Error:+e1);建立服务器端建立服务器端套接字套接字trytry client=server.accept();client=server.accept(); in=new DataInputStream(in=new DataInputStream(client.getInputStream();client.getInputStream(); out=new DataOutputStream( out=new DataOutputStream(clie
31、nt.getOutputStream();client.getOutputStream();接收客户端接收客户端套接字套接字n服务器端程序主要代码服务器端程序主要代码nwhile(true)while(true)n s=in.readUTF();s=in.readUTF();n if(s!=null) break; if(s!=null) break; n nout.writeUTF(Hello,i am server.);out.writeUTF(Hello,i am server.);nyou.close();you.close(); n catch(IOException e) catc
32、h(IOException e)n System.out.println(Erro:+e); System.out.println(Erro:+e);n 接收客户端信息接收客户端信息并给出应答并给出应答五五. .服务多个客户服务多个客户如果允许多个客户同时连接到服务器上,可以利如果允许多个客户同时连接到服务器上,可以利用多线程来实现。用多线程来实现。s=new ServerSocket(portnub);for (;) Socket incoming = s.accept( ); . new ThreadHandler(incoming, i).start(); i+; npublic voi
33、d run() n tryn DataInputstream in = new DataInputstream n(incoming.getInputStream();n DataOutputStream out = new DataOutputStreamn (incoming.getOutputStream(); n out.println( Hello! Enter BYE to exit. );n boolean done = false;n while (!done)n String str = in.readLine();n if (str = null) done = true;
34、n 。 例:一个聊天程序11.511.5基于数据报的通信基于数据报的通信数据报是一种无连接的通信服务数据报是一种无连接的通信服务数据报的特点:数据报的特点: 速度快速度快 稳定性差稳定性差DatagramSocketDatagramSocket类实现了一种适用于数据报的类实现了一种适用于数据报的socketsocket,用于监听本地主机上的指定端口,用于监听本地主机上的指定端口DatagramPacketDatagramPacket类实现了从指定的缓冲区接收数据,类实现了从指定的缓冲区接收数据,通过通过DatagramSocketDatagramSocket实例调用实例调用receive()r
35、eceive()使其处于使其处于堵塞状态,一直到接收到数据为止。堵塞状态,一直到接收到数据为止。11.5.1 11.5.1 接收数据报接收数据报创建一个创建一个DatagramSocketDatagramSocket实例用来监听本地主机上实例用来监听本地主机上的指定端口的指定端口 DatagramSocket socket=new DatagramSocket socket=new DatagramSocket(9999); DatagramSocket(9999);创建一个创建一个DatagrampacketDatagrampacket实例,用以从指定的缓实例,用以从指定的缓冲区接收数据冲区
36、接收数据DatagramPacket packet=new DatagramPacket packet=new DatagramPacket(buffer,buffer.length);DatagramPacket(buffer,buffer.length);用用DatagramSocketDatagramSocket提供的方法提供的方法receive()receive()接收数据接收数据socket.receive(packet);socket.receive(packet);n例:下面为一接收数据报程序n public class UDPGet extends Frame n implem
37、ents ActionListenernTextArea textArea1=new TextArea();n Button button1=new Button();n public static void main(String args)n UDPGet get=new UDPGet();n get.setLocation(100,100);n get.setSize(300,200);n get.show();n get.waitForData();n n npublic UDPGet()ntryn this.setTitle(接收数据报);n textArea1.setText();
38、n button1.setLabel(退出);n this.add(textArea1,BorderLayout.CENTER);n this.add(button1,BorderLayout.SOUTH);n button1.addActionListener(this);n catch(Exception e)e.printStackTrace() nvoid waitForData()n tryn byte buffer=new byte1024;nDatagramPacket packet=new nDatagramPacket(buffer,buffer.length);nDatag
39、ramSocket socket=new nDatagramSocket(9999);n nwhile(true)n socket.receive(packet);n String s=new String(buffern ,0,packet.getLength();n textArea1.append(s+n);n packet=new DatagramPacket( nbuffer,buffer.length);n n catch(Exception e) npublic void actionPerformed(n ActionEvent e)nComponent com=n(Compo
40、nent)e.getSource();nif(com.equals(button1)n System.exit(0);n二二. .发送数据报发送数据报首先创建一个首先创建一个DatagramPacketDatagramPacket实例,用于指定要发送实例,用于指定要发送的数据、数据长度、目的地主机名的端口号的数据、数据长度、目的地主机名的端口号DatagramPacket packet=new DatagramPacket( DatagramPacket packet=new DatagramPacket( message,len,”localhost”,9999);message,len,”
41、localhost”,9999);messagemessage为一为一bytebyte型数组型数组再用再用DatagramSocketDatagramSocket类对象的成员方法类对象的成员方法send() send() 来来发送数据发送数据socket.send(packet);socket.send(packet);例:下面为一个发送数据的例子npublic class UDPSend extends Frame n implements ActionListenern GridLayout net;n TextField textField1=new TextField();n Butt
42、on button1=new Button();n Button button2=new Button();n npublic static void main(String args)nn UDPSend send=new UDPSend();n send.setLocation(100,100);n send.setSize(300,150);n send.show();n npublic UDPSend()ntry n this.setTitle(发送数据报);n button1.setLabel(发送);n button2.setLabel(退出);n net=new GridLayo
43、ut(3,1);n setLayout(net);n this.add(textField1,null);n this.add(button1,null);nthis.add(button2,null);ntextField1.addActionListener(this); nbutton2.addActionListener(this);nbutton1.addActionListener(this);n ncatch(Exception e)ne.printStackTrace();n nvoid sendData() try String msg=textField1.getText(
44、); if(msg.equals() return; textField1.setText(); InetAddress address=InetAddress .getByName(localhost); int len=msg.length(); byte message=new bytelen; msg.getBytes(0,len,message,0); DatagramPacket packet=new DatagramPacket(message,len,address,9999); DatagramSocket socket=new DatagramSocket(); socke
45、t.send(packet); catch(Exception e) public void actionPerformed(ActionEvent e)Component com=(Component)e.getSource();if(com.equals(button1) sendData();else if(com.equals(button2) System.exit(0); else sendData(); nvoid sendData()n tryn String msg=textField1.getText();n if(msg.equals()n return;n textFi
46、eld1.setText();n InetAddress address=InetAddressn .getByName(localhost);n int len=msg.length();n byte message=new bytelen;n msg.getBytes(0,len,message,0);n DatagramPacket packet=new n DatagramPacket(n message,len,address,9999);n DatagramSocket socket=new n DatagramSocket();n socket.send(packet);n catch(Exception e). npublic void actionPerformed(n ActionEvent e)nComponent com=(Componentn )e.getSource();nif(com.equals(button1)n sendData();nelse if(com.equals(button2)n System.exit(0);n elsen sendData();