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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
计算机专业术语-socket
根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。 (1)服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。 (2)客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。 (3)连接确认:是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。
咻一咻
2020/05/29
1.2K0
python socket编程详细介绍
   第二个是 SocketServer, 它提供了服务器中心类,可以简化网络服务器的开发。
py3study
2020/01/08
8820
Python网络编程之Socket通信简单实现(文末赠书)
Socket是一个TCP/IP网络通讯的抽象层,提供一系列的数据交互操作接口,这样开发者可以不再关注于具体的协议处理细节,从而快速的让自己的程序实现网络数据交互。
吾非同
2021/09/24
4.9K0
【网络编程系列】二:socket通信原理及实践
我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得靠socket?那什么是socket?socket的类型有哪些?还有socket的基本函数,这些都是本文想介绍的。本文的主要内容如下: 1、网络中进程之间如何通信? 2、Socket是什么? 3、socket的基本操作 3.1、socket()函数 3.2、bind()函数 3.3、l
老白
2018/03/19
1.7K0
【网络编程系列】二:socket通信原理及实践
Socket 通信原理
什么是Socket? Socket的中文翻译过来就是“套接字”。套接字是什么,我们先来看看它的英文含义:插座。 Socket就像一个电话插座,负责连通两端的电话,进行点对点通信,让电话可以进行通信,端口就像插座上的孔,端口不能同时被其他进程占用。而我们建立连接就像把插头插在这个插座上,创建一个Socket实例开始监听后,这个电话插座就时刻监听着消息的传入,谁拨通我这个“IP地址和端口”,我就接通谁。 实际上,Socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口,供
wangxl
2018/03/29
7K0
Socket 通信原理
《吐血整理》高级系列教程-吃透Fiddler抓包教程(33)-Fiddler如何抓取WebSocket数据包
本来打算再写一篇这个系列的文章也要和小伙伴或者童鞋们说再见了,可是有人留言问WebSocket包和小程序的包不会抓,那就关于这两个知识点宏哥就再水两篇文章。
北京-宏哥
2022/11/18
4.9K0
《吐血整理》高级系列教程-吃透Fiddler抓包教程(33)-Fiddler如何抓取WebSocket数据包
Python学习 :socket基础
  - socket为接口通道,内部封装了IP地址、端口、协议等信息;我们可以看作是以前的通过电话机拨号上网的年代,socket即为电话线
py3study
2020/01/17
1K0
socket编程【2】TCP编程
大多数连接都是可靠的TCP连接。创建TCP连接时,主动发起连接的叫客户端,被动响应连接的叫服务器。 下面是一个客户端的例子:
用户2936342
2018/08/27
7300
python socket编程
socket的英文原义是“孔”或“插座”。作为BSD UNIX的进程通信机制,取后一种意思。通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。
py3study
2020/01/13
8140
一文带你了解Python Socket 编程
Socket又称为套接字,它是所有网络通信的基础。网络通信其实就是进程间的通信,Socket主要是使用IP地址,协议,端口号来标识一个进程。端口号的范围为0~65535(用户端口号一般大于1024),协议有很多种,一般我们经常用到的就是TCP,IP,UDP。下面我们来详细了解下Socket吧。
前端皮皮
2022/08/17
4490
一文带你了解Python Socket 编程
python之socket初识
本篇文章主要讲的是socket基本操作。包括网络通信三要素、TCP三次握手以及socket通信流程等。希望感兴趣的小伙伴可以坚持看下去同时欢迎提出宝贵的意见让我们一起进步!
IT苦逼一枚
2020/05/13
4330
Python-socket总结
什么是socket所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。
py3study
2020/01/06
7660
python的socket编程
转自http://www.oschina.net/question/12_76126
py3study
2020/01/10
8340
python socket
TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。所以在进行TCP链接时首先要开启服务器端口。
py3study
2020/01/19
5630
python中socket的tcp学习(2)
服务器进程首先要绑定一个端口并监听来自其他客户端的连接。如果某个客户端连接过来了,服务器就与该客户端建立Socket连接,随后的通信就靠这个Socket连接了。
萌海无涯
2019/08/02
6360
SOCKET网络编程 (通俗易懂入门篇)
struct sockaddr :很多网络编程函数的出现早于IPV4协议,为了向前兼容,现在sockaddr都退化成(void *)结构了。 传递一个地址给函数,然后由函数内部再强制类型转换为所需的地址类型。
看、未来
2020/08/25
1.1K0
SOCKET网络编程 (通俗易懂入门篇)
Python3 网络编程
Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。
AlexZhang
2021/12/02
9270
socket实现TCP/IP通信
在互联网通信中,计算机之间的通信需要依赖互联网通信协议,常见的网络通信协议有TCP/IP协议、IPX/SPX协议、NetBEUI协议等。TCP/IP就是其中一个网络通信协议,而我们今天要利用的socket就是依赖TCP/IP完成通信的。
SimpleAstronaut
2022/08/09
2.2K0
socket通信(C#)
4:接受到客户端的连接,用socket对像的Accept()方法创建新的socket对像用于和请求的客户端进行通信;
红目香薰
2022/11/29
9530
socket通信(C#)
Socket通信原理
对TCP/IP、UDP、Socket编程这些词你不会很陌生吧?随着网络技术的发展,这些词充斥着我们的耳朵。那么我想问:1.什么是TCP/IP、UDP?2.Socket在哪里呢?3.Socket是
Java架构师必看
2021/12/08
9200
Socket通信原理
相关推荐
计算机专业术语-socket
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验