文档章节

Python 标准库 18.1 - socket

lionets
 lionets
发布于 2015/07/27 22:21
字数 753
阅读 214
收藏 3

socket 是一种常用的进程间通信接口。

socket object


Python 实现 socket 的主体对象是 socket.socket 类。两个互相连接的 socket 对象之间是对等的,因此他们的连接过程基本上是这样的:

  1. 乙方首先监听一个端口,并将自己的 ip 和 port 通过其他方式告知甲方
  2. 甲方向该 (ip, port) 发起连接请求
  3. 乙方接受此请求,连接建立成功,双方可以通信

用代码来解释就是这样:

乙:

import socket

sock = socket.socket()
sock.bind(('127.0.0.1', 2333))

sock.listen(1)
conn, addr = sock.accept()  # 这里可能会阻塞
data = conn.recv(1024)  # 同上

甲:

import socket

sock = socket.socket()
sock.connect(('127.0.0.1', 2333))
sock.send(b'hello')

其中乙方的 .bind 方法就是先声明并占用一个通信端口,这样甲方才知道第一次的连接请求应该发送到哪。然后乙方调用 .listen 方法开始监听,当甲方的 connect 请求发送过来后,调用 accept 方法即可接受甲方的连接请求,此方法返回一个新的 socket 对象(conn)和甲方的地址。

所以这里 type(conn) is type(sock) 是会返回 True 的,即当你调用一个已绑定的 socket 对象的 listen 方法时,他实际会调起一个服务器监听绑定的地址,并返回一个 新的 socket 对象用于通信,然后原 socket 对象继续监听,并在 accept 时继续创建新的 socket 对象。这里的甲乙 sock 对象是一种 C/S 模型。刚才说的对等模型其实是指 甲方的 sock 对象和乙方的 conn 对象。

因此这里的一个问题在于,乙方的 Server 在面对多个甲方的随机 connect 请求时,很可能没办法做到立即接受(.accept),而又不可能让甲方一直等待。所以 listen 方法提供了一个整型的 backlog 参数,在上例中其为 1. 这个参数表示在 accept 之前最多可以积压多少个 connect 请求。实际上说是积压,其实是直接返回了确认接受的信息。即,如果上面代码中乙方先不调用 accept,甲方也是可以 send 的,b'hello' 会被缓冲起来。乙方再调用 accept 和 recv 依然可以拿到数据。而因为上面设置的 backlog 是 1,所以如果在乙方 accept 之前又有一个 socket 向乙方发起 connect 请求,他就会立即收到一个显式的(积极的)拒绝连接响应。

send & recv


socket 因为是语言无关的接口,所以只能用它发送字节码(二进制)。所以你需要 encode/decode 一下你的字符串对象。而数据流(socket.SOCK_STREAM)又没有既定的边界。所以需要使用者自行管理边界问题。即甲方先后发送的两段数据,在乙方的缓冲中虽然有先后顺序,却没有间隔。

socketserver


socketserver 是 Python 标准库的一个包,功能如其名,是一个 socket 服务器开发框架。

© 著作权归作者所有

下一篇: 操作系统
lionets
粉丝 95
博文 102
码字总数 136040
作品 0
朝阳
程序员
私信 提问
python标准库00 学习准备

Python标准库----走马观花 python有一套很有用的标准库。标准库会随着python解释器一起安装在你的电脑上的.它是python的一个组成部分.这些标准库是python为你准备的利器,可以让编程事半功倍....

肖邦0526
2015/12/29
0
0
黑客们会用到哪些Python技术?

文 / Python全家桶 目录 1. 环境配置 2. 安装依赖包 3. 与网络交互 4. 二进制操作或编码 5. 漏洞开发工具 Python已经成为漏洞开发领域的行业标准,读者会发现大多数概念验证工具都是用Pytho...

程序员之家_
03/03
0
0
Python3基础之学习笔记(八)-socket网络编程-paramiko模块

1. socket网络编程 1.1 socket简介 Python 提供了两个级别访问的网络服务。: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的全部方...

GoldenKitten
01/15
0
0
深入了解Python与黑客的关系,另赠Python黑客视频教程!

网络爱好者总是要掌握编程语言的,这里推荐:python。下面,一文了解黑客们会用到哪些Python技术!尾部免费送教程! 1、为什么是python Python已经成为漏洞开发领域的行业标准,读者会发现大...

Python新世界
2018/07/27
0
0
156个Python网络爬虫资源,妈妈再也不用担心你找不到资源了

本列表包含Python网页抓取和数据处理相关的库。 前几天有私信小编要Python的学习资料,小编整理了一些有深度的Python教程和参考资料,从入门到高级的都有,文件已经打包好了,正在学习Pytho...

雁横
2018/05/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

mysql-connector-java升级到8.0后保存时间到数据库出现了时差

在一个新项目中用到了新版的mysql jdbc 驱动 <dependency>     <groupId>mysql</groupId>     <artifactId>mysql-connector-java</artifactId>     <version>8.0.18</version> ......

ValSong
今天
5
0
Spring Boot 如何部署到 Linux 中的服务

打包完成后的 Spring Boot 程序如何部署到 Linux 上的服务? 你可以参考官方的有关部署 Spring Boot 为 Linux 服务的文档。 文档链接如下: https://docs.ossez.com/spring-boot-docs/docs/r...

honeymoose
今天
6
0
Spring Boot 2 实战:使用 Spring Boot Admin 监控你的应用

1. 前言 生产上对 Web 应用 的监控是十分必要的。我们可以近乎实时来对应用的健康、性能等其他指标进行监控来及时应对一些突发情况。避免一些故障的发生。对于 Spring Boot 应用来说我们可以...

码农小胖哥
今天
9
0
ZetCode 教程翻译计划正式启动 | ApacheCN

原文:ZetCode 协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远。 ApacheCN 学习资源 贡献指南 本项目需要校对,欢迎大家提交 Pull Request。 ...

ApacheCN_飞龙
今天
5
0
CSS定位

CSS定位 relative相对定位 absolute绝对定位 fixed和sticky及zIndex relative相对定位 position特性:css position属性用于指定一个元素在文档中的定位方式。top、right、bottom、left属性则...

studywin
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部