现在的应用程序几乎都和网络挂钩,小到APP,大到PC软件,几乎没有一个不能实现和网络交互。所以今天总结一下网络编程。方便日后查找,也是对学习的一个小结吧。
Java网络编程主要用到TCP/UDP协议:
TCP
TCP(Transmission Control Protocol),也就是传输控制协议,是面向连接的通信协议。它提供两台计算机之间的可靠无差错的数据传输。也就是说,在正式收发数据前,必须和对方建立可靠的连接。应用程序通过 TCP 进行通讯时,数据源和接收目标之间会建立一个虚拟的连接,这个连接一旦建立,两台计算机之间就可以把数据作为双向字节流进行交换。
一个TCP连接必须要经过三次“握手”才能建立起来,其中的过程非常复杂,我们这里只做简单、形象的介绍,你只要做到能够理解这个过程即可。我们来看看这三次对话的简单过程:主机A向主机B发出连接请求数据包:“我想给你发数据,可以吗?”,这是第一次对话;主机B向主机A发送同意连接和要求同步(同步就是两台主机一个在发送,一个在接收,协调工作)的数据包:“可以,你什么时候发?”,这是第二次对话;主机A再发出一个数据包确认主机B的要求同步:“我现在就发,你接着吧!”,这是第三次对话。三次“对话”的目的是使数据包的发送和接收同步,经过三次“对话”之后,主机A才向主机B正式发送数据。TCP适用于传送大量数据并对数据可靠性要求高的场合,传输速度相对慢一些。
UDP
UDP(User Datagram Protocol),用户数据报协议,是面向无连接的通信协议。它不与对方建立连接,而是直接就把数据包发送过去! 它是一个无连接的通信协议,UDP 不保证用户数据的可靠性传输,但能向若干个目标发送数据,和接收若干个数据源的数据。如果一台主机向另一台主机发送 UDP 数据,这个数据会立即发送出去,而不管另一台主机是否准备好接收数据。当网络状态异常的时候,会造成 UDP 数据报的丢失。如果另外一台主机接收到了数据,它不会确认是否收到。 UDP适用于一次只传送少量数据、对可靠性要求不高的应用环境,传输速度相对快一点。
Socket
所谓socket通常也称作"套接字",是网络驱动层提供给应用程序编程接口和一种机制。用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过"套接字"向网络发出请求或者应答网络请求。Socket和ServerSocket类库位于java.net包中。ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。不管是Socket还是ServerSocket它们的工作都是通过SocketImpl类及其子类完成的。
Socket 是在应用程序中创建的,它是通过一种绑定机制与驱动程序建立关系,告诉自己所对应的 IP 和 Port。在网络上传输的每一个数据帧,必须包含发送者的 IP 地址和端口号。创建完 Socket 以后,应用程序写入到 Socket 的数据,由 Socket 交给驱动程序向网络上发送数据,计算机从网络上收到与某个 Socket 绑定的 IP 和 Port 相关的数据后,由驱动程序再交给 Socket ,应用程序就可以从这个 Socket 中读取接收到的数据。网络应用程序就是这样通过 Socket 发送和接收的。
Socket 数据发送过程:
1、由应用程序产生一个 Socket。
2、应用程序调用 bind() 方法,将 Socket 的信息通知给驱动程序。这个 Socket 的信息主要是包括 IP 地址和端口号。
3、应用程序向 Socket 中写入数据数据。
4、驱动程序从 Socket 中取出数据,并通过网卡发送数据。
Socket 数据接收过程:
1、由应用程序产生一个 Socket。
2、应用程序调用 bind() 方法,将 Socket 的信息通知给驱动程序。
3、如果驱动程序收到的数据包中,包含了这个 Socket 所包含的 IP 和端口号,那么驱动程序就会把数据处理后传递给 Socket 中。
4、当 Socket 当中有数据时,应用程序就将数据从 Socket 中取走。
Java 中的网络编程类
- 位于 java.net 包中。
- 用于 UDP 通信的 Socket 对应的是 DatagramSocket 类。
- 用 于 TCP 通信的 Socket 对应的是 ServerSocket 类。由于 TCP 程序分为客户端和服务器端,ServerSocket 是用于服务器端,Socket 类用于 TCP 通信的服务器和客户端。这个服务器端指的是专用于与客户端进行通信的 Socket ,ServerSocket 是用于接收客户端连接的 Socket。如果在创建 Socket 时没有指定端口号,系统就会为它分配一个其它网络程序还没有使用的端口号, 如果在创建 Socket 时没有指定 IP 地址,底层驱动程序会选择计算机上的任意一个 IP 地址作为发送源 IP 地址。对于一般只有一个 IP 地址的计算机不用指定 IP 地址。如果有多个网卡多个 IP 就应该指定特定IP 地址。
TCP 客户端与 TCP 服务器端程序的交互过程:
首先,由 TCP 服务器程序创建一个 ServerSocket 类,然后调用 accept() 方法等待客户端的连接。
其次,客户端程序创建一个 Socket 并请求与服务器建立连接。
接着,是服务器接收客户的连接请求,并创建一个与请求相关的新的 Socket 与客户机专线连接。
再次,建立连接的两个 Socket 在一个单独的线程(由服务器创建)上对话。
最后,服务器程序又开始等待新的连接请求,当新的连接请求到达时,它又会重复 2~5 的过程。