《Java基础第10章课件》由会员分享,可在线阅读,更多相关《Java基础第10章课件(40页珍藏版)》请在金锄头文库上搜索。
1、第十章 网络编程,TCP/IP协议 DatagramSocket类 DatagramPacket类,InetAddress类 ServerSocket类 Socket类,10.1 网络通信协议,通过计算机网络可以使多台计算机实现连接,位于同一个网络中的计算机在进行连接和通信时需要遵守一定的规则 在计算机网络中,这些连接和通信的规则被称为网络通信协议,它对数据的传输格式、传输速率、传输步骤等做了统一规定,通信双方必须同时遵守才能完成数据交换 网络通信协议有很多种,目前应用最广泛的是TCP/IP协议(Transmission Control Protocal/Internet Protoal传输控
2、制协议/英特网互联协议),它是一个包括TCP协议和IP协议,UDP(User Datagram Protocol)协议、ICMP(Internet Control Message Protocol)协议和其它一些协议的协议组,TCP/IP协议模型,10.1 网络通信协议,链路层:链路层是用于定义物理传输通道,通常是对某些网络连接设备的驱动协议,例如针对光纤、双绞线提供的驱动 网络层:网络层是整个TCP/IP协议的核心,它主要用于将传输的数据进行分组,将分组数据发送到目标计算机或者网络。 运输层:主要使网络程序进行通信,在进行网络通信时,可以采用TCP协议,也可以采用UDP协议。 应用层:主要负
3、责应用程序的协议,例如HTTP协议、FTP协议等。,10.1 网络通信协议,10.1.1 IP地址和端口号 在TCP/IP协议中,IP地址用来唯一标识一台计算机。 目前,IP地址广泛使用的版本是IPv4,它是由4个字节大小的二进制数来表示,如:00001010000000000000000000000001 IP地址也可写成十进制的形式,每个字节用一个十进制数字(0-255)表示,数字间用符号“.”分开,如 “10.0.0.1”。 IPV4这种用4个字节表示的IP地址面临枯竭,因此IPv6 便应运而生了 IPv6使用16个字节表示IP地址,它所拥有的地址容量约是IPv4的81028倍,达到21
4、28个(算上全零的),10.1 网络通信协议,10.1.1 IP地址和端口号 在计算机中,不同的应用程序是通过端口号区分的 端口号是用两个字节(16位的二进制数)表示的,它的取值范围是065535 01023之间的端口号用于一些知名的网络服务和应用,用户的普通应用程序需要使用1024以上的端口号,10.1.2 InetAdderss InetAdderss类用于封装一个IP地址,并提供了一系列与IP地址相关的方法,10.1 网络通信协议,10.1.2 InetAdderss InetAdderss类常用方法的使用 运行结果,10.1 网络通信协议,10.1 网络通信协议,10.1.3 TCP和
5、UDP协议 UDP是User Datagram Protocol的简称,称为用户数据报协议。它是一种无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接。 简单来说,当一台计算机向另外一台计算机发送数据时,发送端不会确认接收端是否存在,就会发出数据,同样接收端在收到数据时,也不会向发送端反馈是否收到数据 使用UDP协议传送数据时,由于UDP的面向无连接性,不能保证数据的完整性,因此在传输重要数据时不建议使用UDP协议,10.1 网络通信协议,10.1.3 TCP和UDP协议 TCP是Transmission Control Protocol的简称,称为传输控制协议。它是一种面向连
6、接的通信协议,可以保证两台计算机之间可靠无差错的数据传输。在TCP连接中必须要明确客户端与服务器端,由客户端向服务端发出连接请求,每次连接的创建都需要经过“三次握手”。,10.2 UDP通信,10.2.1 DatagramPacket DatagramPacket类的实例对象就相当于一个集装箱,用于封装UDP通信中发送或者接收的数据。 创建DatagramPacket对象的构造方法如下所示: DatagramPacket(byte buf,int length) DatagramPacket(byte buf,int length,InetAddress addr,int port) Data
7、gramPacket(byte buf,int offset,int length) DatagramPacket(byte buf,int offset,int length,InetAddress addr,int port),10.2 UDP通信,10.2.1 DatagramPacket DatagramPacket类中的常用方法,10.2 UDP通信,10.2.2 DatagramSocket DatagramSocket类的作用就类似于码头,使用这个类的实例对象就可以发送和接收DatagramPacket数据包 使用DatagramSocket发送数据的过程如图所示。,10.2 U
8、DP通信,10.2.2 DatagramSocket 在创建发送端和接收端的DatagramSocket对象时,使用的构造方法也有所不同,DatagramSocket类中常用的构造方法如下所示: DatagramSocket() DatagramSocket(int port) DatagramSocket(int port,InetAddress addr),10.2 UDP通信,10.2.2 DatagramSocket DatagramSocket类中的常用方法,10.2 UDP通信,10.2.3 UDP网络程序 要实现UDP通信需要创建一个发送端程序和一个接收端程序,例程10-2创建了
9、一个接收端程序,用来接收数据。在创建DatagramSocket对象时,指定其监听的端口号为8954,这样发送端就能通过这个端口号与接收端程序进行通信。之后创建DatagramPacket对象时传入一个大小为1024个字节的数组用来接收数据,当调用该对象的receive(DatagramPacket p)方法接收到数据以后,数据会填充到DatagramPacket中,通过DatagramPacket的相关方法可以获取接收到的数据信息,10.2 UDP通信,10.2.3 UDP网络程序 发送端程序,例程10-3创建了一个发送端程序,用来发送数据。在创建DatagramPacket对象时需要指定目
10、标IP地址和端口号,而且端口号必须要和接收端指定的端口号一致,这样调用DatagramSocket的send()方法才能将数据发送到对应的接收端。 在接收端程序阻塞的状态下,运行发送端程序,接收端程序就会收到发送端发送的数据而结束阻塞状态,脚下留心,10.2.3 UDP网络程序 一台计算机中,一个端口号上只能运行一个程序。如果UDP程序所使用的端口号已经被其它的程序占用。可以在命令行窗口输入netstat -anb命令来查看当前计算机端口占用情况,10.2.4 UDP案例聊天程序 编写的UDP聊天程序主要是想通过监听指定的端口号,目标IP地址和目标端口号,实现消息的发送和接收功能,并把聊天内容
11、显示出来。程序的用户图形界面如图所示。,10.2 UDP通信,10.2.4 UDP案例聊天程序 1、界面实现setUpUI()方法,10.2 UDP通信,10.2.4 UDP案例聊天程序 2、编写事件处理器(发送信息),10.2 UDP通信,10.2.4 UDP案例聊天程序 3、DatagramSocket启动监听 DatagramSocket监听的代码定义在GuiChat类的initSocket()方法中,该方法需要实现两个功能: 第一个是接收用户填写程序监听的端口号 第二个是接收消息,这个功能封装在startListen()方法中,为了避免在接收消息时AWT线程发生阻塞,需要在startL
12、isten()方法中开启一个新的线程,把接收消息的实现放在新线程的run()方法中,10.2 UDP通信,10.2.4 UDP案例聊天程序,10.2 UDP通信,10.2.4 UDP案例聊天程序,10.2 UDP通信,10.2.4 UDP案例聊天程序 4、功能测试 至此,所有的功能模块都已实现,在GuiChat的构造方法中分别调用setUpUI()、initSocket()与setListener()方法,就完成了UDP聊天程序,10.2 UDP通信,TCP通信同UDP通信一样,都能实现两台计算机之间的通信,通信的两端都需要创建socket对象。 TCP通信是严格区分客户端与服务器端的,在通信
13、时,必须先由客户端去连接服务器端才能实现通信,服务器端不可以主动连接客户端,并且服务器端程序需要事先启动,等待客户端的连接 在JDK中提供了两个类用于实现TCP程序,一个是ServerSocket类,用于表示服务器端,一个是Socket类,用于表示客户端,10.3 TCP通信,10.3.1 ServerSocket ServerSocket对象可以实现一个服务器段的程序,ServerSocket类提供了多种构造方法,具体如下: ServerSocket() ServerSocket(int port) ServerSocket(int port, int backlog) ServerSock
14、et(int port, int backlog, InetAddress bindAddr) 第二个构造方法最常用,10.3 TCP通信,10.3.2 ServerSocket ServerSocket对象的常用方法,10.3 TCP通信,10.3.2 Socket Socket对象用于实现TCP客户端程序,它提供了多种构造方法,具体如下: Socket() Socket(String host, int port) Socket(InetAddress address, int port) 最常用的是第一个构造方法,10.3 TCP通信,10.3.2 Socket Socket对象的常用方
15、法:,10.3 TCP通信,10.3.3 简单的TCP网络程序 要实现TCP通信需要创建一个服务器端程序和一个客户端程序 为了保证数据传输的安全性,首先需要实现服务器端程序,10.3 TCP通信,10.3.3 简单的TCP网络程序 例程10-10完成了服务器端程序的编写,接下来编写客户端程序,10.3 TCP通信,10.3.3 简单的TCP网络程序 开启服务端程序,线程发生阻塞,等待客户端访问 开启客户端程序,向服务端发送数据 服务端结束阻塞,与客户端开始交互数据,交互完成,通信结束,10.3 TCP通信,10.3.4多线程的TCP网络程序 很多服务器端程序都是允许被多个应用程序访问的, 图中
16、代表的是多个客户端访问同一个服务器端,服务器端为每个客户端创建一个对应的Socket,并且开启一个新的线程使两个Socket建立专线进行通信,10.3 TCP通信,10.3.4 多线程的TCP网络程序,10.3 TCP通信,10.3.4 多线程的TCP网络程序 为了验证服务器端程序是否实现了多线程,首先运行服务端程序(例程10-12),之后运行三个客户端程序(例程10-11),当运行第一个客户端程序时,服务端马上就进行数据处理,打印出“开始与客户端交互数据”,再运行第二、和第三个客户端程序,会发现服务端也立刻做出回应,两个客户端会话结束后分别打印各自结束信息,10.3 TCP通信,10.3.5 TCP案例文件上传 服务器端程序,10.3 TCP通信,10.3.5 TCP案例文件上传 客户端上传程序,10.3 TCP通信,10.3.5 TCP案例文件上传 查看上传的文件,10.3 TCP通信,本章介绍了Java网络编程的相关知识。简要介绍了TCP协议和 UDP协议的区别,以及IP地址、端口号和InetAddress