《python核心编程第二版》读书笔记(一)——socket编程

来源:互联网 发布:免费数据库系统有哪些 编辑:程序博客网 时间:2024/06/03 08:17

面向连接
无论你使用哪一种地址家族。套接字的类型只有两种。一种是面向连接的套接字,即在通讯之前一定要建立一条连接,就像跟朋友打电话时那样。这种通讯方式也被称为“虚电路”或“流套接字”。面向连接的通讯方式提供了顺序的,可靠的,不会重复的数据传输,而且也不会被加上数据边界。这也意味着,每一个要发送的信息,可能会被拆分成多份,每一份都会不多不少地正确到达目的地。然后被重新按顺序拼装起来,传给正在等待的应用程序。实现这种连接的主要协议就是传输控制协议(即 TCP)。要创建 TCP 套接字就得在创建的时候,指定套接字类型为 SOCK_STREAM。TCP 套接字采用 SOCK_STREAM 这个名字,表达了它做为流套接字的特点。由于这些套接字使用 Internet 协议(IP)来查找网络中的主机,这样形成的整个系统,一般会由这两个协议(TCP 和 IP)来提及,即 TCP/IP。

 

无连接
与虚电路完全相反的是数据报型的无连接套接字。这意味着,无需建立连接就可以进行通讯。但这时,数据到达的顺序,可靠性及数据不重复性就无法保证了。数据报会保留数据边界,这就表示,数据不会像面向连接的协议那样被拆分成小块。使用数据报来传输数据就像邮政服务一样。邮件和包裹不一定会按它们发送的顺序到达。事实上,它们还有可能根本到不了!而且,由于网络的复杂性,数据还可能被重复传送。既然数据报有这么多缺点,为什么还要使用它呢?(一定有什么方面能胜过流套接字的!)由于面向连接套接字要提供一些保证,以及要维持虚电路连接,这都是很重的额外负担。数据报没有这些负担,所以它更“便宜”。通常能提供更好的性能,更适合某些应用场合。实现这种连接的主要协议就是用户数据报协议(即 UDP) 要创建 UDP 套接字就得在创建的时候,指定套接字类型为 SOCK_DGRAM。SOCK_DGRAM 这个名字,也许你已经猜到了,来自于单词“datagram”(“数据报”)。由于这些套接字使用 Internet 协议来查找网络中的主机,这样形成的整个系统,一般会由这两个协议(UDP 和 IP)来提及,即 UDP/IP。

 

创建一个 TCP 服务器
ss = socket()# 创建服务器套接字
ss.bind()# 把地址绑定到套接字上
ss.listen()# 监听连接.函数的参数只是表示最多允许多少个连接同时连进来,后来的连接就会被拒绝掉。
inf_loop:# 服务器无限循环
cs = ss.accept()# 接受客户的连接
comm_loop:# 通讯循环
cs.recv()/cs.send() # 对话(接收与发送)
cs.close()# 关闭客户套接字
ss.close()# 关闭服务器套接字(可选)
一个简单的(单线程的)服务器会调用 accept()函数等待连接的到来。默认情况下,accept()函数是阻塞式的,即程序在连接到来之前会处于挂起状态。套接字也支持非阻塞模式。
一旦接收到一个连接,accept()函数就会返回一个单独的客户的套接字用于后续的通讯。
在服务器要退出的时候,要记得调用 close()函数。

 

创建 TCP 客户端
cs = socket()# 创建客户套接字
cs.connect()# 尝试连接服务器
comm_loop:# 通讯循环
cs.send()/cs.recv()# 对话(发送/接收)
cs.close()# 关闭客户套接字

原创粉丝点击