APP开发实战23-通信过程

6.5.5通信过程

主机A的应用程序要能和主机B的应用程序通信,必须通过Socket建立连接,而建立Socket连接必须需要底层TCP/IP协议来建立TCP连接。建立TCP连接需要底层IP协议来寻址网络中的主机。我们知道网络层使用的IP协议可以帮助我们根据IP地址来找到目标主机,但是一台主机上可能运行着多个应用程序,如何才能与指定的应用程序通信就要通过TCP或UPD的地址也就是端口号来指定。这样就可以通过一个Socket实例唯一代表一个主机上的一个应用程序的通信链路了。

当客户端要与服务端通信,客户端首先要创建一个Socket实例,操作系统将为这个Socket实例分配一个没有被使用的本地端口号,并创建一个包含本地和远程地址和端口号的套接字数据结构,这个数据结构将一直保存在系统中直到这个连接关闭。在创建Socket实例的构造函数正确返回之前,将要进行TCP的三次握手协议,TCP握手协议完成后,Socket实例对象将创建完成,否则将抛出IOException错误。

与之对应的服务端将创建一个ServerSocket实例,ServerSocket创建比较简单只要指定的端口号没有被占用,一般实例创建都会成功,同时操作系统也会为ServerSocket实例创建一个底层数据结构,这个数据结构中包含指定监听的端口号和包含监听地址的通配符,通常情况下都是“*”即监听所有地址。之后当调用accept()方法时,将进入阻塞状态,等待客户端的请求。当一个新的请求到来时,将为这个连接创建一个新的套接字数据结构,该套接字数据的信息包含的地址和端口信息正是请求源地址和端口。

这个新创建的数据结构将会关联到ServerSocket实例的一个未完成的连接数据结构列表中,注意这时服务端与之对应的Socket实例并没有完成创建,而要等到与客户端的三次握手完成后,这个服务端的Socket实例才会返回,并将这个Socket实例对应的数据结构从未完成列表中移到已完成列表中。所以ServerSocket所关联的列表中每个数据结构,都代表与一个客户端的建立的TCP连接。

推荐阅读更多精彩内容

  • TCP/IPTCP/IP是个协议组,可分为三个层次:网络层、传输层和应用层。在网络层有IP协议、ICMP协议、AR...
    燕京麒麟阅读 1,216评论 1 7
  • 参考:http://www.2cto.com/net/201611/569006.html TCP HTTP UD...
    F麦子阅读 2,532评论 0 14
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 128,990评论 18 137
  • iPhone的标准推荐是CFNetwork 库编程,其封装好的开源库是 cocoa AsyncSocket库,用它...
    Ethan_Struggle阅读 1,694评论 2 12
  • 今天正值一年一次的2月14日,也就是现在的青年男女们有喜有悲的情人节,但是谈起2月14情人节的起源,可能就不...
    4551ff0ad16f阅读 756评论 0 1
  • 时光走得快,平素都未见面,以为日常隔着三两面,总有情分在。可薄情凉透光阴似箭,三年五载恍惚而过。曾经视为生命中最重...
    桉莲阅读 188评论 0 0