C#网络编程穴习之socket - chunlieater/chunlifeet GitHub Wiki
sockte理解,socket就是一组接口封装类,把应用层的数据和网络层传输层的ip和tcp协议对接起来,一个计算机就相当于一个办公楼(地址ip),里面有很多窗口(端口prot),办公楼里的公司(程序)想和外面进行交流,就必需先申请一个窗口做为沟通的通道,至于申请多少个,要看他想做多少功能,一般来说一个功能对应一个窗口就行了,比如发送命令的功能申请一个端口,传输数据的功能再申请一个,一个端口对应一个socket(相当于电话),服务器会先申请好地址和端口号,并且设置一个socket作为监听器,当有其它程序(客户端)连接过来时,他就再设置一个端口和地址一致的分机(sockte),让这个分机负责和该程序进行数据传输,一般来说这个过程是异步的。
异步传输相当于是先有了一部电话(sockte)然后指定给一个员工(线程)去操作这个电话,而主机的操作员(主线程)就可以不用管这部电话怎么工作了。 在服务端一般都是这样设置,先申请一个监听电话(socket)然后公司负责人(sever主线程)指定一个接线员(子线程)去负责操作这个电话(socket),当有人呼入时(客户端连接服务器),这个接线员会再拿出一个分机(socket),并且指定另一个员工(子线程)负责这个分机的操作,而这个分机就是负责和客户(客户端)沟通的主要机器,当其它客户呼入时,接线员会再拿出一个分机,并指定下一个员工来为当前客户服务,这就形成了异步的并发机制。而这些电话(socket)的地址,都是同样的ip和端口。
客户端的地址叫源地址,端口叫源端口,服务端的地址叫宿地址,端口叫宿端口,一般来说源地址和宿地址是不会变化的(设成anyAdress),而变化的一般是端口,一般来说,一组源和一组宿就可以标识唯一的两个端点了。
地址和端口只是一个进出数据的通道,和socket本身并没有什么实质联系,只要一组成对儿的socket(服务端监听,客户端创建一个电话(socket)连接,服务端给连接的客户端匹配一个电话(socket),做完这个流程,两个电话(socket)就是一对儿匹配的端,就可以传输数据了。),相互知道对方的地址和端口,就可以进行数据传输,所以一组匹配的地址和端口,只能同时给一组匹配的socket使用,而另外的socket也想通过这个通道传数据是不行的,需要另外申请(不过这组地址和端口的其中一端,是可以被无限使用的,只要另一端不相同,他们就是新的通道了)。
一个socket只能有唯一的一个与其匹配的socket。