网络程序设计编写的是与其他计算机进行通信的程序。Java已经将网络程序所需要的东西封装成不同的类,用户只要创建这些类的对象,使用相应的方法,即使不具备有关的网络知识,也可以编写出高质量的网络通信程序。
1.局域网与因特网
为了实现两台计算机的通信,必须用一个网络线路连接两台计算机。
服务器是指提供信息的计算机和程序,客户机是指请求信息的计算机或程序。网络用于连接服务器与客户机,实现两者间的相互通信。但有时在某个网络中很难将服务器和客户机区分开来,我们通常说的局域网(local area network,LAN),就是一群通过一定形式连接起来的计算机。它可以由两台计算机组成,也可以由同一区域内的成千上万台计算机组成。将LAN延伸到更大范围,这样的网络称为广域网(Wide Area Network,WAN)。我们熟悉的因特网,就是由无数的LAN和WAN组成的。
1.1 网络协议
网络协议规定了计算机之间连接的物理、机械(网卡与网线的连接规定)、电气(有效的电平范围)等特征,计算机之间的相互寻址规则,数据发送冲突的解决方式,长数据如何分段传送与接收等内容。就像不同国家有不同的法律一样,目前网络协议也有多种。下面简单介绍几个常用的网络协议。
(1)IP协议
IP是Internet Protocol的简称,是一种网络协议。Internet网络采用的协议是TCP/IP协议。Internet依靠TCP/IP协议,在全球范围内实现了不同硬件结构、不同操作系统、不同网络系统之间的互联。在Internet网络上存在着数以亿计的主机,每台主机都用网络为其分配的Internet地址代表自己,这个就是IP地址。到目前为止,IP地址用4个字节,也就是32位的二进制数来表示,称为IPv4。为了便于使用,通常取用每个字节的十进制数,并且每个字节之间用圆点隔开来表示IP地址,如192.168.1.1。现在人们正在试验用16个字节来表示IP地址,这个就是IPv6,但是IPv6还没有投入使用。
TCP/IP模式是一种层次结构,共分4层,分别为应用层、传输层、互联网层和网络层。各层实现特定的功能,提供特定的服务和访问接口,并具有相对的独立性,TCP/IP层次结构 如图所示:
(2)TCP与UDP协议
在TCP/IP协议栈中,有两个高级协议是网络应用程序编写者应该了解的,即传输控制协议(TCP,transmission control protocol)与用户数据报协议(UDP,user datagram protocol)。
TCP协议是一种以固连接为基础的协议,它提供两台计算机间可靠的数据传送。TCP可以保证从一端数据送至连接的另一端时,数据能够确实送达,而且抵达的数据的排列顺序和送出时的排列顺序相同。因此,TCP协议适合可靠性要求比较高的场合。就像拨打电话,必须先给对方拨号,等两端确定连接后,相互才能听到对方说话,也知道对方回应的是什么。
HTTP、FTP和Telent等都需要使用可靠的通信频道。例如,HTTP从某个URL读取数据时,如果收到的数据顺序与发送时不相同,可能就会出现一个混乱的HTML文件或者一些无效的信息。
UDP是无连接通信协议,不保证数据的可靠传输,但能够向若干个目标发送数据,或接收来自若干个源的数据。UDP以独立发送数据包的方式进行。这种方式就像邮递员送信给接收人,可以寄出很多信给同一个人,且每一封信都是相对独立的,各封信送达的顺序并不重要,收信人接收信件的顺序也不能保证与寄出信件的顺序相同。
UDP协议适合于一些对数据准确性要求不高但对传输速度和时效性非常高的网站,如网络聊天室、在线影片等。一些防火墙和路由器会设置成不允许UDP数据包传输,因此若遇到UDP连接方面的问题,应先确定所在网络是否允许UDP协议。
1.2 端口和套接字
一般而言,一台计算机只有单一的连到网络的物理连接,所有数据都通过此连接对内、对外送达特定的计算机,这就是端口。网络程序设计中的端口(port)并非真实的物理存在,而是一个假想的连接装置。端口被规定为一个在0~65535之间的整数。HTTP服务一般使用80端口,FTP服务使用21端口。假如一台计算机提供了HTTP、FTP等多种服务,那么客户机会通过不同的端口来确定连接到服务器的哪些服务上。
通常,0~1023之间的端口数用于一些知名的网络服务和应用,用户的普通网络应用程序应该使用1024以上的端口数,以避免端口号与另一个应用或系统服务所用端口冲突。
网络程序中的套接字(Socket)用于将应用程序与端口连接起来。套接字是一个假想的连接装置,就像插座一样可以连接电器与电线,如图所示。Java将套接字抽象化为类,程序设计者只需创建Socket类对象,即可使用套接字。
端口示意图:
套接字示意图: