网络编程-01.ppt_第1页
网络编程-01.ppt_第2页
网络编程-01.ppt_第3页
网络编程-01.ppt_第4页
网络编程-01.ppt_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

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

文档简介

1、第十三章节:Java网络编程,目标,基于TCP协议的网络编程。 基于UDP协议的网络编程 基于广播协义的网络编程,网络基本概念之端口,一台机器通常只通过一条链路连接到网络上,即它只有一个IP地址,但一台机器中往往有很多应用程序需要进行网络通信,如何区分呢?这就要靠网络端口号(port)了。 端口号是一个标记机器的逻辑通信信道的正整数,端口号不是物理实体。IP地址和端口号组成了所谓的Socket,Socket是网络上运行的程序之间双向通信链路的最后终结点,它是TCP和UDP的基础。 IP与端口号组合而得出的Socket,可以完全分辨Internet上运行的程序。,端口号是用整数来表达的,范围为0

2、65535,其中01023为系统所保留,给那些通用的服务(well-known services),如http服务的端口号为80,telnet服务的端口号为21,ftp服务的端口为23。当我们编写通信程序时,应选择一个大于1023的数作为端口号,以免发生冲突。,网络基本概念之端口,网络基本概念之TCP协议,传输控制协议(TCP):是在端点与端点之间建立持续的连接而进行通信。建立连接后,发送端将发送的数据印记了序列号和错误检测代码,并以字节流的方式发送出去;接收端则对数据进行错误检查并按序列顺序将数据整理好,数据在需要时可以重新发送,因此整个字节流到达接收端时完好无缺。这与两个人打电话的情形是相

3、似的。 TCP协议具有可靠性和有序性,并且以字节流的方式发送数据,它通常被称为流通信协议。,与TCP协议不同,用户数据报协议(UDP)则是一种无连接的传输协议。利用UDP协议进行数据传输时,首先需要将要传输的数据定义成数据报(Datagram),在数据报中指明数据所要达到的端点(Socket,主机地址和端口号),然后再将数据报发送出去。这种传输方式是无序的,也不能确保绝对的安全可靠,但它很简单也具有比较高的效率,这与通过邮局发送邮件的情形非常相似。,网络基本概念之UDP协议,网络基本概念,包中的主要的类 面向IP层的类:InetAddress (Inet4Address,Inet6Addres

4、s) 面向应用层的类:URL、URLConnection 面向网络层的类: TCP协议相关类:Socket、ServerSocket UDP协议相关类:DatagramPacket、DatagramSocket、MulticastSocket 可能产生的异常:BindException、ConnectException、MalformedURLException、NoRouteToHostException、ProtocolException、SocketException、UnknownHostException、UnknownServiceException,网络基本概念,类InetAdd

5、ress:代表一个IP地址,并且将IP地址和域名相关的操作方法包含在该类的内部。 InetAddress类没有构造函数,用它提供的静态方法来获取: public static InetAddress getByName(Stringhost) :host可以是一个机器名、IP地址或一个DSN域名。 public static InetAddress getLocalHost() public static InetAddress getAllByName(Stringhost) public static InetAddress getByAddress(Stringhost, Byte ad

6、dr) 这些方法通常会产生UnknownHostException异常,应在程序中捕获处理 以下是InetAddress类的几个主要方法,通过上述方法获得InetAddress类的实例后就可以使用: public byte getAddress():获得本对象的IP地址. public String getHostAddress():获得本对象的IP地址。 public String getHostName():获得本对象的机器名。,public class InetAddressTest public static void main() InetAddress myIP = null; I

7、netAddress pku = null; try /获取本机的IP地址 myIP = InetAddress.getLocalHost(); /获取某一个域名的IP信息 pku = InetAddress.getByName(“”); catch(UnknownHostException e) System.err.println(e); System.out.println(“我的IP地址:” + myIP); System.out.println(“卓京网站的IP:” + pku); ,public static InetAddress getByAddress(Stringhost,

8、 Byte addr) Byte addr:IPv4 地址字节数组的长度必须为 4 个字节,IPv6 字节数组的长度必须为 16 个字节,URL的操作,什么是URL? URL是统一资源定位符(Uniform Resource Locator)的简称,它表示Internet上某一资源的地址。通过URL,就可以访问Internet。浏览器或其他程序通过解析给定的URL就可以在网络上查找相应的文件或其他资源。 URL的格式 一个URL包括两部分内容:协议名称和资源名称,中间用冒号隔开:Protocol:resourceName 如:,URL的操作,在包中,提供了类URL来表示URL。类URL提供了很

9、多构造方法来生成一个URL对象: public URL(Stringspec) public URL(URL context, String spec) public URL(Stringprotocol, Stringhost, Stringfile) public URL(Stringprotocol, Stringhost, intport, Stringfile),URL的操作,一个URL对象生成后,其属性是不能被改变的(与String对象相似),但可以通过它给定的方法来获取这些属性: public String getProtocol():获取该URL的协议名 public Stri

10、ng getHost() :获取该URL的主机名 public String getPort() :获取该URL的端口号 public String getPath() :获取该URL的文件路径 public String getFile() :获取该URL的文件名 public String getRef() :获取该URL在文件中的相对位置 public String getQuery() :获取该URL的查询名,通过URL读取www信息,URL类提供的方法openStream(),就可以读取一个URL对象所指定的资源。 public final InputStream openStrea

11、m() openStream()方法与指定的URL建立连接并返回一个InputStream对象,将URL位置的资源转成一个输入数据流。通过这个InputStream对象,可以读取资源中的数据。,课堂编程,把网易首页的内容通过URL对象读出来后保存一个文件中 提示: 创建一个URL对象,利用openStream()方法得到输入流。 创建一个文件输出流。从URL对象中读取来的内容写入文件中。 可以使用JEditorPane组件解析HTML格式的内容。,URL连接,URL类提供的方法openConnection(),就可以获得一个URL连接URLConnection对象。 通过openStream(

12、)方法,只能从网络上读取数据。通过URLConnection类,可以在应用程序和URL资源之间进行交互。URLConnection类表示了应用程序和URL资源之间的通信连接。 URLConnection对象的输入流和输出流(不是所有的资源都可以获得有效的输出流)。 URL和URLConnection的区别在于前者代表一个资源的位置,后者代表一种连接。,Socket通信,在Java中,基于TCP协议实现网络通信的类有两个:在客户端的Socket类和在服务器端的ServerSocket类。 在服务器端通过指定一个用来等待的连接的端口号创建一个 ServerSocket实例。 在客户端通过规定一个主

13、机和端口号创建一个 Socket实例,连到服务器上。 ServerSocket类的accept方法使服务器处于阻塞状态,等待用户请求。,Socket通信,Socket的输入/输出流管理 public InputStream getInputStream() public void shutdownInput() public OutputStream getOutputStream() public void shutdownOutput() 这些方法都将抛出例外IOException,程序中需要捕获处理。 关闭Socket public void close() throws IOExcep

14、tion 设置/获取Socket数据 public InetAddress getInetAddress()、 public int getPort(), public void setSoTimeout(inttimeout), 这些方法都将抛出例外SocketException,程序中需要捕获处理。,ServerSocket,构造方法: public ServerSocket(intport) /支持指定数目的连接 public ServerSocket(intport, intbacklog) /在指定的机器上运行 public ServerSocket(intport, intback

15、log, InetAddressbindAddr) 注:这些方法都将抛出例外IOException,程序中需要捕获处理 主要方法 public Socket accept():等待客户端的连接 public void close():关闭Socket 设置/获取Socket数据 public InetAddress getInetAddress()、public int getLocalPort(), public void setSoTimeout(inttimeout), 注:这些方法都将抛出例外SocketException,程序中需要捕获处理。,Socket通信,无论一个Socket通

16、信程序的功能多么齐全、程序多么复杂,其基本结构都是一样的,都包括以下四个基本步骤: 在客户方和服务器方创建Socket/ServerSocket实例。 打开连接到Socket的输入/输出流。 利用输入/输出流,按照一定的协议对Socket进行读/写操作。 关闭输入/输出流和Socket。,Socket通信,socket,Socket通信图解:,课堂编程,写一个点到点的简单的控制台聊天程序。,如何复用Socket连接。 当客户端连接到服务器后,会产生一个客户端的 Socket的实例。服务器端和客户端就能利用这个Socket进行数据的通信。 但是当通信完毕后,客户端如是希望再和服务器端进行通信。就

17、必须和服务器重新进行连接。 怎样做到一次连接,多次通信?,复用Socket连接,用循环的方式?把客户有端要发送的数据放在一个循环中,对应的服务器 端也必须用一个循环接收客户端发过来的数据。 思考:这种方式的局限性?,复用Socket连接,如何支持多客户端? 将服务器写成多线程的,不同的处理线程为不同的客户服务。主线程只负责循环等待,处理线程负责网络连接,接收客户输入的信息,Server,client1,client2,serverthread2,serverthread1,复用Socket连接,为了让服务器能连接多个用户。将服务器的accept()方法放在一个循环中,或者放入一个单独的线程中。

18、,while (true) Socket socket; socket = serverSocket.accept(); /程序将在此等候客户端的连接 new TCPServerThread(socket).start(); /创建一个新线程处理此客户请求 ,为每一个客户端产生一个线程的线程类。,class TCPServerThread extends Thread public TCPServerThread(Socket socket) /客户端的socket对象 this.socket = socket; public void run() ,课堂编程,客户端程序接收用户输入的数字,然

19、后将用户输入的内容发送给服务器端,服务器端判断客户端发送的数字是否是质数,并将判断的结果反馈给客户端,客户端根据服务器端的反馈显示判断结果。注意判断用户输入的合法性。 完成多个客户端请求。,数据报通信UDP,UDP协议:无连接的协议,以数据报作为数据传输的载体。 数据报(DatagramPacket ):是一个在网络上发送的独立信息,它的到达、到达时间以及内容本身等都不能得到保证。数据报的大小是受限制的,每个数据报的大小限定在64KB以内。 UDP协议无需在发送方和接收方建立连接,但也可以先建立连接。数据报在网上可以以任何可能的路径传往目的地。 在Java中,基于UDP协议实现网络通信的类有三

20、个: 用于表达通信数据的数据报类DatagramPacket。 用于进行端到端通信的类DatagramSocket。 用于广播通信的类MulticastSocket。,类DatagramSocket,DatagramSocket实现的就是发送数据时的发射器,以及接收数据时的监听器的角色 。 最主要的方法发送与接收数据报 public void receive(DatagramPacketp) public void send(DatagramPacketp) 这两个方法都将抛出例外IOException,程序中需要捕获处理。 其他方法 public void connect(InetAddre

21、ssaddress, intport) /与指定的机器通信,有连接 public void disconnect() /关闭与指定机器的连接 public void close() /关闭Socket,类DatagramPacket,DatagramPacket :数据报包用来实现无连接包投递服务。每条报文仅根据该包中包含的信息从一台机器路由到另一台机器。,UDP点到点通信,发送端(服务器端)发出数据报的标准步骤: 1. 定义数据成员 DatagramSocket socket; DatagramPacket packet; InetAddress address;(用来存放接收方的地址) i

22、nt port; (用来存放接收方的端口号) 2. 创建数据报Socket对象 try socket = new DatagramSocket(2876); catch(.SocketException e) socket 绑定到一个本地的可用端口,等待接收客户端的请求。,UDP点到点通信,3.分配并填写数据缓冲区(一个字节类型的数组) byte buf = new byte256; /存放从客户端接收的请求信息。 4.创建一个接收数据报DatagramPacket packet = new DatagramPacket(buf, 256); 用来从socket接收数据,它只需要两个参数 5.

23、 服务器阻塞(等待接收数据) socket.receive(packet); 在客户的请求数据报到来之前一直等待。,UDP点到点通信,6、从接收到的数据报中得到客户端的地址和端口号 InetAddress address = packet.getAddress(); int port = packet.getPort(); 7、将数据送入缓冲区buf或来自文件、或键盘输入 8、建立发送数据报,用来从socket向客户端发送信息 packet = new DatagramPacket(buf, buf.length, address, port); 9. 发送数据包 socket.send(pa

24、cket); 10.关闭socket socket.close();,点到点通信,接收端(客户端)接收数据报的标准步骤: 1. 定义数据成员 int port; InetAddress address; DatagramSocket socket; DatagramPacket packet; byte sendBuf = new byte256; 2. 建立socket socket = new DatagramSocket(); 无须指定端口号,它会自动获得一个可用的端口号。,点到点通信,3. 向服务器端发出请求数据报(发送数据报) /获得服务器端的IP和端口号 address = Ine

25、tAddress.getByName(“localhost”); port = 2876; packet = new DatagramPacket(sendBuf, 256, address, port); socket.send(packet); /这个数据报本身会带有客户端的信息 4. 客户端等待服务器端的应答(通过接收数据报接收数据) packet=new DatagramPacket(sendBuf, 256); socket.receive(packet); 如果没有到就一直等待,因此实用程序要设置等待时间限度 5. 处理接收到的数据 String received=new Stri

26、ng(packet.getData(), 0); System.out.println(received);,现场编程,实现将客户端程序的系统时间发送给服务器端,服务器端接收到时间以后,向客户端反馈字符串“OK”。 注意:先启动客户端代码。因为receive()是一个阻塞的方法。而send()不是。,class MCServer public static void main (String args) throws IOException /发送或接收的端点对象 DatagramSocket socket = new DatagramSocket(); String str = hello;

27、 byte bytes = str.getBytes(); /用于发送的数据报 DatagramPacket packet = new DatagramPacket(bytes, bytes.length, InetAddress.getLocalHost(), 9800); socket.send(packet);/此方法不是阻塞方法 byte bytes1 = new byte1024; /用于接收的数据报 DatagramPacket packet1 = new DatagramPacket(bytes1, bytes1.length); socket.receive(packet1);

28、/ 此方法是阻塞的方法 System.out.println(new String(bytes1,0,packet1.getLength(); socket.close(); ,class MCClient public static void main (String args) throws IOException DatagramSocket socket = new DatagramSocket(9800, InetAddress.getLocalHost(); byte bytes = new byte1024; DatagramPacket packet = new Datagra

29、mPacket(bytes, bytes.length); socket.receive(packet); System.out.println(new String(bytes,0,packet.getLength(); String str = hello server; byte bytes1 = str.getBytes(); /发送数据时地址和端口从接收到的数据报中得到 DatagramPacket packet1 = new DatagramPacket(bytes1, bytes1.length, packet.getAddress(),packet.getPort(); soc

30、ket.send(packet1); socket.close(); ,广播通信,DatagramSocket只允许数据报发往一个目的地址。类包中提供了类MulticastSocket,允许将数据报以广播的方式发送到某个端口的所有客户。 类MulticastSocket是在客户端(接收端)使用,监听服务器端广播来的数据;而服务器端仍然使用DatagramSocket来发送数据,只是发送的数据报的目的地址有所变化。,广播通信,类MulticastSocket:从DatagramSocket继承而来 构造方法 public MulticastSocket() public MulticastSoc

31、ket(intport) :在指定的端口通信 这两个方法都将抛出例外IOException,程序中需要捕获处理。 主要方法 public void joinGroup(InetAddressmcastaddr):加入一个广播组 public void leaveGroup(InetAddressmcastaddr):离开一个广播组 public void setTimeToLive(intttl):指定数据报离开时间 public void send(DatagramPacketp, bytettl):在指定的时间内将数据报发送出去 这四个方法都将抛出例外IOException,程序中需要捕获

32、处理。 继承DatagramSocket的方法 public void receive(DatagramPacketp):接收数据 public void send(DatagramPacketp):发送数据 public void connect(InetAddressaddress, intport):与指定的机器通信 public void disconnect():关闭指定的连接 public void close():关闭Socket,广播通信,MulticastSocket socket = new MulticastSocket(4446); InetAddress group = InetAddress.getByName(“); socket.joinGroup(group); /receive datagram socket.leaveGroup(group); socket.close();,InetAddress group = InetAddress.getByName(“); DatagramPacket packet = new DatagramPacket(buf, buf.length, group, 4446); soc

温馨提示

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

评论

0/150

提交评论