Socket Programming in Python(Guide)

Sockets 和 socket API被用于在网络上发送消息。它们提供了进程间通信(IPC)的一种形式。而网络既可以是连接到计算机的本地网络,也可以是计算机被连接到外部的真实网络(比如Internet网)

本文用三种不同的迭代版本 实现socket服务端和客户端:

  1. 我们将以一个简单的socket服务端和客户端的例子,来开始本文。
  2. 一旦在第一个例子中,你已经了解了soket API 以及它的运作过程,我们将实现一个对第一个例子进行改进,让它可以同时处理多个连接
  3. 最终,我们将以一个例子展示 服务端和客户端 应有的完备的功能。

读完本文,你将了解如何使用Python socket module 中重要的函数和方法来实现client-server应用程序。同时向你展示了在endpoints端点之间如何使用自定义的类来发送消息和数据,你可以在endpoints端点之上构建并使用你的应用程序。

本文中的例子使用了Python3.6(source code on GitHub)。

网络和socket是个庞大的主题。当然,有很多关于它们的文章。如果你刚接触socket和网络,你会对其中大量的知识点和术语感到不知所措,这很正常。

不过,不要灰心。我已经为你写了这篇文章。就像我们学习Python一样,我们可以每次学一点知识。你可以收藏本文,当你知识储备足够时,再回过头来学习本文的下一章节。
好了,让我们开始吧。

Background

Sockets有着悠久的历史。Sockets的使用最早出现在1971年的ARPNET中,之后在1983年发布的BSD 操作系统中成为了一个API,此时被称为Berkeley sockets

当Internet随着万维网World Wide Web在1990年代的突然成功,网络编程也开始了腾飞。Web服务器和浏览器不是唯一的利用新建Internet网络和sockets的应用程序。Client-server 应用程序以不同的类型和规模被广泛的使用。

今天,虽然socket API使用的协议 随着时间已经演变和进化,我们也看到了一些新的socket API,但是底层的API仍旧没有变化。

最常用的socket应用程序client-server应用程序,也就是一端作为server 并等待client的连接。也就是我们在本文要讲的 应用程序类型。更具体地,我们将了解 Internet socketssocket API,有时会被称作BSD sockets或者Berkeley sockets。当然也会涉及到Unix domain socketsUnix domain sockets只能用来在同一台主机上进行进程间的通信。

Socket API Overview

Python’s socket module提供了使用Berkeley sockets API的接口。在本文中,我们将使用和讨论该module。

该module中主要的socket API函数有:

  • socket()
  • bind()
  • listen()
  • accept()
  • connect()
  • connect_ex()
  • send()
  • recv()
  • close()
    Python提供了方便并且前后一致的API,这些API直接映射到 系统调用,这些系统调用采用c实现。我们将在下一节 了解这些API是如何结合起来使用的。
    As part of its standard library, Python also has classes that make using these low-level socket functions easier. Although it’s not covered in this tutorial, see the socketserver module, a framework for network servers. There are also many modules available that implement higher-level Internet protocols like HTTP and SMTP. For an overview, see Internet Protocols and Support.
    作为标准库的一部分,Python也定义了一些类,来方便我们使用这些底层的socket function。虽然,本文不涉及这部分内容,但是可以查看 socketserver module文档,为network server实现的框架。Python中也有许多module实现了上层的Internet protocols,比如HTTP,SMTP。想对这些modules作个了解的话,可以查看Internet Protocols and Support文档。

TCP Sockets

很快你就很看到,我们将使用socket.socket()创建一个socket object,并使用socket.SOCK_STREAM指定socket type。当你这样做的时候,默认使用的协议是 Transmission Control Protocol (TCP)

为什么你应该使用TCP?The Transmission Control Protocol (TCP):

  • 可靠: 在网络中被丢弃的包会被检测到,并且 发送者会再次发包
  • 数据 按顺序传输: 你应用读到的数据 和 发送者发送的顺序 是一致的

作为对比,使用socket.SOCK_DGRAM创建的User Datagram Protocol (UDP) socket 是不可靠的,接受者读取的数据顺序 可能 和发送者写数据的顺序 不一致。

为什么TCP很重要呢?网络是一个尽最大努力进行传输的系统。网络并不能保证:1)你的数据会到达目的地 2)你将会接收到传送给你的数据

网络设备(比如,路由器,交换机)的可利用带宽是有限的,并且有着固有的系统限制(就行我们的clients和servers一样,有着CPUs,内存,总线,packet buffers等)。不使用TCP的话,你就不得不担心丢包packet loss数据包到达顺序紊乱,还有在你通过网络进行通信时总是会发生的一些事情。

在下表中,TCPsocket API的调用顺序 和 数据的流动:

sockets-tcp-flow.jpg

左侧一栏代表server,右侧代表client

从左侧一栏的上面开始,注意server调用API calls来设置一个监听socket

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

一个listenning socket所做的事情,就像它的名字那样。它监听 来自client的连接。当client尝试连接时,server 调用accept()来建立连接。

client 调用connect()来建立 一个到server的连接,并 初始化 三次握手。握手的步骤是很重要的,因为握手确保了 连接的两端 在网络中 是可以访问到的,换句话说:client 可以访问到serverserver也可以访问到client。有可能出现的情况是,只有一个主机(client or server)可以访问到另一端。

在上图的中间是 往返的部分,数据在clientserver之间进行交换,使用send()recv()这两个函数。

At the bottom, the client and server close() their respective sockets.
在上图的底部,clientserverclose()它们各自的sockets

原文太长了,下回再译。
to be continued...

本文翻译自https://realpython.com/python-sockets/,转载请注明出处。

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

推荐阅读更多精彩内容

  • 说明 本文 翻译自 realpython 网站上的文章教程 Socket Programming in Pytho...
    keelii阅读 2,083评论 0 16
  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 5,688评论 0 10
  • 大纲 一.Socket简介 二.BSD Socket编程准备 1.地址 2.端口 3.网络字节序 4.半相关与全相...
    VD2012阅读 2,224评论 0 5
  • 网络编程 一.楔子 你现在已经学会了写python代码,假如你写了两个python文件a.py和b.py,分别去运...
    go以恒阅读 1,951评论 0 6
  • Python socket编程 引言 sockets的历史悠久,它们最早在 1971 年的 APPANET 中使用...
    MetaT1an阅读 604评论 0 0