收藏 分享(赏)

网络编程49284.ppt

上传人:dzzj200808 文档编号:3334377 上传时间:2018-10-14 格式:PPT 页数:68 大小:494KB
下载 相关 举报
网络编程49284.ppt_第1页
第1页 / 共68页
网络编程49284.ppt_第2页
第2页 / 共68页
网络编程49284.ppt_第3页
第3页 / 共68页
网络编程49284.ppt_第4页
第4页 / 共68页
网络编程49284.ppt_第5页
第5页 / 共68页
点击查看更多>>
资源描述

1、网络编程,本章的主要内容,网络编程的相关概念 Java对网络编程的支持URL及应用 InetAddress以及NetworkInterface的应用 使用TCP协议的Socket编程 数据报通信(UDP),JAVA在网络方便的应用,Java小程序(Applet)Applet程序嵌在超文本语言文件中,通过网络下载Apllet程序代码到本地具有JAVA虚拟机的浏览器中执行; HTTP协议访问 根据URL获取Web文件; Socket数据报 实现Client/server模式的网络编程 Servlet/JSP动态页面 进行Web服务器端的动态网页编程,JDBC 通过网络访问关系数据库 RMI(rem

2、ote method invocation 远程方法执行)实现分布式网络应用,网络基础知识,1、TCP/IP (Transmission Control Protocol/Internet Protocol),协议族,包括TCP、IP、 UDP(User Datagram Protocol) ICMP(Internet Control Message Protocol)等。 TCP/IP采用4层结构,如图。 每一层都使用它的下一层所提供的网络服务来完成自己的需求。 各层说明如下。,应用层: 是应用程序间沟通的层,该层向用户提供常用的应用程序。主要协议:ftp,http,smtp,pop3,te

3、lnet等。 传输层:提供了结点间的数据传送服务,主要协议:TCP、(UDP),TCP和UDP给数据包加入传输数据并把它传输到下一层中,该层负责传送数据,并且确定数据已被送达并接收。 网络层/IP层: 负责提供基本的数据封包传送功能,让每一块数据包都能够到达目的主机(但不检查是否被正确接收),主要协议:IP,ICMP,ARP等。 网络接口层:定义如何使用实际网络(如Ethernet、Serial Line等)来传送数据。主要包括各种逻辑链路控制及介质访问协议,如PPP, HDLC等。,2、IP地址,IP地址是由4个0-255之间的数字和点号连接符组成的,IP地址不是随意指定的,有专门的国际机构

4、负责其定义和分类,目前IP地址分为A、B、C、D、E五类。由于是数字所表示的IP地址难以记忆,所以现在的域名服务非常普及,域名服务用域名代替某个IP地址,使用起来非常方便。,3、端口号,端口号存在传输层,是16个比特所表示的一个数字。端口的作用是确定发送到某个计算机的数据包到底要发给那个应用 程序来处理。,URL类,URL表示Internet上某一资源的地址。资源包括HTML文件、图象文件、声音文件、动画文件等。浏览器通过解析给定的URL可以在网络上查找相应的文件或网络资源。URL的语法格式如下::/dir/filename说明:protocol:定义传输协议,如http、ftp、file等。

5、hostname:主机域名或IP地址;port:服务端口号;dir和filename:分别为服务器上的目录和文件名。 如:http:/ Resource Locator),使用URL创建对象的应用程序称作客户端程序。一个URL对象封装着着一个具体的资源的引用,表明客户要访问这个URL中的资源,客户利用URL对象可以获取URL中的资源。一个URL对象通常包含最基本的三部分信息:协议、地址、资源。协议必须是URL对象所在的Java虚拟机支持的协议,许多协议并不为我们所常用,而常用的Http、Ftp、File协议都是虚拟机支持的协议;地址必须是能连接的有效IP地址或域名;资源可以是主机上的任何一个文

6、件,URL的构造方法,URL类通常使用如下的构造方法创建一个URL对象: public URL(String spec) throws MalformedURLException 该构造方法使用字符串初始化一个URL对象,另一个常用的构造方法是: public URL(String protocol, String host,String file) throws MalformedURLException 该构造方法构造使用的协议、地址和资源分别由参数protocol、host和file指定,其他构造方法如下 public URL(URL context, String spec) thro

7、ws MalformedURLException public URL(String protocol, String host, int port, String file) throws MalformedURLException,读取URL中的资源,URL对象调用InputStream openStream() 方法可以返回一个输入流,该输入流指向URL对象所包含的资源。通过该输入流可以将服务器上的资源信息读入到客户端。URL对象调用InputStream openStream() 方法可以返回一个输入流,该输入流指向URL对象所包含的资源。通过该输入流可以将服务器上的资源读入到客户端,

8、练习一,打印广科主页(要求使用URL类中的openStream()方法实现),public class bb public static void main(String args) throws IOExceptionURL name=new URL(“http:/ input=name.openStream();InputStreamReader is=new InputStreamReader(input);BufferedReader buffer=new BufferedReader(is);String inputline;while(inputline=buffer.readLi

9、ne()!=null)System.out.println(inputline);buffer.close(); ,获取远程资源,URL还有一个方法是openConnection()方法,该方法返回的是一个URLConnection对象,该对象有一个方法getInputStream(),可以得到输入流,所以使用这个方法也可以实现上面的例题,参考代码如下,public class bb public static void main(String args) throws IOExceptionURL name=new URL(“http:/ conn=name.openConnection()

10、;InputStream input=conn.getInputStream();InputStreamReader is=new InputStreamReader(input);BufferedReader buffer=new BufferedReader(is);String inputline;while(inputline=buffer.readLine()!=null)System.out.println(inputline);buffer.close(); ,通过上面的例题可以看出,使用openConnection方法也可以实现打印页面的功能,但是使用起来就比openStrea

11、m()方法要复杂,所以一般不这样使用openConnection()方法。 URLConnection类主要用在访问远程资源的属性,比如当采用URL类与远程Web服务器建立连接,就可以通过URLConnection类来获取远程对象的属性。,练习二,使用URL对象的openConnection()方法创建URLConnection对象,并用此对象来回去HTTP的相关信息,如协议头,编码,长度等信息。,InetAdress类,地址的表示 Internet上的主机有两种方式表示地址: 1域名 例如, 2IP 地址 例如,202.108.35.210 包中的InetAddress类对象含有一个Inte

12、rnet主机地址的域名和IP地址: 可以使用InetAddress类的静态方法: getByName(String s); 将一个域名或IP地址传递给该方法的参数s,获得一个InetAddress对象,该对象含有主机地址的域名和IP地址,该对象用如下格式表示它包含的信息: public String getHostName() 获取InetAddress对象所含的域名。 public String getHostAddress() 获取InetAddress对象所含的IP地址。,2获取本地机的地址 我们可以使用InetAddress类的静态方法:getLocalHost()获得一个Inet

13、Address对象,该对象含有本地机的域名和IP地址。,练习三,通过InetAddress类里面的对应方法来获取本地主机明和本地主机IP地址。效果如图所示,使用getByName()方法获取地址,InetAddress myConputer=InetAddress.getByName(“);System.out.println(“本地计算机的IP地址是“+myConputer); InetAddress myConputer1=InetAddress.getByName(“8ZGAJQRTCWEROCL“); System.out.println(“本地主机IP地址:“+myConputer1

14、);,NetworkInterface类,该类是在JAVA1.4标准版中所新增加的网络API,它代表一个网络接口(网卡),包含网卡的名字和网卡所分配的IP地址等信息。,和InetAddress类相似,NetWorkInterface类也需要通过一些静态方法来实现对象的实例化,具体方法如下: Public NetworkInterface getByName(String name)throws SocketException Public NetworkInterface getByInetAddress(InetAddress addr)throws SocketException,Publ

15、ic Enumeration getNetworkInterface() throws SocketException 创建NetworkInterface对象后,通过引用实例方法就可以取得名字,IP地址等信息,实例方法如下所示:,Public String getDisplayName() Public Enumeration getInetAddress(),练习四,网卡基本信息查询的应用。,概述Java提供Socket和ServerSocket类作为标准的TCP套接字编程技术,通过它们实现主机与主机之间(应用程序间)的对话。位于:包中。使用Socket进行C/S程序设计的一般连接过程:S

16、erver端Listen(监听)某个端口是否有连接请求, Client端向Server端发出Connect(连接)请求,Server端向Client端发回Accept(接受)消息。连接建立后,Server端和Client端都可以通过套接字类提供的一些方法与对方通信。,使用TCP协议的Socket编程,2、Socket类的构造方法: public Socket(String host, int port) public Socket(InetAddress address, int port) public Socket(String host, int port, InetAddress lo

17、calAddr, int localPort)/在指定的机器上的指定端口上运行 上述方法都将抛出例外IOException,程序中需要捕获处理。,使用TCP协议的Socket编程,3、Socket的常见方法:/Socket的输入/输出流管理;抛出例外IOException。 public InputStream getInputStream() public void shutdownInput() public OutputStream getOutputStream() public void shutdownOutput()/关闭Socketpublic void close() thr

18、ows IOException/设置/获取Socket数据: public InetAddress getInetAddress() 返回此套接字链接的地址对象 public InetAddress getLocalAddress() 返回此套接字本地的地址对象 public int getPort() 返回此套接字链接地址的端口上述方法都将抛出例外SocketException,程序中需要捕获处理。,使用TCP协议的Socket编程,4、ServerSocket类 构造方法: public ServerSocket(int port) public ServerSocket(int port

19、, int backlog) /支持指定数目的连接 public ServerSocket(int port, int backlog, InetAddress bindAddr)/在指定的机器上运行 主要方法 public Socket accept():等待客户端的连接 public void close():关闭Socket设置/获取Socket数据的方法 public InetAddress getInetAddress() public int getLocalPort(),,使用TCP协议的Socket编程,5、Socket通信程序基本结构都一样,包括以下四个基本步骤: 1、在客户

20、方和服务器方创建Socket/ServerSocket实例。 2、打开连接到Socket的输入/输出流。 3、利用输入/输出流,按照一定的协议对Socket进行读/写操作。 4、关闭输入/输出流和Socket。通常,程序员的主要工作是针对所要完成的功能在第3步进行编程,第1、2、4步对所有的通信程序来说几乎都是一样的。,使用TCP协议的Socket编程,编写客户端程序,要求:客户端向服务器程序发送一个字符串“aloha”,并接收从服务器程序返回的结果,这里就把本机作为客户端。,public class client1 public static void main(String args) t

21、hrows IOExceptionSocket s=new Socket(“127.0.0.1”,5432);/“127.0.0.1”指当前计算机OutputStream out=s.getOutputStream();DataOutputStream dout=new DataOutputStream(out);dout.writeUTF(“aloha“);InputStream in=s.getInputStream();DataInputStream din=new DataInputStream(in);String st=din.readUTF();System.out.printl

22、n(st);in.close();out.close();s.close(); ,编写服务器端程序,接收客户端的请求,并把处理的结果返回给客户端,public class f5 public static void main(String args)ServerSocket s=null;String hello=“From Server:Hello World!“;try s=new ServerSocket(5432);catch(IOException e)System.out.println(e);System.exit(1);while(true)trySocket cs=s.acc

23、ept();InputStream in=cs.getInputStream();DataInputStream din=new DataInputStream(in);String name=din.readUTF();OutputStream out=cs.getOutputStream();DataOutputStream dos=new DataOutputStream(out);dos.writeUTF(hello+“Your name:“+name);in.close();out.close();cs.close();,使用TCP协议的Socket编程,练习,要求实现一个服务器程序

24、和客户端程序建立连接之后沟通交流的一个过程,如果客户端和服务器端输入的都是“bye”时,分别结束客户端和服务器端程序。,关闭输入/输出流和Socket在客户端和服务器端分别关闭输入/输出流和Socket:先关闭所有相关的输入/输出流,再关闭Socket。上面的程序是一对一的实现方式,如果出现多个客户端请求服务器该如何处理呢?,使用TCP协议的Socket编程,一对多C/S通讯程序的实现。解决方案一:在一台计算机上一次启动多个服务器程序,只要端口号不同。 myserver1 myclient1 myserver2myclient2,使用TCP协议的Socket编程,解决方案二:将服务器写成多线程

25、的,不同的处理线程为不同的客户服务。主线程只负责循环等待,处理线程负责网络连接,接收客户输入的信息。 /主线程 while (true) accept a connection ;create a thread to deal with the client ; end while,使用TCP协议的Socket编程,多线程处理的实例,要求:将服务器程序改写成多线程实现,下图就描述了该多线程服务器的操作流程,图中数字1、2和3表示每一步骤的顺序,Client1 Socket,Port 5432,Server ServerSocket,Client2 Socket,Thread n,Thread1

26、,1,2,3,多线程服务器实现的描述,Public class ServerDemo2 public static void main(String args) ServerSocket s=null;trys=new ServerSocket(5432);catch(IOException e)System.out.println(e);System.exit(1);while(true)trySocket cs=s.accept();new ServerThread(cs).start();catch(IOException e)System.out.println(e); ,public

27、 class ServerThread extends Thread static String hello=“From Server:Hello World!“; Socket sock; public ServerThread(Socket s) sock=s; public void run() try InputStream in=sock.getInputStream(); DataInputStream din=new DataInputStream(in); String name=din.readUTF(); OutputStream out=sock.getOutputStr

28、eam(); DataOutputStream dos=new DataOutputStream(out); dos.writeUTF(hello+“Your name:“+name); in.close(); out.close(); sock.close(); catch(IOException e)System.out.println(e);,安全套接字的应用,TCP/IP的弱点: (1)窃听 传输的敏感数据被截获,其保密性被破坏,如网上购物时输入的信用卡帐号被盗用等。 (2)篡改 传输数据被截获后替换成其他数据发送给接受者,如网络“黑客”修改他人数据。 (3)伪装 一台计算机被人为的伪

29、装为某个Web站点,发布错误信息。,SSL协议,SSL(secure sockets layer,安全套接字协议层) 是目前在Web上应用最广泛的一种安全协议。该协议采用一系列加密的方法来保证安全的数据传输。 在JAVA语言中,对SSL协议的支持是通过一个称为JSSE(Java Secure Sockets Extension ,Java安全套接字扩展)的API包所实现的,JSEE解决了SSL协议中关于通信的客户和服务器程序,需在应用层程序开始之前协商加密算法和认证机构的工作,这样就可以编写安全套接字通信程序,它是.ssl包中的类和接口。,一、概述UDP通信是一种无连接的数据报通信。使用该协议

30、,两个程序进行通信时不用建立连接;数据以独立的包为单位发送,包的容量限定在64KB以内;每个数据报需要有完整的收/发地址,可以随时进行收/发数据报,但不保证传送顺序和内容准确;数据报可能会被丢失、延误等。UDP通信是不可靠的通信,但通信速度较快,常常被应用在某些要求实时交互,准确性要求不高,但传输速度要求较高的场合(如视频会议系统等)。Java中,基于UDP协议实现网络通信的类有三个:用于表示通信数据的数据报类:DatagramPacket用于进行端到端通信的类:DatagramSocket用于广播通信的类:MulticastSocket。,数据报协议(UDP),二、基于UDP通信的基本模式

31、将数据打包,发往目的地 接受别人发来的数据包,察看数据包内容,数据报协议(UDP),1、发送数据包 1)用DatagramPacket类将数据打包,即创建数据包对象。 DatagramPacket(byte data, int length, InetAddtress address,int port)Address: 目标主机地址 Port:目标主机端口 如:byte data=“近来好吗”.getByte();InetAddress address=inetAddress.getByname();DatagramPacket data_pack=new DatagramPacket(dat

32、a,data.length,address,980); 注: data_pack常用方法:Public int getPort(); public InetAddress getAddress(); Public byte getData();,数据报协议(UDP),2)用DatagramSocket类的构造方法DatagramSocket()创建一个对象,该对象负责发送数据包。例: DatagramSocket mail_out=new DatagramSocket(); Mail_out.send(data_pack); 2、接收数据DatagramSocket mail_in=new D

33、atagramSocket(int port); 注意:mail_in的主要方法: Receive(DatagramPacket pack) /接收数据包给pack, 例如: DatagramPacket pack=new DatagramPacket(data,length) Mail_in.receive(pack); 举,Public class UDPClient public static void main(String args) tryDatagrarmSocket socket=new DatagramSocket();String s=“hello”;byte buf=s.

34、getBytes();InetAddress address=InetAddress.getByName(“127.0.0.1”);DatagramPacket packet=new DatagramPacket(buf,buf.length,address,6666);socket.send(packet);buf=new byte256;packet=new DatagramPacket(buf,buf.length);socket.receive(packet);String receive=new String(packet.getData().trim();System.out.pr

35、intln(“Received:”+receive);socket.close();catch(IOException e)System.out.println(e);,Public class UDPServer public static void main(String args) tryDatagrarmSocket socket=new DatagramSocket(6666);byte =new byte256;DatagramPacket packet=new DatagramPacket(buf,buf.length); boolean listen=true;while(li

36、sten)socket.receive(packet);String rec=new String(packet.getData().trim().toUpperCase();InetAddress address=packet.getAddress();int port=packet.getPort();packet=new DataPacket(rec.getBytes(),rec.length,address,port);socket.send(packet);socket.close();catch(SocketException e)System.out.println(e);cat

37、ch(IOException e)System.out.println(e);,组播,组播(multicast)是一种特殊的数据报传输方式,也就是说如果存在多个主机同时接受同一个数据报的时候,源主机只需要发送一个数据报就可以到达每个接受主机上,通过下图表示单播和组播的比较。,58,组播Socket,与传统传播的区别:,59,组播的使用,采用MulticastSocket用法相近,但多了4个动作: 1加入组播组 2向组播组发送数据 3接受组播组的数据 4离开组播组,组播强调的是一个组的概念,即具有相同需求的主机可以加入某个组,那么向这个组发送的信息,所有组成员都可以接收到。某台主机可以申请加入某

38、个组,也可以申请离开。具体如下图所示,某个组(224.0.0.1),加入组,离开组,组成员的加入和离开,计算机使用IP地址和端口来区分其位置和进程,但有一类地址非常特殊,称作D类地址,D类地址不是用来代表位置的,即在网络上不能使用D类地址去查找计算机。 D类地址好像生活中的社团组织,不同地理位置的人可以加入相同的组织,继而可以享有组织内部的通信权利。,Internet的地址是a.b.c.d的形式。该地址的一部分代表用户自己的主机,而另一部分代表用户所在的网络。当a小于128,那么b.c.d就用来表示主机,这类地址称做A类地址。如果a大于等于128并且小于192,则a.b表示网络地址,而c.d表

39、示主机地址,这类地址称做B类地址。如果a大于等于192,则网络地址是a.b.c,d表示主机地址,这类地址称做C类地址。224.0.0.0224.255.255.255是保留地址,称作D类地址,要广播或接收广播的主机都必须加入到同一个D类地址。一个D类地址也称做一个组播地址,D类地址并不代表某个特定主机的位置,一个具有A、B或C类地址的主机要广播数据或接收广播,都必须加入到同一个D类地址。,MulticastSocket类,MulticastSocket类的常用构造方法如下: public MulticastSocket(int port)throws IOException Multicast

40、Socket类的主要实例方法如下: public void joinGroup(InetAddress address);/加入指定组播地址组 public void LeaveGroup(InetAddress address);/离开指定的组播地址组,组播的简单应用实例,要求利用MulticastSocket类实现简单的组播应用 第一、编写一个程序扮演服务器的角色,记录每个客户的离开和加入 第二、编写另个一个程序,实现组成员,服务器端代码,Public class MulticastServer public static void main(String args) tryInetAdd

41、ress grp=InetAddress.getByName(“228.5.6.7”);/指定组播地址MulticastSocket s=new MulticastSocket(6789);s.joinGroup(grp);/将监听对象s加入到组播地址中byte buf=new byte1000;DatagramPacket rpkt=new DatagramPacket(buf,buf.length);while(true)s.receive(rpkt);/接受数据报String rec=new String(rpkt.getData().trim();String ip=rpkt.getA

42、ddress().getHostAddress();System.out.println(“Someone joined:”+rec+”from”+ip);catch(IOException e)System.out.println(e); ,组成员代码实现,Public class MulticastTest public static void main(String args) tryString msg=“Hello”;InetAddress grp=InetAddress.getByName(“228.5.6.7”);MulticastSocket s=new MulticastSocket(6789);s.joinGroup(grp); DatagramPacket rpkt=new DatagramPacket(msg.getBytes(),msg.length,grp,6789);s.send(rpkt)s.leaveGroup(grp);s.close();catch(IOException e)System.out.println(e); ,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报