网络程序设计基础

网络程序设计编写的是与其他计算机进行通信的程序。Java 已经将网络程序需要的元素封装成不同的类,用户只要创建这些类的对象,使用相应的方法,即使不具备有关的网络知识,也可以编写出高质量的网络通信程序。

局域网与互联网

为了实现两台计算机的通信,必须用一个网络线路连接两台计算机,如图22.1所示。

image 2024 03 06 14 18 28 732
Figure 1. 图22.1 服务器、客户机和网络

服务器是指提供信息的计算机或程序,客户机是指请求信息的计算机或程序。网络用于连接服务器与客户机,实现二者间的相互通信。但是,有时在某个网络中很难将服务器与客户机区分开。我们通常所说的局域网(local area network,LAN),就是一群通过一定形式连接起来的计算机,它可以由两台计算机组成,也可以由同一区域内的若干台计算机组成。将 LAN 延伸到更大的范围,这样的网络被称为广域网(wide area network,WAN)。我们熟悉的互联网(internet),就是由无数的 LAN 和 WAN 组成的。

网络协议

网络协议规定了计算机之间连接的物理、机械(网线与网卡的连接规定)、电气(有效的电平范围)等特征,计算机之间的相互寻址规则,数据发送冲突的解决方式,长数据如何分段传送与接收等内容。就像不同的国家有不同的法律一样,目前网络协议也有多种。下面简单地介绍几个常用的网络协议。

IP协议

IP 是 internet protocol 的简称,是一种网络协议。internet 网络采用的协议是 TCP/IP 协议,其全称是 transmission control protocol/internet protocol。internet 依靠 TCP/IP 协议,在全球范围内实现了不同硬件结构、不同操作系统、不同网络系统间的互联。在 internet 网络上存在着数以亿计的主机,每台主机都用网络为其分配的 internet 地址代表自己,这个地址就是 IP 地址。到目前为止,IP 地址用 4 个字节,也就是用 32 位的二进制数来表示的,被称为 IPv4。为了便于使用,通常取用每个字节的十进制数,并且每个字节之间用圆点隔开来表示 IP 地址,如 192.168.1.1。现在人们正在试验使用 16 个字节来表示 IP 地址,这就是 IPv6,但 IPv6 还没有投入使用。

TCP/IP 模式是一种层次结构,共分为4层,分别为应用层、传输层、互联网层和网络层。各层实现特定的功能,提供特定的服务和访问接口,并具有相对的独立性,如图22.2所示。

image 2024 03 06 14 20 46 190
Figure 2. 图22.2 TCP/IP层次结构

TCP与UDP协议

在 TCP/IP 协议栈中,有两个高级协议是网络应用程序编写者应该了解的,即传输控制协议(transmission control protocol,TCP)与用户数据报协议(user datagram protocol,UDP)。

TCP 协议是一种以固接连线为基础的协议,它提供两台计算机间可靠的数据传送。TCP 可以保证数据从一端送至连接的另一端时,能够确实送达,而且抵达的数据的排列顺序和送出时的顺序相同。因此,TCP 协议适合可靠性要求比较高的场合。就像拨打电话,必须先拨号给对方,等两端确定连接后,相互才能听到对方说话,也知道对方回应的是什么。

HTTP、FTP 和 Telnet 等都需要使用可靠的通信频道。例如,HTTP 从某个 URL 读取数据时,如果收到的数据顺序与发送时不相同,可能就会出现一个混乱的 HTML 文件或是一些无效的信息。

UDP 是无连接通信协议,不保证数据的可靠传输,但能够向若干个目标发送数据,或接收来自若干个源的数据。UDP 以独立发送数据包的方式进行。这种方式就像邮递员送信给收信人,可以寄出很多信给同一个人,且每一封信都是相对独立的,各封信送达的顺序并不重要,收信人接收信件的顺序也不能保证与寄出信件的顺序相同。

UDP 协议适合于一些对数据准确性要求不高,但对传输速度和时效性要求非常高的网站,如网络聊天室、在线影片等。这是由于 TCP 协议在认证上存在额外耗费,可能使传输速度减慢,而 UDP 协议即使有一小部分数据包遗失或传送顺序有所不同,也不会严重危害该项通信。

一些防火墙和路由器会设置成不允许 UDP 数据包传输,因此若遇到 UDP 连接方面的问题,应先确定所在网络是否允许 UDP 协议。

端口与套接字

一般而言,一台计算机只有单一的连到网络的物理连接(physical connection),所有的数据都通过此连接对内、对外送达特定的计算机,这就是端口。网络程序设计中的端口(port)并非真实的物理存在,而是一个假想的连接装置。端口被规定为一个为 0~65535 的整数。HTTP 服务一般使用 80 端口,FTP 服务使用 21 端口。假如一台计算机提供了 HTTP、FTP 等多种服务,那么客户机会通过不同的端口来确定连接到服务器的哪项服务上,如图22.3所示。

通常,0~1023 的端口数用于一些知名的网络服务和应用,用户的普通网络应用程序应该使用 1024 以上的端口数,以避免端口号与另一个应用或系统服务使用的端口号冲突。

网络程序中的套接字(socket)用于将应用程序与端口连接起来。套接字是一个假想的连接装置,就像插座一样可连接电器与电线,如图22.4所示。Java 将套接字抽象化为类,程序设计者只需创建 Socket 类对象,即可使用套接字。

image 2024 03 06 14 23 33 291
Figure 3. 图22.3 端口
image 2024 03 06 14 23 54 559
Figure 4. 图22.4 套接字