Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >经常打游戏、刷视频,却不了解它们底层的通信机制吗?来我给你聊清楚Python Socket通信原理

经常打游戏、刷视频,却不了解它们底层的通信机制吗?来我给你聊清楚Python Socket通信原理

作者头像
看、未来
发布于 2021-09-18 02:44:39
发布于 2021-09-18 02:44:39
82700
代码可运行
举报
运行总次数:0
代码可运行

文章目录

抱歉,我一直坚定选择的是后端,嘿嘿嘿。 就算是Python,我也要绕回后端来。

上图是socket网络编程的流程图


至于数据在网络中是怎么走的,咱先不说,那个太底层了,咱今天见就说如何将数据从咱的屏幕上放到网络流中去。 这可不是键盘敲敲,回车一按的事情,在这背后,那也是百转千回。


打开一个网络接口:套接字

Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。 Python 中,我们用 socket()函数来创建套接字,语法格式如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import socket	# 居然是个内置模块
socket.socket([family[, type[, proto]]])

参数释义:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
family: 套接字家族可以使 AF_UNIX(本地协议) 或者 AF_INET(产生IPV4)。
type: 套接字类型可以根据是面向连接的还是非连接分为 
	  SOCK_STREAM(这个协议是按照顺序的、可靠的、数据完整的基于字节流的连接。这是一个使用最多的socket类型,是用TCP协议来传输的。) 
	  或 SOCK_DGRAM(这个协议是无连接的,固定长度的连接调用。该协议是不可靠的,使用UDP来进行它的连接。)。
protocol: 一般不填默认为 0

返回值:返回一个通信套接字,为本机向网络通信的接口。


绑定IP与端口:bind

bind() 用来关联 socket 到指定的网络接口(IP 地址)和端口号:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
bind(hostname,port)

参数释义:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
hostname:主机IP
port:进行网络通信的端口

127.0.0.1 是标准的 IPv4 回环地址,只有主机上的进程可以连接到服务器,如果你传了空字符串,服务器将接受本机所有可用的 IPv4 地址。

端口号应该是 1-65535 之间的整数(0是保留的),这个整数就是用来接受客户端链接的 TCP 端口号,如果端口号小于 1024,有的操作系统会要求管理员权限。


监听网络来信:监听套接字

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
listen(backlog)	#开始 TCP 监听。

参数释义: backlog 指定在拒绝连接之前,操作系统可以挂起的最大连接数量。该值至少为 1,大部分应用程序设为 5 就可以,做并发的话可以设大一些,比方说20。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
函数listen用来初始化服务器可连接队列。
服务器处理客户端连接时是顺序处理的,同一时间只能处理一个客户端连接。
当多个客户端的连接请求同时到来的时候,服务器将不能处理的客户端连接请求放入到等待队列中,这个队列的长度由listen()函数来指定。
(这里面包括了还没握手的、一次握手的、两次握手的,只要还没握完,通通进去待着)

大多数系统的设置为20,其实真的没必要太多,真的。
根据系统的可承受负载和程序的需求来确定。
系统有一个最大侦听队列数,一般是128(somaxconn),可以调优。

接收网络来访者:允许连接

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
accept() #被动接受TCP客户端连接,(阻塞式)等待连接的到来

accept() 方法阻塞并等待传入连接。当一个客户端连接时,它将返回一个新的 socket 对象,对象中有表示当前连接的 conn 和一个由主机、端口号组成的 IPv4/v6 连接的元组。

我们将用这个 socket 对象和客户端进行通信。


客户端方面:申请连接

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
connect((HOST, PORT))

参数不用我再释义了吧。返回一个通信套接字。

主动初始化TCP服务器连接,。一般address的格式为元组(hostname,port),如果连接出错,返回socket.error错误。

connect_ex() connect()函数的扩展版本,出错时返回出错码,而不是抛出异常。


关闭通信套接字:close()

用于关闭对某一个套接字的函数。


公共用途的套接字函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
s.recv() 	# 接收 TCP 数据,数据以字符串形式返回,bufsize 指定要接收的最大数据量。flag 提供有关消息的其他信息,通常可以忽略。
s.send() 	# 发送 TCP 数据,将 string 中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于 string 的字节大小。
s.recvfrom() 	# 接收 UDP 数据,与 recv() 类似,但返回值是(data,address)。其中 data 是包含接收数据的字符串,address 是发送数据的套接字地址。
s.sendto() 	# 发送 UDP 数据,将数据发送到套接字,address 是形式为(ipaddr,port)的元组,指定远程地址。返回值是发送的字节数。

这里面函数要拿出来单讲都能写一篇。


服务端/客户端,放码过来

我先打个样儿,后来人可以直接拿去修改了自己用:

服务端

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import socket

# create a socket object
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

# get local machine name
host = socket.gethostname()                           

port = 8088

# bind to the port
serversocket.bind((host, port))                                  
print("Server start at port: 8088")
# queue up to 5 requests
serversocket.listen(5)                                           

while True:
    # establish a connection
    clientsocket,addr = serversocket.accept()      

    print("Got a connection from %s" % str(addr))

    msg='Thank you for connecting'+ "\r\n"
    clientsocket.send(msg.encode('utf-8'))
    clientsocket.close()

客户端

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import socket

# create a socket object
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# get local machine name
host = socket.gethostname()

port = 8088

# connection to hostname on the port.
s.connect((host, port))

# Receive no more than 1024 bytes
msg = s.recv(1024)

s.close()

print (msg.decode('ascii'))

结果输出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Server start at port: 8088
Got a connection from ('172.28.47.243', 9599)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Thank you for connecting

本文是处理单连接的,这是一种场景,不过更过的场景是处理多连接,大并发的。 后面会出啦,我先去调查一下Python是否支持epoll。

因为这篇主要是为我六月份的那个项目服务的,所以连接足够用啦。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/04/19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
GitHub Actions 自动部署 Hexo 脚本
网上虽然有很多通过 GitHub Actions 自动部署 Hexo 的教程,但都有各种各样的问题。 主要问题还是 Workflow 脚本没有写正确,比如插件部分。
eallion
2022/12/20
5790
GitHub Actions 自动部署 Hexo 脚本
Github Actions 自动部署 Hexo - wuuconix's blog
昨天尝试了Cloudflare的pages功能,它可以识别一个vue工程文件,然后自动build,最后自动部署给你一个域名来访问,智能地令人害怕。
wuuconix
2023/01/30
3630
Github Actions 自动部署 Hexo - wuuconix's blog
使用 GitHub Actions 实现博客自动化部署
如果大家以前是用过静态博客,比如 Hugo、Hexo,可能配置过自动部署,也就是提交代码到源文件分支,自动生成静态文件提交到静态分支。静态博客的部署都是基于文件,目标只是一个 Git 仓库,一切都比较自然。那么如果是喜欢折腾,使用了动态博客呢?这里就涉及到服务器远程登录了。下面介绍一下我使用的方法。
岂不美哉Frost
2023/10/19
4000
使用 GitHub Actions 实现博客自动化部署
Github Actions自动化部署 hexo博客
利用 GitHub Actions 实现博客自动发布,将静态博客页面部署到多个服务器上,比如 GitHub Pages、Gitee pages 、云服务器上。本文介绍使用 GitHub Actions 实现将 Hexo 博客自动编译并发布到 GitHub Pages 上。
leader755
2022/03/09
9590
Github Actions自动化部署 hexo博客
利用GitHub+Actions自动部署Hexo博客
早就听闻GitHub+Actions真相,于是今天便试了下,作为小康博客的第二个平台。至于为什么要自动部署,我在另一篇文章介绍过了。
Dreamy.TZK
2020/04/09
2K2
使用github Action自动化部署next项目
之前用过Github的Webhooks做过自动部署,原理就是自己服务器上启动一个服务,对外暴露一个接口,每次代码push到github时,github服务器会调用你的接口,收到请求后再执行代码部署。
biaoblog.cn 个人博客
2022/08/11
7830
使用github Action自动化部署next项目
使用 rsync-deploy-action 同步 Hexo 博客到个人服务器
前几天写了个基于 rsync 进行文件同步的 Action -> rsync-deploy-action。目的有三个:
Cloud-Cloudys
2021/01/21
9750
Github Actions Hexo 自动部署
最近重装了电脑,近几年内每次重装也好,装备新电脑也好,越来越觉得维护博客是令我比较头疼的事
imba久期
2022/12/16
4720
Github Actions Hexo 自动部署
GitHub 代码实时同步 gitee 和 coding
GitHub 作为全世界最大的代码集中地,在上面,我们可以随意地下载或者参与各种著名开源项目和开源开发框架。
章鱼猫先生
2021/12/13
2.5K0
GitHub 代码实时同步 gitee 和 coding
使用 GitHub Actions 实现博客自动化部署
如果大家以前是用过静态博客,比如 Hugo、Hexo,可能配置过自动部署,也就是提交代码到源文件分支,自动生成静态文件提交到静态分支。静态博客的部署都是基于文件,目标只是一个 Git 仓库,一切都比较自然。那么如果是喜欢折腾,使用了动态博客呢?这里就涉及到服务器远程登录了。下面介绍一下我使用的方法。
用户4792657
2022/07/06
7080
使用 GitHub Actions 实现博客自动化部署
提交即部署 - Github Action 自动化部署
文章目录 实现效果 环境 步骤 生成公私钥 Github 配置 服务器配置 代码配置 查看日志 参考资料 实现效果 每次在本地开发测试完成后,push 到 Github 后即自动完成部署。 提高效率,自动化节省手动部署的重复性工作。 环境 本地环境:Mac OS 服务器环境:Ubuntu Server 步骤 生成公私钥。 Github 配置。 服务器配置。 代码配置。 查看日志。 畅快享受提交即部署。 生成公私钥 本地环境执行生成公私钥的指令。 ssh-keygen -m PEM -t rsa -b 4
星辉
2021/12/06
8100
提交即部署 - Github Action 自动化部署
利用GitHub 的Actions自动同步gitee仓库,并Gitee Pages 自动部署项目
GitHub 的Actions会处理.github下的工作流文件夹workflows。 只要在g项目根目录下创建 .github/workflows/ ,在这个文件夹里再创建Sync.yml文件,填入以下代码。 当产生push操作就会自动同步gitee
鳄鱼儿
2024/05/21
1300
5 分钟搭建一个简洁优雅的静态博客
一开始我遇到这个问题,总觉得自己弄个博客,太麻烦了,也不一定坚持写下去,直接在平台上写得了。于是 CSDN、简书、知乎上开始写。
somenzz
2021/02/08
1.3K0
使用Github Action自动同步仓库到Gitee
作为程序员出生的你,肯定知道备份的重要性。再说现在大环境背景下,美国的政治关系还是比较混乱的,而对于存放在Github上面的项目,也不再是技术自由的国度啦。所以说我们的代码还是有必要进行“双”备份的,接下来就是介绍下,如何使用Github上面的Action功能,将Github上面的代码同步备份到国内的Gitee仓库站点。
凡梦星尘
2024/11/20
1970
使用Github Action自动同步仓库到Gitee
GitHub Actions 真香系列之自动同步镜像仓库
但也有一个问题,自动同步是个问题,Gitee 有提供一个同步按钮,但是需要人工去手动单击一次才能同步,很不方便。
沈唁
2020/12/25
2.9K0
使用Github Action自动化部署
如果有写过项目的经历,就免不了将代码上传到服务器上,安装依赖,然后输入启动命令的步骤。但是有的项目往往需要经常性的改动,如果还是照着上面的方式进行部署的话。先不说这样操作的效率,操作个几次就想罢工了。并且上面这样操作的往往容易误操作。而 Github Actions 正是该问题的良药。
愧怍
2022/12/27
1.8K0
使用Github Action自动化部署
Hexo博客利用GitHub Action自动化部署
CI\CD 即:持续集成(Continuous Integration)、持续交付(Continuous Delivery)、持续部署(Continuous Deployment)。GitHub Actions 是一个持续集成和持续交付 (CI/CD) 平台,可用于自动执行构建、测试和部署管道,换句话说就是通过 Actions 帮助我们去执行 hexo s & hexo g & hexo d 的操作并推到 xxx.github.io 仓库中
777nx
2023/05/02
9420
Hexo博客利用GitHub Action自动化部署
博客自动化部署
是啊,为什么要写 Blog?毕竟这里没有人支付稿酬,也看不出有任何明显的物质性收益。 不管你选择那种博客,这本身也是一个学习过程。 ——​ 阮一峰
leader755
2022/03/09
5230
博客自动化部署
一篇教你代码同步 Github 和 Gitee
用 VuePress 搭建了博客并部署到 Github Pages,但由于 Github 的访问问题,我们可以选择把仓库部署到 Gitee 一份,利用 Gitee 的 Pages 服务再生成一份静态网站用于备用。
程序狗
2021/12/27
1.4K0
【玩转腾讯云】Github Actions+CVM实践(CICD如此简单)
简言之:它是github推出的持续集成部署的工具,目前优秀的cicd工具包括:travis ci,jenkins
醉酒鞭名马
2020/04/15
2.6K3
【玩转腾讯云】Github Actions+CVM实践(CICD如此简单)
推荐阅读
相关推荐
GitHub Actions 自动部署 Hexo 脚本
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验