Python基础之Socket通信原理


Posted in Python onApril 22, 2021

Python基础之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。

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

绑定IP与端口:bind

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()函数的扩展版本,出错时返回出错码,而不是抛出异常。

关闭通信套接字:close()

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

公共用途的套接字函数

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通信原理的文章就介绍到这了,更多相关python通信原理内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python实现爬虫下载漫画示例
Feb 16 Python
python实现的生成随机迷宫算法核心代码分享(含游戏完整代码)
Jul 11 Python
Java多线程编程中ThreadLocal类的用法及深入
Jun 21 Python
全面了解Nginx, WSGI, Flask之间的关系
Jan 09 Python
Python自定义一个类实现字典dict功能的方法
Jan 19 Python
python学习--使用QQ邮箱发送邮件代码实例
Apr 16 Python
浅析Python3中的对象垃圾收集机制
Jun 06 Python
OpenCV哈里斯(Harris)角点检测的实现
Jan 15 Python
Python中url标签使用知识点总结
Jan 16 Python
解决keras使用cov1D函数的输入问题
Jun 29 Python
使用bandit对目标python代码进行安全函数扫描的案例分析
Jan 27 Python
Python docx库删除复制paragraph及行高设置图片插入示例
Jul 23 Python
python numpy中setdiff1d的用法说明
Apr 22 #Python
一行代码python实现文件共享服务器
Apr 22 #Python
python数据分析之用sklearn预测糖尿病
python文件名批量重命名脚本实例代码
python爬虫之爬取笔趣阁小说
python获取淘宝服务器时间的代码示例
Apr 22 #Python
详解Django中 render() 函数的使用方法
You might like
Codeigniter整合Tank Auth权限类库详解
2014/06/12 PHP
PHP扩展类型及安装方式解析
2020/04/27 PHP
一些常用且实用的原生JavaScript函数
2010/09/08 Javascript
Jquery EasyUI中弹出确认对话框以及加载效果示例代码
2014/02/13 Javascript
javascript实现在某个元素上阻止鼠标右键事件的方法和实例
2014/08/12 Javascript
图解JavaScript中的this关键字
2020/05/28 Javascript
JS去除字符串中空格的方法
2017/02/14 Javascript
JavaScript-定时器0~9抽奖系统详解(代码)
2017/08/16 Javascript
前端把html表格生成为excel表格的实例
2017/09/19 Javascript
jQuery EasyUI window窗口使用实例代码
2017/12/25 jQuery
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【圆形情况】
2018/12/13 Javascript
AngularJS实现的自定义过滤器简单示例
2019/02/02 Javascript
Vue源码解析之数据响应系统的使用
2019/04/24 Javascript
Vue实现导航栏点击当前标签变色功能
2020/08/19 Javascript
Vue 实现把表单form数据 转化成json格式的数据
2019/10/29 Javascript
nodeJs的安装与npm全局环境变量的配置详解
2020/01/06 NodeJs
Node.js操作MongoDB数据库实例分析
2020/01/19 Javascript
Vue3不支持Filters过滤器的问题
2020/09/24 Javascript
vue-drawer-layout实现手势滑出菜单栏
2020/11/19 Vue.js
一篇文章让你搞懂JavaScript 原型和原型链
2020/11/23 Javascript
[03:54]DOTA2英雄梦之声_第06期_昆卡
2014/06/23 DOTA
[41:52]DOTA2-DPC中国联赛 正赛 CDEC vs Dynasty BO3 第二场 2月22日
2021/03/11 DOTA
Python中的Classes和Metaclasses详解
2015/04/02 Python
Python使用pickle模块储存对象操作示例
2018/08/15 Python
django_orm查询性能优化方法
2018/08/20 Python
Python绘制热力图示例
2019/09/27 Python
CSS3 animation实现简易幻灯片轮播特效
2016/09/27 HTML / CSS
详解CSS3中nth-child与nth-of-type的区别
2017/01/05 HTML / CSS
使用纯HTML5编写一款网页上的时钟的代码分享
2015/11/16 HTML / CSS
Holiday Inn中国官网:IHG旗下假日酒店预订
2018/04/08 全球购物
Speedo速比涛法国官方网站:泳衣、泳镜、泳帽、泳裤
2019/07/30 全球购物
实习生自荐信范文
2013/11/13 职场文书
统计员岗位职责
2013/11/14 职场文书
尊老爱亲美德少年事迹材料
2014/08/14 职场文书
安全例会汇报材料
2014/08/23 职场文书
Spring Cloud 中@FeignClient注解中的contextId属性详解
2021/09/25 Java/Android