开一个网站建设公司需要什么软件,长沙网站建设有限公司,聊城做网站比较不错的公司,湘潭做网站 磐石网络1、进程间的通信
进程指运行中的程序#xff0c;进程的任务就是执行程序中的代码。EchoPlayer类是一个独立的Java程序#xff0c;它可以在任意一台安装了JDK的主机上运行#xff1a;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStr…1、进程间的通信
进程指运行中的程序进程的任务就是执行程序中的代码。EchoPlayer类是一个独立的Java程序它可以在任意一台安装了JDK的主机上运行
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;public class EchoPlayer {public String echo(String msg){return echo:msg;}public void talk() throws IOException {BufferedReader bufferedReader new BufferedReader(new InputStreamReader(System.in));String msgnull;while ((msgbufferedReader.readLine())!null){System.out.println(echo(msg));if(msg.equals(bye)){break;}}}public static void main(String[] args) throws IOException {new EchoPlayer().talk();}
}
运行“java EchoPlayer”命令就启动了EchoPlayer进程该进程执行EchoPlayer类的main()方法。下图演示了EchoPlayer进程的运行过程它从本地控制台中获得标准输入流和标准输出流。本地控制台为用户提供了基于命令行的用户界面用户通过控制台与EchoPlayer进程交互。 提示确切地说运行“java EchoPlayer”命令就启动了一个Java虚拟机Java Virtual MachineJVM进程该进程执行EchoPlayer类的main()方法。为了叙述方便把运行EchoPlayer类的main()方法的JVM进程直接称为EchoPlayer进程。
EchoPlayer类的echoString msg方法负责生成响应结果。如果需要把生成响应结果的功能即echoString msg方法移动到一个远程主机上那么上面的EchoPlayer类无法满足这一需求。在这种情况下要创建两个程序客户程序EchoClient和服务器程序EchoServer。EchoClient程序有两个作用
与用户交互从本地控制台获得标准输入流和标准输出流。与远程的EchoServer通信向EchoServer发送用户输入的字符串接收EchoServer返回的响应结果再把响应结果写到标准输出流。
EchoServer程序负责接收EchoClient发送的字符串然后把响应结果发送给EchoClient。下图演示了EchoClient与EchoServer的通信过程。客户机和远程服务器是通过网络连接的两台主机。客户机上运行EchoClient进程远程服务器上运行EchoServer进程。 张三给李四打电话两者顺利通话的前提条件是他们各自的电话机都连接到了电话网络上。张三和李四只需关注他们谈话的具体内容而不必考虑如何把自己的话音传输到对方的电话机上。传输语音信息的任务是由电话网络来完成的。
同样两个进程顺利通信的前提条件是它们所在的主机都连接到了计算机网络上。EchoClient与EchoServer只需关注它们通信的具体内容例如EchoClient发送信息“hello”那么EchoServer返回信息“echo:hello”。EchoClient和EchoServer都无须考虑如何把信息传输给对方。传输信息的任务是由计算机网络来完成的。
Java开发人员的任务是编写EchoClient和EchoServer程序接下来在两台安装了JDK的主机上分别运行它们两个进程就会有条不紊地通信。
由于进程之间的通信建立在计算机网络的基础上Java开发人员有必要对计算机网络有基本的了解这有助于更容易地掌握Java网络编程技术。
2、计算机网络的概念
计算机网络是现代通信技术与计算机技术相结合的产物。所谓计算机网络指把分布在不同地理区域的计算机用通信线路互联起来的一个具有强大功能的网络系统。在计算机网络上众多计算机可以方便地互相通信共享硬件、软件和数据信息等资源。通俗地说计算机网络就是通过电缆、电话线或无线通信设施等互联的计算机的集合。
网络中每台机器称为节点Node。大多数节点是计算机此外打印机、路由器、网桥、网关和哑终端等也是节点。我们通常用“节点”指代网络中的任意一个设备用“主机”指代网络中的计算机节点。
如下图所示人与人之间通过某种语言来交流网络中的主机之间也通过“语言”来交流这种语言称为网络协议这是对网络协议的通俗解释后面还会更深入地介绍网络协议的概念。 网络中的每个主机都有地址它是用于标识主机的字节序列。字节序列越长可以表示的地址数目就越多这意味着可以有越多的设备连入网络。
按照计算机联网的区域大小可以把网络分为局域网Local Area NetworkLAN和广域网Wide Area NetworkWAN。局域网指在一个较小地理范围内的各种计算机互联在一起的通信网络可以包含一个或多个子网通常局限在几千米的范围之内。例如在一个房间、一座大楼或是在一个校园内的网络可称为局域网。广域网连接地理范围较大常常是一个国家或是一个洲是为了让分布较远的各局域网互联。
Internet是由许多小的网络互联成的国际性大网络在各个小网络内部使用不同的协议那么如何使不同的网络之间能进行信息交流呢如下图所示上海人讲上海方言广东人讲广东方言上海人与广东人用普通话沟通。 与此相似不同网络之间的互联靠网络上的标准语言—TCP/IP。的互联靠网络上的标准语言—TCP/IP。如下图所示一个网络使用协议A另一个网络使用协议B这两个网络通过TCP/IP进行互联。
3、OSI参考模型
在计算机网络产生之初每家计算机厂商都有一套自己的网络体系结构它们之间互不相容。为此国际标准化组织International Organization for StandizationISO在1979年建立了一个分委员会来专门研究一种用于开放系统互联Open System InterconnectionOSI的体系结构“开放”这个词意味着一个网络系统只要遵循OSI模型就可以和位于世界上任何地方的、也遵循OSI模型的其他网络系统连接。这个分委员会提出了OSI参考模型它为各种异构系统互联提供了概念性的框架。
OSI参考模型把网络分为7层分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层如下图示。每一层都使用下层提供的服务并为上层提供服务。 不同主机之间的相同层称为对等层。例如主机A中的表示层和主机B中的表示层互为对等层主机A中的会话层和主机B中的会话层互为对等层。OSI参考模型中各层的主要功能如下
1物理层Physical Layer传输信息离不开物理介质如双纽线和同轴电缆等但物理介质并不在OSI的7层之内有人把物理介质当作OSI的第零层。物理层的任务就是为它的上一层提供物理连接以及规定通信节点之间的机械和电气等特性如规定电缆和接头的类型、传送信号的电压等。在这一层上数据作为原始的比特bit流被传输。本层的典型设备是集线器Hub。2数据链路层Data Link Layer:数据链路层负责在两个相邻节点间的线路上无差错地传送以帧为单位的数据。每一帧包括一定数量的数据和一些必要的控制信息。数据链路层要负责建立、维持和释放数据链路的连接。在传送数据时如果接收方检测到所传数据中有差错就要通知发送方重发这一帧。本层的典型设备是交换机Switch。3网络层Network Layer:在计算机网络中进行通信的两个计算机之间可能会经过很多个数据链路也可能还要经过很多个通信子网。网络层的任务就是选择合适的网间路由和交换节点确保数据被及时地传送到目标主机。网络层将数据链路层提供的帧组成数据包包中封装有网络层包头包头中含有逻辑地址信息——源主机和目标主机的网络地址。本层的典型设备是路由器Router。如下图所示主机A发送的数据先后经过节点1和节点4最后到达主机B。相邻两个节点之间的线路被称为数据链路比如主机A与节点1、节点1与节点4以及节点4与主机B之间的线路。数据链路层负责数据链路上的数据传输。从主机A到主机B的整个路径被称为路由网络层负责选择合适的路由。 4传输层Transport Layer该层的任务是根据通信子网的特性来充分利用网络资源为两个端系统也就是源主机和目标主机的会话层提供建立、维护和取消传输连接的功能以可靠方式或者不可靠方式传输数据。所谓可靠方式指保证把源主机发送的数据正确地送达目标主机所谓不可靠方式则指不保证把源主机发送的数据正确地送达目标主机数据有可能丢失或出错。在这一层信息的传送单位是报文。5会话层Session Layer这一层也可以被称为会晤层或对话层在会话层及以上层次中数据传送的单位不再另外命名统称为报文。会话层管理进程之间的会话过程即负责建立、管理、终止进程之间的会话。会话层还通过在数据中插入校验点来实现数据的同步。6表示层Presentation Layer表示层对上层数据进行转换以保证一个主机的应用层的数据可以被另一个主机的应用层理解。表示层的数据转换包括对数据的加密、解密、压缩、解压和格式转换等。7应用层Application Layer应用层确定进程之间通信的实际用途以满足用户实际需求。浏览Web站点、收发E-mail、上传或下载文件以及远程登入服务器等都可以看作是进程之间通信的实际用途。如下图所示当源主机向目标主机发送数据时在源主机方数据先由上层向下层传递每一层都会给上一层传递来的数据加上一个信息头header然后向下层发出最后通过物理介质传输到目标主机。在目标主机方数据再由下层向上层传递每一层都先对数据进行处理把信息头去掉再向上层传输最后到达最上层就会还原成实际的数据。各个层加入的信息头有着不同的内容比如网络层加入的信息头中包括源地址和目标地址信息传输层加入的信息头中包括报文类型、源端口和目标端口、序列号和应答号等信息。在下图中AH、PH、SH、TH、NH和DH分别表示各个层加入的信息头数据链路层还会为数据加上信息尾DT。 在生活中也常常采用这种方式来传输实际物品。比如张三给李四邮寄一封信真正要传输的内容是信。为了保证信能正确到达目的地在发送时需要把信封装到一个信封中上面写上发信人和收信人地址。接收方收到了被封装的信需要拆开信封才能得到里面的信。
OSI参考模型把网络分为多个层次每个层次都有明确的分工这简化了网络系统的设计过程。例如在设计应用层时只需考虑如何创建满足用户实际需求的应用在设计传输层时只需考虑如何在两个主机之间传输数据在设计网络层时只需考虑如何在网络上找到一条发送数据的路径即路由。
对等层之间互相通信需要遵守一定的规则如通信的内容和通信的方式这种规则被称为网络协议Protocol。值得注意的是OSI参考模型并没有具体的实现方式它没有在各层制定网络协议但它为其他计算机厂商或组织制定网络协议提供了参考框架。网络的各个层次都有相应的协议以下归纳了OSI各个层的一些典型协议这些协议均由第三方提供
·物理层协议EIA/TIA RS-232、EIA/TIA RS-449、V.35、RJ-45等。数据链路层协议HDLC、PPP、IEEE 802.3/802.2等。网络层协议IP、IPX、ICMP、IGMP、AppleTalk DDP等。传输层协议TCP、UDP、SPX等。会话层协议NetBIOS、RPC、NFS、AppleTalk等。表示层协议ASCII、GIF、JPEG、MPEG等。应用层协议TELNET、FTP、HTTP、SNMP、SMTP等。
4、TCP/IP参考模型和TCP/IP
国际标准化组织ISO制订的OSI参考模型提出了网络分层的思想这种思想对网络的发展具有重要的指导意义。但由于OSI参考模型过于庞大和复杂所以它难以被投入实际运用中。与OSI参考模型相似的TCP/IP参考模型吸取了网络分层的思想但是对网络的层次做了简化并且在网络各层除主机-网络层外都提供了完善的协议这些协议构成了TCP/IP集简称TCP/IP。TCP/IP是目前最流行的商业化协议它是当前的工业标准或“事实标准”TCP/IP主要用于广域网在一些局域网中也有运用。
TCP/IP参考模型是美国国防部高级研究计划局计算机网Advanced Research Project Agency NetworkARPANET以及后来的Internet使用的参考模型。ARPANET是由美国国防部U.S.Department of DefenseDoD赞助的研究网络。最初它只连接了美国境内的四所大学。在随后的几年中它通过租用的电话线连接了数百所大学和政府部门。最终ARPANET发展成为全球规模最大的互联网络——Internet。最初的ARPANET则于1990年永久关闭。下图把TCP/IP参考模型和OSI参考模型进行了对比。 TCP/IP参考模型分为4个层次应用层、传输层、网络互联层和主机-网络层。每一层都有相应的协议。确切地说TCP/IP应该被称为TCP/IP集它是TCP/IP参考模型的除主机-网络层以外的其他三层的协议的集合而IP和TCP则是协议集的最核心的两个协议。下表列出了各层的主要协议其中主机-网络层的协议是由第三方提供的。 在TCP/IP参考模型中去掉了OSI参考模型中的会话层和表示层这两层的功能被合并到应用层同时将OSI参考模型中的数据链路层和物理层合并到主机-网络层。下面分别介绍各层的主要功能。
1主机-网络层实际上TCP/IP参考模型没有真正提供这一层的实现也没有提供协议。它只是要求第三方实现的主机-网络层能够为上层——网络互联层提供一个访问接口使得网络互联层能利用主机-网络层来传递IP数据包。美国电气及电子工程师学会Institute of Electrical and Electronics EngineerIEEE制定了IEEE802.3和IEEE802.4协议集它们位于OSI参考模型的物理层和数据链路层相当于位于TCP/IP参考模型的主机-网络层。采用IEEE802.3协议集的网络被称为以太网采用IEEE802.4协议集的网被称为令牌环网。以太网和令牌环网都向网络互联层提供了访问接口。2网络互联层网络互联层是整个参考模型的核心。它的功能是把IP数据包发送到目标主机。为了尽快地发送数据把原始数据分为多个数据包然后沿不同的路径同时传递。如下图所示由主机A发出的原始数据被分为3个数据包然后沿不同的路径到达主机B可谓殊途同归。数据包到达的先后顺序和发送的先后顺序可能不同这就需要上层——传输层对数据包重新排序还原为原始数据。 网络互联层具备连接异构网的功能。下图展示了其连接以太网和令牌环网的方式。以太网和令牌环网是不同类型的网两者有不同的网络拓扑结构。以太网和令牌环网都向网络互联层提供了统一的访问接口访问接口向网络互联层隐藏了下层网络的差异使得两个网络之间可以顺利传递数据包。 网络互联层采用的是IPInternet Protocol它规定了数据包的格式并且规定了为数据包寻找路由的流程。3传输层传输层的功能是使源主机和目标主机上的进程可以进行会话。在传输层定义了两种服务质量不同的协议即传输控制协议Transmission Control ProtocolTCP和用户数据报协议User Datagram ProtocolUDP。TCP是一种面向连接的、可靠的协议。它将源主机发出的字节流无差错地发送给互联网上的目标主机。在发送端TCP负责把从上层传送下来的数据分成报文段并传递给下层。在接收端TCP负责把收到的报文进行重组后递交给上层。TCP还要处理端到端的流量控制以避免接收速度缓慢的接收方没有足够的缓冲区来接收大量数据。应用层的许多协议如HTTPHyper Text Transfer Protocol、FTPFile Transfer Protocol和TELNET协议等都建立在TCP基础上。UDP是一个不可靠的、无连接协议主要适用于不需要对报文进行排序和流量控制的场合。UDP不能保证数据报的接收顺序同发送顺序相同甚至不能保证它们是否全部到达目标主机。应用层的一些协议如SNMP和DNS协议就建立在UDP基础上。如果要求可靠的传输数据则应该避免使用UDP而要使用TCP。4应用层TCP/IP模型将OSI参考模型中的会话层和表示层的功能合并到应用层实现。针对各种各样的网络应用应用层引入了许多协议。基于TCP的应用层协议主要包括以下几类 FTP 文件传输协议允许在网络上传输文件。 Telnet 虚拟终端协议允许从主机A登入远程主机B使得主机A充当远程主机B的虚拟终端。 HTTP 超文本传输协议允许在网络上传送超文本。 HTTPSSecure Hypertext Transfer Protocol安全超文本传输协议允许在网络上安全地传输超文本网上传输的是经过加密的数据到达目的地后再对数据解密。 POP3Post Office Protocol-Version 3邮局协议-版本3允许用户在客户程序中访问在远程服务器上的电子邮件。 IMAP4Internet Message Access Protocol Version 4Internet消息访问协议-版本4允许用户访问和操纵远程服务器上的邮件和邮件夹。IMAP4改进了POP3的不足用户可以通过浏览信件头来决定是不是要下载此邮件还可以在服务器上创建或更改文件夹或邮箱删除邮件或检索邮件的特定部分。在POP3中邮件是被保存在服务器上的当用户阅读邮件时所有内容都会被立刻下载到用户的机器上。IMAP4服务器可以被看作是一个远程文件服务器而POP3服务器可以被看作是一个存储转发服务器。 SMTPSimple Mail Transfer Protocol简单邮件传送协议是发送电子邮件的协议。
4.1、IP
IP网络即在网络层采用IP的网中的每台主机都有唯一的IP地址IP地址用于标识网络中的每个主机。IP地址分为IPv4和IPv6。
1IPv4用32位的二进制序列来表示主机地址。为了便于在上层应用中方便地表示IP地址可以把32位的二进制序列分为4个单元每个单元占8位然后用十进制整数来表示每个单元这些十进制整数的取值范围是0255。如某一台主机的IP地址可为192.166.3.4。相对于IPv6IPv4是更早期出现的IP地址形式但现在仍然使用广泛。2IPv6用128位的二进制序列来表示主机地址大大扩充了可用地址的数目IPv6是新一代的互联网络IP地址标准。IPv6的128位地址通常分成8段每段为4个十六进制数。例如 以上地址比较长不易于阅读和书写。零压缩法可以用来缩减其长度。如果有一个段或几个连续段的值都是0那么这些0就可以简单地以“::”来表示。上述地址可写成 值得注意的是这种零压缩法只能用一次。例如上例中的“ABAA”后面的“0000”就不能再次简化。这种限制的目的是为了能准确还原被压缩的0不然就无法确定每个“::”代表多少个0。另外如果一个段中包含4个0那么可以用一个0来表示。以下3个IPv6地址是等价的 在IPv6地址中可以嵌入IPv4地址用IPv6和IPv4的混合体来表示。例如 在以上地址中“::FFFF”采用IPv6形式“192.168.89.9”采用IPv4形式。以上地址等价于以下的IPv6地址
1、IP地址的组成
下面以IPv4为例介绍IP地址的组成。IP地址由两部分组成IP网址和IP主机地址。IP网址表示网络的地址IP主机地址表示网络中的主机的地址。网络掩码用来确定IP地址中哪部分是网址哪部分是主机地址。
网络掩码的形式与IP地址相同但有一定的限制。在网络掩码的二进制序列中前面部分都为1后面部分都为0。假定IP地址192.166.3.4的网络掩码为255.255.255.0。这个网络掩码的二进制序列为11111111.11111111.11111111.00000000。把网络掩码与IP地址进行二进制与操作得到的结果就是IP网址。因此IP地址192.166.3.4的网址为192.166.3.0。如果把网络掩码设为255.255.0.0那么IP网址为192.166.0.0。
提示在Internet上每个主机都必须有全球范围内唯一的IP地址。国际机构NICInternet Network Information Center统一负责全球地址的规划和管理与此同时InterNIC、APNIC、RIPE和CNNIC等机构具体负责美国及全球其他地区的IP地址分配。中国地区的IP地址分配由CNNIC机构负责。
下图展示了两个互联的网络的配置从该图可以看出每个网络都有IP网址两个网络之间用路由器连接。
2、子网划分
一个公司可能拥有一个网址和多个主机。例如如果网址为192.166.0.0则可以有216即65536个主机加入网中。为了更好地管理网络提高网络性能和安全性可以把网络划分为多个子网。子网可包括某地理位置内如某大楼或相同局域网中的所有主机。例如对于网址为“192.166.0.0”的网络可从整个网络中分出3个子网这3个子网的网址分别为192.166.1.0192.166.2.0和192.166.3.0这些子网的掩码都为255.255.255.0。
3、发送数据包的过程
IP是面向包的协议即数据被分成若干小数据包然后分别传输它们。IP网络上的主机只能直接向本地网上的其他主机也就是具有相同IP网址的主机发送数据包。主机实际上有两个不同性质的地址物理地址和IP地址。物理地址是由主机上的网卡来标识的物理地址才是主机的真实地址。如下图所示主机A向同一个网络上的另一个主机B发包时会通过地址解析协议Address Resolution ProtocolARP获得对方的物理地址然后把包发给对方。ARP的运行机制为主机A在网络上广播一个ARP消息“要寻找地址为192.166.3.5的主机”接着具有这个IP地址的主机B就会做出响应把自身的物理地址告诉主机A。 当主机A向另一个网络上的主机B发送包时主机A利用ARP找到本地网络上的路由器的物理地址把包转发给它。路由器会按照如下步骤处理数据包
1如果数据包的生命周期已到则该数据包被抛弃。2搜索路由表优先搜索路由表中的主机如果能找到具有目标IP地址的主机则将数据包发送给该主机。3如果匹配主机失败则继续搜索路由表匹配同子网的路由器如果找到匹配的路由器则将数据包转发给该路由器。4如果匹配同子网的路由器失败则继续搜索路由表匹配同网络的路由器如果找到匹配的路由器则将数据包转发给该路由器。5如果以上匹配操作都失败就搜索默认路由如果默认路由存在则按照默认路由发送数据包否则丢弃数据包。
从以上路由器的处理步骤可以看出IP并不保证一定把数据包送达目标主机在发送过程中会因为数据包结束生命周期或者找不到路由而丢弃数据包。
4、域名
虽然IP地址能够唯一标识网络上的主机但IP地址是数字型的用户记忆数字型的IP地址很不方便于是人们又发明了另一种字符型的地址即所谓的域名Domain Name。域名地址具有易于理解的字面含义便于记忆。IP地址和域名一一对应。例如JavaThinker网站的域名为www.javathinker.net对应的IP地址为43.247.68.17。
域名是从右至左来表述其意义的最右边的部分为顶层域最左边的则是这台主机的机器名称。域名一般可表示为主机机器名.单位名.网络名.顶层域名。如mail.xyz.edu.cn这里的mail是xyz学校的一个主机的机器名xyz代表一个学校的名字edu代表中国教育科研网cn代表中国顶层域一般是网络机构或所在国家地区的名称缩写。
DNSDomain Name System协议采用DNS服务器提供把域名转换为IP地址的服务。DNS服务器分布在网络的各个地方它们存放了域名与IP地址的映射信息。用户需要访问网络上某个主机时只需提供主机直观的域名DNS协议首先请求地理位置比较近的DNS服务器进行域名到IP地址的转换如果在该服务器中不存在此域名信息那么DNS协议再让远方的DNS服务器提供服务。
5、URL统一资源定位器
URLUniform Resource Locator即统一资源定位器。它是专为标识网络上资源位置而设的一种编址方式大家熟悉的网页地址就属于URL。URL一般由3部分组成 应用层协议://主机IP地址或域名/资源所在路径/文件名
例如JavaThinker网站提供的JDK安装软件包的URL为 其中“http”指超文本传输协议“www.javathinker.net”是Web服务器的域名“software”是文件所在路径“jdk8.exe”才是相应的文件。
在URL中常见的应用层协议还包括ftp和file等比如 以上file协议用于访问本地计算机上的文件使用这种协议的URL以“file:///”开头。
4.2、TCP以及端口
IP在发送数据包的途中会遇到各种状况例如可能路由器突然崩溃使数据包丢失。再例如可能前面的数据包沿低速链路移动而后面的数据包沿高速链路移动而超过前面的包最后使得数据包的顺序混乱。
TCP使两台主机上的进程顺利通信不必担心数据包丢失或顺序混乱。TCP跟踪数据包顺序并且在数据包顺序混乱时按正确顺序对其进行重组。如果数据包丢失则TCP会请求源主机重新发送。
如下图所示两台主机上都会运行许多进程。当主机A上的进程A1向主机B上的进程B1发送数据时IP根据主机B的IP地址把进程A1发送的数据送达主机B。接下来TCP需要决定把数据发送到主机B中的哪个进程。TCP采用端口来区分进程。端口不是物理设备而是用于标识进程的逻辑地址更确切地说是用于标识TCP连接端点的逻辑地址。当两个进程进行一次通信时就意味着建立了一个TCP连接TCP连接的两个端点用端口来标识。在下图中进程A1与进程B1之间建立了一个TCP连接进程B1的端口为80因此进程B1的地址为主机B:80。进程A1的端口为1000因此进程A1的地址为主机A:1000。每个进程都有了唯一的地址TCP就能保证把数据顺利送达特定的进程。 提示在客户/服务器模型中客户进程可能会与服务器进程同时建立多个TCP连接在客户端每一个TCP连接都被分配一个端口。参见下图 端口号的范围为0到65535其中0到1023的端口号一般被固定分配给一些服务。比如21端口被分配给FTP服务25端口被分配给SMTP简单邮件传输服务80端口被分配给HTTP超级文本传输服务135端口被分配给RPC远程过程调用服务等等。
从1024到65535的端口号供用户自定义的服务使用。比如假定范例中的EchoServer服务使用8000端口。当EchoServer程序运行时就会占用8000端口当程序运行结束时就会释放所占用的端口。
客户进程的端口一般由所在主机的操作系统动态分配当客户进程要求与一个服务器进程进行TCP连接时操作系统会为客户进程随机地分配一个还未被占用的端口当客户进程与服务器进程断开连接时这个端口就被释放。
此外还要指出的是TCP和UDP都用端口来标识进程。在一个主机中TCP端口与UDP端口的取值范围是各自独立的允许存在取值相同的TCP端口与UDP端口。如下图所示在主机A中进程A1占用FTP端口1000进程A2占用UDP端口1000这是被允许的。
4.3、RFC简介
TCP/IP是以RFCRequest For Comment文档的形式发布的。RFC指描述互联网相关技术规范的文档。
RFC由个人编写这些人自愿编写某一新协议或规范的提议草案并提交给Internet工程任务组织The Internet Engineering Task ForceIETF。IETF负责审阅和发布这些被统称为RFC的文档每个文档都有一个RFC编号并且处于以下六种类型之一
标准协议Internet 的官方标准协议。标准协议草案正在被积极地考虑和审阅以便成为标准协议。标准协议提议将来可能变成标准协议。实验性协议为实验目的而设计的协议。实验性协议不投入实际运用。报告性协议由其他标准组织开发的协议。历史性协议已经过时的协议被其他协议代替。
在FRC的官方网站上已经发布了8000多份RFC文档。下表列出了与TCP/IP 协议相关的RFC文档编号。 在FRC的官方网站上输入网址http://www.ietf.org/rfc/rfcXXXX.txt就能查看相关的FRC文档这里的XXXX表示文档编号。
RFC文档一旦被正式发布其编号和内容就不允许改变。如果需要更新RFC文档则会对更新后的RFC文档赋予新的编号再将它发布。例如HTTP1.0协议对应的RFC文档编号为RFC1945它的升级版本HTTP1.1协议对应的RFC文档编号为RFC2068。
4.4、客户/服务器通信模式
TCP/UDP推动了客户/服务器通信模式的广泛运用。在通信的两个进程中一个进程为客户进程另一个进程为服务器进程。客户进程向服务器进程发出要求某种服务的请求服务器进程响应该请求。如下图所示通常一个服务器进程会同时为多个客户进程服务图中服务器进程B1同时为客户进程A1、A2和B2提供服务。以下伪代码演示了服务器进程的大致工作流程 服务器进程可以提供各种各样的服务例上面提到的EchoServer提供的服务为根据EchoClient发出的字符串XXX返回字符串“echo:XXX”。除了像EchoServer这样的由用户自定义的服务网络上还有许多众所周知的通用服务最典型的是HTTP服务。网络应用层的协议规定了客户程序与这些通用服务器程序的通信细节例如HTTP规定了HTTP客户程序发出的请求的格式还规定了HTTP服务器程序发回的响应的格式。
在现实生活中有些重要的服务机构的电话是固定的这有助于人们方便地记住电话和获得服务比如众所周知的电话110、120和119分别是报警、急救和火警电话。同样在网络上有些通用的服务有着固定的端口下表对常见的服务以及相应的协议和端口做了介绍。
5、用Java编写客户/服务器程序
Java网络程序都建立在TCP/IP基础上致力于实现应用层。传输层向应用层提供了套接字Socket接口Socket封装了下层的数据传输细节应用层的程序通过Socket来建立与远程主机的TCP连接以及进行数据传输。
站在应用层的角度两个进程之间的一次通信过程从建立TCP连接开始接着交换数据到断开连接结束。套接字可以被看作是通信线路两端的收发器进程通过套接字来收发数据如下图所示 在上图中如果把进程A1和程B1比作两个人那么图中的两个Socket就像两个人各自持有的电话机的话筒只要拨通了电话两个人就能通过各自的话筒进行通话。
在Java中有3种套接字类java.net.Socket、java.net.ServerSocket和DatagramSocket。其中Socket和ServerSocket类建立在TCP基础上DatagramSocket类建立在UDP基础上。Java网络程序都采用客户/服务通信模式。
5.1、 创建EchoServer
服务器程序通过一直监听端口来接收客户程序的连接请求。在服务器程序中需要先创建一个ServerSocket对象在构造方法中指定监听的端口 ServerSocket的构造方法负责在操作系统中把当前进程注册为服务器进程。服务器程序接下来调用ServerSocket对象的accept()方法该方法一直监听端口等待客户的连接请求如果接收到一个连接请求accept()方法就会返回一个Socket对象这个Socket对象与客户端的Socket对象形成了一条通信线路 Socket类提供了getInputStream()方法和getOutputStream()方法分别返回输入流InputStream对象和输出流OutputStream对象。程序只需向输出流写数据就能向对方发送数据只需从输入流读数据就能接收来自对方的数据。下图演示了服务器与客户利用ServerSocket和Socket来通信的过程。 与普通I/O流一样Socket的输入流和输出流也可以用过滤流来装饰。在以下代码中先获得输出流然后用PrintWriter装饰它PrintWriter的println()方法能够写一行数据以下代码接着获得输入流然后用BufferedReader装饰它BufferedReader的readLine()方法能够读入一行数据。 下面是EchoServer的源程序
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;/*** title EchoServer* description 测试* author: yangyongbing* date: 2023/12/5 10:04*/
public class EchoServer {private int port8080;private ServerSocket serverSocket;public EchoServer() throws IOException {serverSocket new ServerSocket(port);System.out.println(服务器启动);}public String echo(String msg){return echo:msg;}private PrintWriter getWriter(Socket socket) throws IOException {OutputStream socketOutputStream socket.getOutputStream();return new PrintWriter(socketOutputStream,true);}private BufferedReader getReader(Socket socket) throws IOException {InputStream socketInputStream socket.getInputStream();return new BufferedReader(new InputStreamReader(socketInputStream));}public void service(){while (true){Socket socketnull;try {// 等待客户端连接socketserverSocket.accept();System.out.println(New connection accepted socket.getInetAddress():socket.getPort());BufferedReader bufferedReader getReader(socket);PrintWriter printWriter getWriter(socket);String msgnull;while ((msgbufferedReader.readLine())!null){System.out.println(msg);printWriter.println(echo(msg));// 如果客户端发送的消息为bye则通信结束if(msg.equals(bye)){break;}}}catch (IOException e){e.printStackTrace();}finally {if(socket!null){// 断开连接try {socket.close();} catch (IOException e) {e.printStackTrace();}}}}}public static void main(String[] args) throws IOException {new EchoServer().service();}
}
EchoServer类最主要的方法为service()方法它不断等待客户的连接请求当serverSocket.accept()方法返回一个Socket对象就意味着与一个客户建立了连接。接下来从Socket对象中得到输出流和输入流并且分别用PrintWriter和BufferedReader来装饰它们。然后不断调用BufferedReader的readLine()方法读取客户发来的字符串XXX再调用PrintWriter的println()方法向客户返回字符串echo:XXX。当客户发来的字符串为“bye”时就会结束与客户的通信调用socket.close()方法断开连接。
5.2、创建EchoClient
在EchoClient程序中为了与EchoServer通信需要先创建一个Socket对象 在以上Socket的构造方法中参数host表示EchoServer进程所在的主机的名字参数port表示EchoServer进程监听的端口。当参数host的取值为“localhost”时表示EchoClient与EchoServer进程运行在同一个主机上。如果Socket对象被成功创建就表示建立了EchoClient与EchoServer之间的连接。接下来EchoClient从Socket对象中得到了输出流和输入流就能与EchoServer交换数据。
下面为EchoClient的源程序
import java.io.*;
import java.net.Socket;/*** title EchoClient* description 测试* author: yangyongbing* date: 2023/12/5 10:32*/
public class EchoClient {private String hostlocalhost;private Socket socket;private int port8080;public EchoClient() throws IOException {socket new Socket(host,port);}private PrintWriter getWriter(Socket socket) throws IOException {OutputStream socketOutputStream socket.getOutputStream();return new PrintWriter(socketOutputStream,true);}private BufferedReader getReader(Socket socket) throws IOException {InputStream socketInputStream socket.getInputStream();return new BufferedReader(new InputStreamReader(socketInputStream));}public void talk() throws IOException {try {BufferedReader bufferedReader getReader(socket);PrintWriter printWriter getWriter(socket);BufferedReader localReader new BufferedReader(new InputStreamReader(System.in));String msgnull;while ((msglocalReader.readLine())!null){printWriter.println(msg);System.out.println(bufferedReader.readLine());if(msg.equals(bye)){break;}}}catch (IOException e){e.printStackTrace();}finally {try {socket.close();}catch (IOException e){e.printStackTrace();}}}public static void main(String[] args) throws IOException {new EchoClient().talk();}
}
在EchoClient类中最主要的方法为talk()方法。该方法不断读取用户从控制台输入的字符串然后把它发送给EchoServer再把EchoServer返回的字符串打印到控制台。如果用户输入的字符串为“bye”就会结束与EchoServer的通信调用socket.close()方法断开连接。
在运行范例时需要打开两个命令行界面先在一个命令行界面中运行“java EchoServer”命令再在另一个命令行界面中运行“java EchoClient”命令。下图显示了运行这两个程序的命令行界面。在EchoClient控制台用户输入字符串“hi”程序就会输出“echo:hi”。
提示如果希望在一个命令行控制台中同时运行EchoServer和EchoClient程序那么可以先运行“start java EchoServer”命令再运行“java EchoClient”命令。“start java EchoServer”命令中“start”的作用是打开一个新的命令行控制台然后在该控制台中运行“java EchoServer”命令。
在EchoServer程序的service()方法中每当serverSocket.accept()方法返回一个Socket对象都表示建立了与一个客户的连接这个Socket对象中包含了客户的地址和端口信息只需调用Socket对象的getInetAddress()和getPort()方法就能分别获得这些信息 从上图可以看出EchoServer的控制台显示EchoClient的IP地址为127.0.0.1端口为9001。127.0.0.1是本地主机的IP地址表明EchoClient与EchoServer在同一个主机上。EchoClient作为客户程序它的端口是由操作系统随机产生的。每当客户程序创建一个Socket对象操作系统都会为客户分配一个端口。假定在客户程序中先后创建了两个Socket对象这就意味着客户与服务器之间同时建立了两个连接 操作系统为客户的每个连接分配一个唯一的端口如上图所示。
在客户进程中Socket对象包含了本地以及对方服务器进程的地址和端口信息在服务器进程中Socket对象也包含了本地以及对方客户进程的地址和端口信息Socket类的以下方法用于获取这些信息
getInetAddress()获得远程被连接进程的IP地址。getPort()获得远程被连接进程的端口。getLocalAddress()获得本地的IP地址。getLocalPort()获得本地的端口。
客户进程允许建立多个连接每个连接都有唯一的端口。在图上图中客户进程占用两个端口9001和10028。在编写网络程序时一般只需要显式地为服务器程序中的ServerSocket设置端口而不必考虑客户程序所用的端口。
5、总结
简单地理解计算机网络的任务就是传输数据。为了完成这一复杂的任务国际标准化组织ISO提供了OSI参考模型这种模型把互联网络分为七层分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。每个层有明确的分工并且在层与层之间下层为上层提供服务。这种分层的思想简化了网络系统的设计过程。例如在设计应用层时只需考虑如何创建满足用户实际需求的应用在设计传输层时只需考虑如何在两个主机之间传输数据在设计网络层时只需考虑如何在网络上找到一条发送数据的路径即路由。
由于OSI参考模型过于庞大和复杂使它难以投入实际运用中。与OSI参考模型相似的TCP/IP参考模型吸取了网络分层的思想但是对网络的层次做了简化并且在网络各层除主机-网络层外都提供了完善的协议这些协议构成了TCP/IP集简称TCP/IP。TCP/IP参考模型分为四层分别是应用层、传输层、网络互联层和主机-网络层。每一层都有相应的协议IP和TCP是协议集中最核心的两个协议。
IP位于网络互联层用IP地址来标识网络上的各个主机IP把数据分为若干数据包然后为这些数据包确定合适的路由。路由指把数据包从源主机发送到目标主机的路径。
建立在TCP/IP基础上的网络程序一般都采用客户/服务器通信模式。服务器程序提供服务客户程序请求获得服务。服务器程序一般昼夜运行时刻等待客户的请求并及时做出响应。
Java网络程序致力于实现应用层。传输层向应用层提供了套接字Socket接口Socket封装了下层的数据传输细节应用层的程序通过Socket来建立与远程主机的TCP连接以及进行数据传输。在Java中有3种套接字类java.net.Socket、java.net.ServerSocket和DatagramSocket。其中Socket和ServerSocket类建立在TCP基础上DatagramSocket类建立在UDP基础上。