Python Socket 编程概览

简评:socket 和 socket API 用于通过网络发送消息,它们提供了一种进程间通信(IPC)方式。网络可以是计算机的逻辑本地网络,也可以是物理连接到外部网络的网络,显而易见的例子是因特网(即 Internet, 可以通过 ISP 连接)。

背景:

Socket 历史悠久,其使用开始于 1971 年的 ARPANET,后来成为 1983 年发布的 Berkeley Software Distribution(BSD)操作系统中的 API,称为 Berkeley Socket

当互联网在 20 世纪 90 年代随万维网腾飞时,网络编程也是如此,Web服务器和浏览器并不是利用新连接的网络和使用 socket 的唯一应用程序,各种类型和规模的客户端 - 服务器应用程序也都得到了广泛的使用。

现在虽然 socket API 使用的底层协议已经发展多年,而且我们也已经看到了新协议,但是底层 API 仍然保持不变。最常见的 socket 应用类型是客户端 - 服务器应用程序,其中一方充当服务器并等待来自客户端的连接。

Socket API 概述

Python 的 socket 模块提供了 Berkeley socket API 的接口,这是我们后续使用和讨论的模块。

此模块中的主要 socket API 函数和方法有:

  • socket()
  • bind()
  • listen()
  • accept()
  • connect()
  • connect_ex()
  • send()
  • recv()
  • close()

Python 提供了一个方便且一致的 API,可以直接映射到这些系统调用。另外,作为标准库的一部分,Python 还提供了使这些底层 socket 函数更容易使用的类。虽然本文未涉及,但请参阅socketserver 模块(网络服务器的框架)。还有许多模块可用于实现 HTTP 和 SMTP 等更高级别的 Internet 协议。

TCP Sockets

很快将看到,我们使用 socket.socket()创建一个socket 对象,并将 socket 类型指定为socket.SOCK_STREAM,执行此操作时,使用的默认协议是传输控制协议(即 TCP)。

为什么是 TCP?

  • 可靠:发送方检测并重新发送网络中丢弃的数据包。
  • 有序的数据传递:应用程序按发送方编写的顺序读取数据。

相反,使用 socket.SOCK_DGRAM 创建的用户数据报协议(即 UDP)socket 是不可靠的,接收方读取的数据的顺序可能与发送方的写入顺序不同。

其重要性在于网络是尽力而为的交付系统,我们无法保证数据能够到达目的地,或者收到已发送的数据。

网络设备(例如,路由器和交换机)具有可用的有限带宽以及它们自身固有的系统限制,就像我们的客户端和服务器一样它们有 CPU、内存、总线和接口数据包缓冲区,使用 TCP 则不必担心数据包丢失,数据无序到达以及在通过网络进行通信时会发生的许多其他问题。

在下图中,让我们看一下 TCP 的 socket API 调用和数据流的顺序:

TCP Socket Flow

左侧表示服务端,右侧表示客户端。

从左上角的列开始,注意服务器设置的 API 调用以设置「监听」socket:

  • socket()
  • bind()
  • listen()
  • accept()

listening socket 它监听来自客户端的连接,当客户端连接时,服务器调用accept()来接受或完成连接。

客户端调用connect()建立与服务器的连接并启动三次握手,握手步骤很重要,因为它确保连接的每一侧都可以在网络中访问,换句话说,客户端可以访问服务端,反之亦然。

中间是往返部分,使用send()recv()在客户端和服务器之间交换数据。

在底部,客户端和服务端关闭各自的 socket。


原文链接:Socket Programming in Python (Guide) – Real Python
推荐阅读:这些是 Python 官方推荐的最好书籍

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容

  • 计算机网络概述 网络编程的实质就是两个(或多个)设备(例如计算机)之间的数据传输。 按照计算机网络的定义,通过一定...
    蛋炒饭_By阅读 1,175评论 0 10
  • 网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编...
    程序员欧阳阅读 1,969评论 1 37
  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 31,789评论 2 89
  • 我可能交了个假男朋友,年三十的晚上,发个166的红包就不见踪影了。。。。
    伊丽傻白的腿毛阅读 189评论 0 0
  • 01 李思思是我们公认的学霸,高考她以高出录取线三十多分的成绩考到我们学校,并且选了全校最好的专业——财务管理。 ...
    简小抒阅读 1,119评论 26 15