第二周实验补充材料基于Socket通信.pdf





《第二周实验补充材料基于Socket通信.pdf》由会员分享,可在线阅读,更多相关《第二周实验补充材料基于Socket通信.pdf(32页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第 2 章 基于 Socket 通信 网络通信是一种进程间通信(IPC:Inter-Process Communication),要求位于不同网络节点不同进程的通信双方必须遵循统一的通信协议方可实现。基于套接字(Socket)通信是应用在不同节点上的进程间通信的典型方法。本章介绍了基于Socket通信的基本方式:数据包Socket和流式Socket,详细说明其基本原理与实现方法。针对因特网典型应用与应用层协议开发,本章介绍简单的Daytime协议应用开发,以及文件传输协议(FTP:File Transfer Protocol)、超文本传输协议(HTTP:Hypertext Transfer P
2、rotocol)基本原理与开发过程。2.1 基本原理 2.1.1 Socket API 基本概念 Socket API是TCP/IP网络的API。Socket API最早作为伯克利(Berkeley)UNIX操作系统的程序库,出现于20世纪80年代早期,用于提供IPC通信。目前,所有主流操作系统都支持Socket API,在BSD、Linux等基于UNIX的系统中,Socket API都是操作系统内核的一部分。在MS-DOS、Windows等个人计算机操作系统也是以程序库的形式提供Socket API(其中在Windows系统中,Socket API被称作Winsock)。JAVA语言在设计之
3、初也考虑到网络编程,也将Socket API作为语言核心类的一部分。以上Socket API都有相同的消息模型和类似的语法。Socket API 的概念模型如 图 2-1 所示。Telnet FTPSMTPDNSSNMPTCPUDPARPRARP EthernetToken Ring其它协议HTTPTFTPIPSocket API运行时支持客户端进程Socket API运行时支持服务器进程 图 2-1 Socket API 的概念模型 Socket是物理网络地址和逻辑端口号的一个集合,通过这个集合可以向另外一个位置的与它具有相同定义的Socket进行数据传输。由于Socket是由机器地址和端口
4、号来识别的,那么在一个特定的计算机网络上,每一个Socket都是以此方式被唯一识别的。这就使得应用程序可以唯一被定位。套接字类型有二种:一个是流式Socket,它提供进程之间的逻辑连接,并且支持可靠的数据交换;另一个就是数据包Socket,它是无连接的并且不可靠。【提示】Socket 是从电话通信中借用的一个术语,socket 的英文原义是“孔”或“插座”。Socket 非常类似于电话插座,电话的通话双方相当于相互通信的 2 个进程,区号是它的网络地址;区内一个单位的交换机相当于一台主机,主机分配给每个用户的局内号码相当于 socket 号。任何用户在通话之前,首先要占有一部电话机,相当于申请
5、一个 socket;同时要知道对方的号码,相当于对方有一个固定的 socket。2.1.2 JAVA 对网络通信的支持 JDK(Java Developers Kit)提供的预定义类库支持Java程序直接发送与接收TCP数据段或UDP数据报,并帮助程序员以更直接的方式处理建立在TCP之上的应用层协议HTTP、FTP、FILE、HTTPS等。程序员使用这些预定义的类可轻松实现基于TCP和UDP的编程,或更直接地通过HTTP、FTP、FILE等协议访问以URL定位的网上资源。以面向连接的TCP为基础,程序员还可实现常见的Telnet、FTP、SMTP等应用层协议的客户程序或服务程序。JDK预定义的
6、类均存放在程序包中,使用其中的哪些类取决于所需处理的通信协议。例如,基于TCP的应用程序可使用Socket、ServerSocket等类;基于UDP的应用程序则使用DatagramPacket、DatagramSocket、MulticastSocket等类;基于HTTP和FTP等协议直接访问URL资源的应用程序可使用URL、URLConnection等类;更注重网络通信安全的HTTPS应用程序则使用SSLSocketFactory、SSLSocket、SSLSession等类。【提示】JDK 目前提供的预定义类库并不支持网络层 IP 协议,因而程序员无法使用预定义的类直接在 Java 程序中
7、发送或接收原始 IP 数据报。倘若应用程序需处理 TCP 和 UDP 之外的传输层协议,或者是直接处理网络层或链路层的任何协议(例如 IP、ICMP、IGMP、ARP/RARP 等协议),可借助于 Java 语言的地代码(native code)机制。2.1.3 TCP、UDP 与端口 尽管位于传输层的协议TCP和UDP均使用相同的网络层协议IP,但这两种传输层协议却为应用层提供了完全不同的服务:TCP提供一种面向连接的、可靠的数据流服务,而UDP则提供一种面向独立数据报的高效传输服务。(1)TCP 传输控制协议 传输控制协议(TCP:Transfer Control Protocol)是一种
8、面向连接的传输层协议,可为两台不同主机上的应用程序提供可靠的数据流连接。所谓“面向连接”,意味着两个使用TCP通信的应用程序在交换数据之前,必须先建立一个TCP连接,待通信结束后须关闭该连接。这一过程与电话通信相似:先拨号振铃,等待对方摘机应答后再表明身份,通话完毕后挂机。TCP执行的任务包括把应用层传来的数据分解为合适的数据段交给网络层,确认接收到的数据分组,设置发送最后确认分组的超时时间等,为应用层屏蔽了实现端到端可靠通信的细节。TCP可保证数据从连接的一端送到另一端时仍能保持原来发送时的次序,否则将一个传输错误。TCP为需要可靠通信的应用程序提供了一种点对点信道,在因特网上常见的FTP、
9、Telnet、SMTP等大多数应用层协议都建立在TCP的基础上。(2)UDP 用户数据报协议 与TCP协议不同的是,用户数据报协议(UDP:User Datagram Protocol)不是基于连接的,而是为应用层提供一种非常简单、高效的传输服务。UDP从一个应用程序向另一应用程序发送独立的数据报,但并不保证这些数据报一定能到达另一方,并且这些数据报的传输次序无保障,后发送的数据报可能先到达目的地。使用UDP协议时,任何必需的可靠性都须由应用层自己提供。UDP适用于对通信可靠性要求低且对通信性能要求高的应用,诸如域名系统DNS(Domain Name System)、路由信息协议RIP(Rou
10、ting Information Protocol)、简单网络管理协议SNMP(Simple Network Management Protocol)、普通文件传送协议TFTP(Trivial File Transfer Protocol)等应用层协议都建立在UDP的基础上。虽然UDP不如TCP那样常用,但UDP因其固有的特点而在某些应用场合可更好地发挥特长。例如在一个TCP连接中仅允许两方参与通信,故广播和多播方式不能用于TCP协议,但UDP却能有效地支持广播和多播通信;又如,对一个播发时间的服务程序而言,重发丢失的数据已毫无意义,因为知道数据丢失后原来的时间已经过去;使用ping方式测试两
11、个应用序的通信效果时,反而需要计算数据的丢失率;在一些协同工作的网络应用程序之间,还可利用UDP实现心跳消息(heartbeat message)彼此通知各自的存在。注意在适合UDP协议的各种应用中,要么是因为TCP协议提供的可靠性服务是多余的,要么由应用程序自己实现了所需的可靠性。(3)端口 由于现代计算机大多运行多任务操作系统,故一台主机上可能同时运行多个应用程序进程,并且一个进程还可能使用多个不同的连接,因而仅用主机名或IP地址无法惟一地标识数据包的源或目标。端口为标识参与通信的主机、进程和连接提供了一种统一的、惟一的方法,图 2-2 应用层协议及其对应端口【思考】请与并行口或串行口等具
12、体物理实体相对比,理解端口是一个物理概念,还仅仅是一个程序设计层面的逻辑概念?因特网上数据的传输目标由主机和端口号组成,例如UDP这类基于数据报通信的每一数据报中均含有端口号信息。主机可由32位的IP地址标识(假设采用IPv4),端口则采用16位数字标识,故端口号的取值范围为0-65535。编号为0-1023的端口保留给系统服务使用,包括HTTP、FTP、Telnet、SMTP等常见服务。应用程序则使用剩余的其他端口,例如Java远程方法调用(RMI)使用端口1099,Microsoft SQL Server默认使用端口1433,BEA WebLogic Server默认使用端口7001和70
13、02等。(如 图 2-2 所示。)【提示】对于基于连接的通信(例如 TCP 协议)而言,端口为不同应用程序提供了虚拟的专用连接,每一个socket 都绑定到特定的端口号。2.2 数据报 Socket 2.2.1 基本编程原理 UDP采用数据报进行通信,数据报是否可到达目标、以什么次序到达目标、到达目标时内容是否依然正确等均是未经校验的。因而UDP是一种不可靠的点对点通信,适合对通信性能要求高、但通信可靠性要求低的应用,并可支持广播和多播通信方式。与基于TCP的通信类似,基于UDP的单播通信是将数据报从一个发送方传输给单个接收方。程序包为实现UDP单播通信主要提供了两个类:类DatagramPa
14、cket代表一个被传送的UDP数据包,该类封装了被传送数据报的内容、源主机与端口号、目标主机与端口号等信息;类DatagramSocket代表一个用于传送UDP数据包的UDPsocket。【提示】由于 UDP 并不是一种基于连接的协议,因而对 UDP 而言没有类似 TCP 的 I/O 流机制。(1)类 DatagramPacket 从类DatagramPacket的构造方法可看出,创建一个DatagramPacket实例时必须提供被封装的数据报详细信息:DatagramPacket(byte buf,int offset,int length)DatagramPacket(byte buf,i
15、nt length)DatagramPacket(byte buf,int offset,int length,InetAddress address,int port)DatagramPacket(byte buf,int offset,int length,SocketAddress address)throws SocketException DatagramPacket(byte buf,int length,InetAddress address,int port)DatagramPacket(byte buf,int length,SocketAddress address)thr
16、ows SocketException 其中,参数buff指定一个字节数组作为缓冲区,用于存放所接收的UDP数据报;参数offset指定缓冲区中的偏移量;参数length表示以字节计算的数据报长度,该参数不可大于缓冲区的大小;参数address和port指定数据报传送目标的地址与端口号,可调用该实例的setAddress()和setPort()方法重新设定目标地址和端口号。类DatagramPacket既可描述客户程序发送的一个UDP数据报,也可描述服务程序接收的一个UDP数据报。该类提供了多个方法用于设置或访问UDP数据报的状态,例如接收或发送该数据报的主机(IP地址与端口号)、存放在内部缓
17、冲区中的数据报内容以及缓冲区的偏移量与数据报长度等。这些设置和访问方法包括:/设置接收该数据报的主机地址 public synchronized void setAddress(InetAddress iaddr)/返回发送或接收数据报的主机地址 public synchronized InetAddress getAddress()/设置接收该数据报的主机端口号 public synchronized void setPort(int iport)/返回发送或接收数据报的主机端口号 public synchronized int getPort()/设置接收该数据报的远程主机地址(Socke
18、tAddress 实例中已含IP 地址和端口号)public synchronized void setSocketAddress(SocketAddress address)/返回接收或发送该数据报的远程主机地址 public synchronized SocketAddress getSocketAddress()/设置数据报中的数据缓冲区(偏移量为0 且长度为缓冲区的长度)public synchronized void setData(byte buf)/设置缓冲区中的数据、偏移量与长度 public synchronized void setData(byte buf,int off
19、set,int length)/返回缓冲区中从偏移量offset 开始、长度为length 的数据 public synchronized byte getData()/返回缓冲区的偏移量设置 public synchronized int getOffset()/设置数据报的长度 public synchronized void setLength(int length)/返回发送或接收的数据报的长度 public synchronized int getLength()(2)类 DatagramSocket 基于TCP 的通信是一种面向连接的socket,而UDP socket则面向一个个
20、独立的数据报。一个UDP socket既可用于发送UDP数据报,也可用于接收UDP数据报。类DatagramSocket封装了一个UDP socket绑定的本地主机地址与端口号,及其连接的远程主机地址与端口号,并且支持通过该UDP socket发送和接收UDP数据报。在创建一个DatagramSocket实例时,可通过不同形式的构造方法指定该UDP socket绑定的主机地址与端口号:DatagramSocket()throws SocketException DatagramSocket(SocketAddress bindAddr)throws SocketException Datagr
21、amSocket(int port)throws SocketException DatagramSocket(int port,InetAddress addr)throws SocketException 其中,参数bindAddr指定新实例绑定的本地socket地址,参数address和port指定新实例绑定的本地主机地址和端口号。类DatagramSocket负责管理UDP socket的绑定和连接状态,执行发送和接收UDP数据报的操作。当一个UDP socket连接到一个由地址和端口号指定的远程主机时,该socket只能向该地址发送或从该地址接收UDP数据报。类DatagramSoc
22、ket提供的主要方法如下:/将当前UDP socket 绑定到一个本地主机地址与端口号 public synchronized void bind(SocketAddress addr)throws SocketException/返回当前绑定的本地主机地址和端口号 public SocketAddress getLocalSocketAddress()/返回当前绑定的本地主机地址 public InetAddress getLocalAddress()/返回当前绑定的本地主机端口号 public int getLocalPort()/返回当前的绑定状态 public boolean isBo
23、und()/将当前UDP socket 连接到一个远程主机地址与端口号 public void connect(InetAddress address,int port)public void connect(SocketAddress addr)throws SocketException/断开当前UDP socket 与远程主机的连接 public void disconnect()/返回当前连接的远程主机地址和端口号 public SocketAddress getRemoteSocketAddress()/返回当前连接的远程主机地址 public InetAddress getInet
24、Address()/返回当前连接的远程主机端口号 public int getPort()/返回当前的连接状态 public boolean isConnected()/利用当前UDP socket 发送一个UDP 数据报 public void send(DatagramPacket p)throws IOException/利用当前UDP socket 接收一个UDP 数据报 public synchronized void receive(DatagramPacket p)throws IOException/关闭当前UDP socket public void close()/判断当前
25、UDP socket 是否已关闭 public boolean isClosed()【提示】除上述主要方法外,类 DatagramSocket 还提供了 UDP socket 选项的设置与访问方法。例如,setSoTimeout()和 getSoTimeout()可用于设置或访问 UDP socket 的超时选项 SO_TIMEOUT,类似地还可设置或访问 UDP socket 的 SO_SNDBUF、SO_RCVBUF、SO_REUSEADDR、SO_BROADCAST 等选项。2.2.2 面向无连接数据包 UDP 图 2-3 显示UDP与TCP协议之间的不同在于UDP不是一种基于稳定连接的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第二 实验 补充 材料 基于 Socket 通信

限制150内