java 网络程序设计.ppt_第1页
java 网络程序设计.ppt_第2页
java 网络程序设计.ppt_第3页
java 网络程序设计.ppt_第4页
java 网络程序设计.ppt_第5页
已阅读5页,还剩54页未读 继续免费阅读

下载本文档

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

文档简介

1、1,网络程序设计,2,软件包 ,为实现网络应用程序提供类。 包可以大致分为两个部分: 低级 API,用于处理以下抽象: 地址,也就是网络标识符,如 IP 地址。 套接字,也就是基本双向数据通信机制。 高级 API,用于处理以下抽象 URL,表示统一资源定位符。,3,地址: InetAddress,在整个 API 中,地址用作主机标识符或者用作套接字端点标识符。 InetAddress 类是表示 IP(Internet 协议)地址的抽象。InetAddress 的实例包含 IP 地址,还可能包含相应的主机名 。 InetAddress类没有构造方法,因此不能用new来构造一个InetAddres

2、s实例。通常是用它提供的静态方法来获取: public static InetAddress getByName(Stringhost) host可以是一个机器名,也可以是一个形如“%d.%d.%d.%d”的IP地址或一个DSN域名。 public static InetAddress getLocalHost() staticInetAddress getByAddress(byteaddr) 在给定原始 IP 地址的情况下,返回 InetAddress 对象。 这三个方法通常会产生UnknownHostExceptio例外,应在程序中捕获处理。,4,地址: InetAddress,以下是I

3、netAddress类的几个主要方法: public byte getAddress():获得本对象的IP地址(存放在字节数组中)。 public String getHostAddress():获得本对象的IP地址“%d.%d.%d.%d”。 public String getHostName():获得本对象的机器名。 equals(): 对两个 InetAddress使用getAddress ( ) ,如果返回值相同 ,则为true,5,地址: InetAddress举例,6,TCP程序设计,Socket通信,7,Socket,Java网络编程在很大程度上就是套接字(Socket)编程。套

4、接字是让用户与网络通信的一种对象,它并不是物理设备,可以将其理解为网络连接的端点。 两个Java应用程序可通过一个双向的网络通信连接实现数据交换,这个双向链路的一端称为一个socket。 socket通常用来实现client-server连接(C/S)。,8,端口,在网络技术中,端口(Port)大致有两种: (1)物理意义上的端口。比如,ADSL Modem、集线器、交换机、路由器用于连接其它网络设备的接口,如RJ-45端口、SC端口等等。 (2)逻辑意义上的端口。一般是指TCP/IP协议中的端口,端口号的范围从0到65535。比如,用于浏览网页服务的80端口,用于FTP服务的21端口等等。,

5、9,端口,逻辑意义上的端口可分为3大类: 公认端口(Well Known Ports):从0到1023,这些端口紧密绑定于一些服务。通常这些端口的通讯明确表明了某种服务的协议。 注册端口(Registered Ports):从1024到49151。它们松散地绑定于一些服务。也就是说有许多服务绑定于这些端口,这些端口同样用于许多其它目的。 动态和/或私有端口(Dynamic and/or Private Ports):从49152到65535。理论上,不应为服务分配这些端口。实际上,机器通常从1024起分配动态端口。 客户和服务器必须事先约定所使用的端口。如果系统两部分所使用的端口不一致,那就不

6、能进行通信。,10,Socket在应用程序中创建,通过一种绑定机制与驱动程序建立关系,告诉自己所对应的IP和端口号。此后,应用程序送给Socket的数据,由Socket交给驱动程序向网络上发送出去。计算机从网络上收到与该Socket绑定的IP和端口号相关的数据后,由驱动程序交给Socket,应用程序便可从该Socket中提取接收到的数据。(三步握手建立连接),11,Socket,包中定义的两个类Socket和ServerSocket,分别用来实现双向连接的client和server端 建立连接时所需的寻址信息 远程计算机的机器名或IP地址 试图连接的端口号(Port number) 构造方法:

7、 Socket(InetAddressaddress, intport) 创建一个流套接字并将其连接到指定 IP 地址的指定端口号。 Socket(Stringhost, intport) 创建一个流套接字并将其连接到指定主机上的指定端口号 ServerSocket(intport) 创建绑定到特定端口的服务器套接字。 ServerSocket(intport, intbacklog) 利用指定的 backlog 创建服务器套接字并将其绑定到指定的本地端口号。,12,无论一个Socket通信程序的功能多么齐全、程序多么复杂,其基本结构都是一样的,都包括以下四个基本步骤: 1、在客户方和服务器方

8、创建Socket/ServerSocket。 2、打开连接到Socket的输入/输出流。 3、利用输入/输出流,按照一定的协议对Socket进行读/写操作。 4、关闭输入/输出流和Socket。 通常,程序员的主要工作是针对所要完成的功能在第3步进行编程,第1、2、4步对所有的通信程序来说几乎都是一样的,Java网络模型,13,Java技术中的网络:Java网络模型,在Java编程语言中,TCP/IP socket连接是用包中的类实现的。下图说明了服务器和客户端所发生的动作。,14,服务器端Socket的建立 ServerSocket server=null; try server=new S

9、erverSocket(2000); catch(IOException e) System.out.println(can not listen to :+e); Socket socket=null; try socket=server.accept(); /没有客户连接信息时 /将处于“挂起状态” catch(IOException e) System.out.println(Error:+e); ,15,客户端Socket的建立 try Socket socket=new Socket(”,2000); catch(IOException e) System.out.

10、println(Error:+e); ,16,打开输入/出流 PrintStream os=new PrintStream(new BufferedOutputStream(socket.getOutputStream(); DataInputStream is=new DataInputStream(socket.getInputStream(); 关闭Socket os.close(); is.close(); socket.close();,17,最简client/server程序,import java.io.*; import .*; public class MyServer pu

11、blic static void main(String args) throws IOException ServerSocket server=new ServerSocket(5678); while(true) / 反复监听 Socket client=server.accept(); /没有监听到时为挂起状态 PrintWriter out=new PrintWriter(client.getOutputStream(); out.println(Hello,Byebye!); out.close(); client.close(); ,18,最简client/server程序,im

12、port .*; import java.io.*; public class Client static Socket server; public static void main(String args)throws Exception server=new Socket(InetAddress.getLocalHost(),5678); BufferedReader in=new BufferedReader(new InputStreamReader(server.getInputStream(); System.out.println(in.readLine(); in.close

13、(); server.close(); ,19,支持多Client,解决方案一: 在一台计算机上一次启动多个服务器程序,只要端口号不同。 myserver1 myclient1 myserver2myclient2,20,解决方案二:将服务器写成多线程的,不同的处理线程为不同的客户服务。主线程只负责循环等待,处理线程负责网络连接,接收客户输入的信息。 /主线程 while (true) accept a connection ; create a thread to deal with the client ; end while,支持多Client,21,serverSocket = new

14、 ServerSocket(4444); while (listening) Socket socket; socket = serverSocket.accept(); /程序将在此等候客户端的连接 Thread t = new MultiTalkServerThread(socket); t.start( );/为新客户建立一条新的线程,并运行 serverSocket.close();,class MultiTalkServerThread extends Thread private socket; public MultiTalkServerThread(Socket socket,

15、 int clientNumber) this.socket = socket; public void run() /处理用户需求 ,22,Client之间通过Server通信,可以在服务器端将与各客户进行通信的Socket和线程管理起来,从而各客户之间可以在服务器端的协助下进行通信。,23,上机作业,利用socket编写java application程序实现网络聊天:在字符界面下,client和server端程序建立连接后双方可以互相发送信息;创建图形界面,实现一对一聊天(可模仿msn or QQ);实现多人聊天,或网络会议。,24,UDP程序设计(数据报),25,Java中的socke

16、t编程,利用Java中的Socket可以编写两类应用程序: 面向连接的字节流应用程序和无连接的数据报应用程序。 UDP协议是无连接的协议,它以数据报作为数据传输的载体。 数据报是一个在网络上发送的独立信息,它的到达、到达时间以及内容本身等都不能得到保证。数据报的大小是受限制的,每个数据报的大小限定在64KB以内。 UDP协议无需在发送方和接收方建立连接,但也可以先建立连接。数据报在网上可以以任何可能的路径传往目的地。,26,UDP协议,在Java中,基于UDP协议实现网络通信的类有三个: 用于表达通信数据的数据报类DatagramPacket 用于进行端到端通信的类DatagramSocket

17、 用于广播通信的类MulticastSocket。 数据报分组类DatagramPacket封装了有关数据报通讯机制中的分组数据、分组长度、远端主机的IP地址及端口号等,27,构造方法 public DatagramPacket(bytebuf, intlength) public DatagramPacket(bytebuf, intoffset, intlength):这两个方法用于接收数据 public DatagramPacket(bytebuf, intlength, InetAddress address, intport) public DatagramPacket(bytebu

18、f, intoffset, intlength, InetAddressaddress, intport):这两个方法用于发送数据 获取数据获取接收报中的信息 public InetAddress getAddress() public byte getData() public int getLength() public int getOffset() public int getPort() 设置数据设置发送报中的信息 setAddress(InetAddressiaddr)、setPort(intiport)、setData(bytebuf)、setData(bytebuf, into

19、ffset, intlength) 、setLength(intlength),类DatagramPacket,28,构造方法:这三个方法都将抛出例外SocketException,程序中需要捕获处理。 public DatagramSocket() public DatagramSocket(intport):在指定的端口通信 public DatagramSocket(intport, InetAddressladdr):在指定的地点运行 最主要的方法发送与接收数据报:这两个方法都将抛出例外IOException,程序中需要捕获处理。 public void receive(Datagra

20、mPacketp) public void send(DatagramPacketp) 其他方法 public void close():关闭Socket,类DatagramSocket,29,30,1. 定义数据成员 DatagramSocket socket; DatagramPacket packet; InetAddress address;(用来存放接收方的地址) int port; (用来存放接收方的端口号) 2. 创建数据报Socket对象 try socket = new DatagramSocket(4445); catch(.SocketException e) /sock

21、et 绑定到一个本地的可用端口 /等待接收客户的请求。,Server-发送端的标准步骤:,31,3.分配并填写数据缓冲区(一个字节类型的数组) byte buf = new byte256; 存放从客户端接收的请求信息。 4.创建一个DatagramPacket packet = new DatagramPacket(buf, 256); 用来从socket接收数据,它只需要两个参数。 5. 服务器阻塞 socket.receive(packet); 在客户的请求数据报到来之前一直等待。,Server-发送端的标准步骤:,32,6. 从到来的包中得到地址和端口号 InetAddress add

22、ress = 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();,Server-发送端的标准步骤:,33,1. 定义数据成员 int port; InetAddress address; DatagramSocket so

23、cket; DatagramPacket packet; byte sendBuf = new byte256; 2. 建立socket socket = new DatagramSocket();,client-接收端的标准步骤:,34,3. 向服务器发出请求报文 address = InetAddress.getByName(args0); port = parseInt(args1); packet = new DatagramPacket(sendBuf, 256, address, port); socket.send(packet); 这个数据报本身带有客户端的信息 4. 客户机等

24、待应答 packet=new DatagramPacket(sendBuf, 256); socket.receive(packet); 如果没有到就一直等待,因此实用程序要设置时间限度 5. 处理接收到的数据 String received=new String(packet.getData(); System.out.println(received);,client-接收端的标准步骤:,35,程序实例:服务器方,import java.io.*; import .*; public class UDPServer public static void main(String args)

25、byte buf=new byte1024; DatagramPacket revPacket= new DatagramPacket(buf, buf.length); /接收到的数据报 DatagramSocket socket=new DatagramSocket(); System.out.println(“UDPServer listening port:” + socket.getLocalPort(); while(true) socket.receive(revPacket); /接收数据报,可能阻塞 DatagramPacket sndPacket=new DatagramP

26、acket(buf,revPacket.getLength(), revPacket.getAddress(),revPack et. getPort(); /创建要发送的数据报 socket.send(sndPacket);/将接收到的数据回送到客户 ,36,程序实例:客户方,import java.io.*; import .*; public class UDPClient public static void main(String args) throws Exception /用法:UDPClient BufferedReader in = new BufferedReader(

27、new InputStreamReader(System.in); InetAddress hostAddr=InetAddress.getByName(args0);/IP地址 int port=Integer.parseInt(args1);/服务器监听的端口号 DatagramSocket socket=new DatagramSocket(); String lnMess; while(lnMess=in.readLine()!=null)/从标准输入中读取一行 bytebuf=new bytelnMess.length; lnMess.getBytes(0,lnMess.length

28、,buf,0)/从字符转换到字节 DatagramPacket packet=new DatagramPacket(buf, buf.length,hostAddr,port); socket.send(packet); /发送到服务器 socket.receive(packet); /从服务器读 /把读取到的数据报打印到标准输出 /end while ,37,URL程序设计,38,URL,URL是统一资源定位符(Uniform Resource Locator)的简称,URL表示Internet上某一资源的地址。Internet上的资源包括HTML文件、图像文件、声音文件、动画文件以及其它任

29、何内容(并不完全是文件,也可以是一个对数据库的查询等)。 通过URL,就可以访问Internet。浏览器或其它程序通过解析给定的URL就可以在网络上查找相应的文件或其它资源。 类URL和URLConnection提供了最高级网络应用。,39,URL,URL(Uniform Resource Locator)-统一资源定位器,表示Internet上某一资源的地址。 URL组成: 协议名和资源名 protocol:resourceName URL举例: ftp:/,40,.URL类,常用构造方法 public URL(String spec); URL u1 = new URL(“ public

30、URL(URL context, String spec); URL u2 = new URL(u1, “welcome.html”); public URL(String protocol, String host, String file); URL u3 = new URL(“http”, “”, “developers/index.html” ); public URL (String protocol, String host, int port, String file); URL u4 = new URL(“http”, “”, 80, “developers/index.htm

31、l” );,41,创建URL,当创建URL时发生错误,系统会产生例外MalformedURLException,这是非运行时例外,必须在程序中捕获处理。未知协议错误。 URL url1,url2,url3; try url1 = new URL(“file:/D:/image/example.gif”); url2 = new URL(“ url3 = new URL(url2, “test.gif”); catch ( MalformedURLException e) ,42,获取URL对象的属性,一个URL对象生成后,其属性是不能被改变的,可以通过类URL所提供的方法来获取这些属性。 St

32、ring getProtocol()方法:返回表示URL中协议的字符串对象。 String getHost()方法:返回主机名。 String getPort():返回端口号,默认-1。 String getFile():返回目录文件名(路径名)。 String toExternalForm():返回一完整的URL字符串。 String toString():同上 还可比较两个URL是否相同: boolean sameFile(URL other) 如: url1.sameFile(url2) 若两个URL相同,则返回true.,43,URL和InetAddress的联合使用,Applet中的

33、网络通信需要将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 Da

34、tagramSocket socket = new DatagramSocket(); DatagramPacket packet = new DatagramPacket(buf, length, address, port); socket.send(packet); catch(Exception e),44,获取URL内容,可以通过URL类提供的两个主要方法来访问它指向的资源(获取URL内容): 用openStream()方法得到InputStream流。 用URL类的openConnection()得到与URL的URLConnection连接。,45,URL类方法:openStrea

35、m(),,通过URL类提供的方法openStream(),就可以读取一个URL对象所指定的资源。 public final InputStream openStream() 方法openStream()与指定的URL建立连接并返回一个InputStream对象,将URL位置的资源转成一个数据流。通过这个InputStream对象,就可以读取资源中的数据。,46,URL类应用举例(1),import java.io.*; import .*; public class URLReader public static void main(String args) try URL url = new

36、 URL( BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream(); String s; while(s = in.readLine()!=null) System.out.println(s); in.close(); catch(MalformedURLException e) System.out.println(e); catch(IOException e) System.out.println(e); ,47,URL类应用举例(1),程序URLReader.java输出结果: 新浪首

37、页 ,48,URL类应用举例(2),URL资源内容的网页运行效果 使用javax.swing.JEditorPane类可以解释执行HTML文件,使用setPage(URL page)方法。 见示例: Browser.java,49,URL连接: URLConnection类,通过URL类提供的方法openConnection(),就可以获得一个URL连接(URLConnection)对象。 public URLConnection openConnection() 举例: try URL url = new URL(“”); URLConnection uc = url.openConnect

38、ion(); catch(MalformedURLException e1) catch(IOException e2) ,50,URLConnection类,通过URL的方法openStream(),只能从网络上读取资源中的数据。 通过URLConnection类,可以在应用程序和URL资源之间进行交互,既可以从URL中读取数据,也可以向URL中发送数据。 URLConnection类表示了应用程序和URL资源之间的通信连接。 InputSream getInputStream(); OutputStream getOutputStream(); 通过返回的输入输出流我们可以与远程对象进行通

39、信。,51,通过URLConnection对象获取的输入流和输出流,可以与现有的CGI程序进行交互。 URL和URLConnection的区别在于前者代表一个资源的位置,后者代表一种连接。,URLConnection类,52,URLConnection类举例,import .*; import java.io.*; public class URLReader public static void main (String args) try URL url = new URL( URLConnection uc = url.openConnection(); uc.setDoOutput(t

40、rue); /URL 连接输出则设置为 true PrintStream out = new PrintStream(uc.getOutputStream(); BufferedReader in = new BufferedReader( new InputStreamReader( uc.getInputStream() ) ); catch(Exception e) System.out.println(e); 事实上,类URL的方法openStream()就是通过URLConnection类来实现的 它等价openConnection().getInputStream();,53,小结

41、,类URL和URLConnection提供了最高级网络应用。 URL组成: 协议名和资源名;一个URL对象生成后,其属性是不变的 通过URL类提供的方法openStream(),就可以读取一个URL对象所指定的资源。 通过URL类提供的方法openConnection(),就可以获得一个URL连接(URLConnection)对象。 URLConnection类实现了应用程序和URL资源之间的通信连接。 方法为getInputStream()和getOutputStream()。,54,*广播通信,DatagramSocket只允许数据报发往一个目的地址。类包中提供了类MulticastSoc

42、ket,允许将数据报以广播的方式发送到某个端口的所有客户。 类MulticastSocket是在客户端使用,监听服务器广播来的数据;而服务器端仍然使用DatagramSocket来发送数据,只是发送的数据报的目的地址有所变化。,55,从DatagramSocket继承而来 构造方法 public MulticastSocket() public MulticastSocket(intport) :在指定的端口通信 主要方法 public void joinGroup(InetAddressmcastaddr):加入一个广播组 public void leaveGroup(InetAddressmcastaddr):离开一个广播组 public void setTimeToLive(intttl):指定数据报离开时间 public void send(DatagramPacketp, bytettl):在指定的时间内将数据报发送出去 继承DatagramSocket的方法 public void receive(DatagramPacketp):接收数据 public void send(DatagramPacketp):发送数据 public void

温馨提示

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

评论

0/150

提交评论