Python socket通信原理是什么?如何理解?
Admin 2021-10-22 群英技术资讯 414 次浏览
本文给大家分享一个Python基础知识,也就是socket通信原理,一些朋友可能对于socket通信原理不会很理解,因此本文有很详细的介绍,需要的朋友不妨了解看看,那么接下来就跟随小编一起学习一下吧。
上图是socket网络编程的流程图
至于数据在网络中是怎么走的,咱先不说,那个太底层了,咱今天见就说如何将数据从咱的屏幕上放到网络流中去。
这可不是键盘敲敲,回车一按的事情,在这背后,那也是百转千回。
Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。
Python 中,我们用 socket()函数来创建套接字,语法格式如下:
import socket # 居然是个内置模块 socket.socket([family[, type[, proto]]])
参数释义:
family: 套接字家族可以使 AF_UNIX(本地协议) 或者 AF_INET(产生IPV4)。 type: 套接字类型可以根据是面向连接的还是非连接分为 SOCK_STREAM(这个协议是按照顺序的、可靠的、数据完整的基于字节流的连接。这是一个使用最多的socket类型,是用TCP协议来传输的。) 或 SOCK_DGRAM(这个协议是无连接的,固定长度的连接调用。该协议是不可靠的,使用UDP来进行它的连接。)。 protocol: 一般不填默认为 0。
返回值:返回一个通信套接字,为本机向网络通信的接口。
bind() 用来关联 socket 到指定的网络接口(IP 地址)和端口号:
bind(hostname,port)
参数释义:
hostname:主机IP port:进行网络通信的端口
127.0.0.1 是标准的 IPv4 回环地址,只有主机上的进程可以连接到服务器,如果你传了空字符串,服务器将接受本机所有可用的 IPv4 地址。
端口号应该是 1-65535 之间的整数(0是保留的),这个整数就是用来接受客户端链接的 TCP 端口号,如果端口号小于 1024,有的操作系统会要求管理员权限。
listen(backlog) #开始 TCP 监听。
参数释义:
backlog 指定在拒绝连接之前,操作系统可以挂起的最大连接数量。该值至少为 1,大部分应用程序设为 5 就可以,做并发的话可以设大一些,比方说20。
函数listen用来初始化服务器可连接队列。 服务器处理客户端连接时是顺序处理的,同一时间只能处理一个客户端连接。 当多个客户端的连接请求同时到来的时候,服务器将不能处理的客户端连接请求放入到等待队列中,这个队列的长度由listen()函数来指定。 (这里面包括了还没握手的、一次握手的、两次握手的,只要还没握完,通通进去待着) 大多数系统的设置为20,其实真的没必要太多,真的。 根据系统的可承受负载和程序的需求来确定。 系统有一个最大侦听队列数,一般是128(somaxconn),可以调优。
accept() #被动接受TCP客户端连接,(阻塞式)等待连接的到来
accept() 方法阻塞并等待传入连接。当一个客户端连接时,它将返回一个新的 socket 对象,对象中有表示当前连接的 conn 和一个由主机、端口号组成的 IPv4/v6 连接的元组。
我们将用这个 socket 对象和客户端进行通信。
connect((HOST, PORT))
参数不用我再释义了吧。返回一个通信套接字。
主动初始化TCP服务器连接,。一般address的格式为元组(hostname,port),如果连接出错,返回socket.error错误。
connect_ex() connect()函数的扩展版本,出错时返回出错码,而不是抛出异常。
用于关闭对某一个套接字的函数。
s.recv() # 接收 TCP 数据,数据以字符串形式返回,bufsize 指定要接收的最大数据量。flag 提供有关消息的其他信息,通常可以忽略。 s.send() # 发送 TCP 数据,将 string 中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于 string 的字节大小。 s.recvfrom() # 接收 UDP 数据,与 recv() 类似,但返回值是(data,address)。其中 data 是包含接收数据的字符串,address 是发送数据的套接字地址。 s.sendto() # 发送 UDP 数据,将数据发送到套接字,address 是形式为(ipaddr,port)的元组,指定远程地址。返回值是发送的字节数。
这里面函数要拿出来单讲都能写一篇。
我先打个样儿,后来人可以直接拿去修改了自己用:
服务端
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()
客户端
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'))
Server start at port: 8088 Got a connection from ('172.28.47.243', 9599)
Thank you for connecting
本文是处理单连接的,这是一种场景,不过更过的场景是处理多连接,大并发的。
后面会出啦,我先去调查一下Python是否支持epoll。
因为这篇主要是为我六月份的那个项目服务的,所以连接足够用啦。
以上就是关于Python socket通信原理的相关介绍啦,上述示例有一定的参考价值,希望大家阅读完这篇文章能有所收获。最后,想要了解更多可以继续浏览群英网络其他相关的文章。
文本转载自脚本之家
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
Requests是一常用的http请求库,它使用python语言编写,可以方便地发送http请求,以及方便地处理响应结果,下面这篇文章主要给大家介绍了关于python中Requests请求的安装与常见用法的相关资料,需要的朋友可以参考下
这篇文章主要为大家介绍了Python密码学ROT13算法的教程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
ord() 函数是 chr() 函数(对于 8 位的 ASCII 字符串)的配对函数,它以一个字符串(Unicode 字符)作为参数,返回对应的 ASCII 数值,或者 Unicode 数值,这篇文章主要介绍了python 中内置函数ord()返回字符串的ASCII数值,需要的朋友可以参考下
这篇文章主要介绍了python中进程间通信及设置状态量控制另一个进程,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
目录pack常用属性pack类提供了下列函数(使用组件实例对象调用)grid属性设置grid类提供了下列函数(使用组件实例对象调用)place属性设置place类提供了下列函数(使用组件实例对象调
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008