python3利用Socket实现通信的方法示例


Posted in Python onMay 06, 2019

参考于: python cs架构实现简单文件传输

原文中程序运行有误,在此做修改与解释,如下: 功能说明:

共2个py文件分别为server和client端,采用socket进行通信。提供两种功能:“dir“ 命令用于显示服务器端可下载文件名;“get/put+文件名“ 命令用于与服务器端进行下载或发送数据交换。

python3利用Socket实现通信的方法示例

Socket解释

服务器上socket编写步骤:

1.调用socket函数创建socket对象,如:

socket_server = socket.socket(family,type)

family参数代表地址家族,可为AF_INET(Internet通信)或AF_UNIX(同一台机器上进程间通信)。

type参数代表套接字类型,可为SOCK_STREAM(流套接字)和SOCK_DGRAM(数据报套接字)。

2.使用socket对象的bind方法,将socket绑定到指定地址,如:

socket_server.bind(address)

由AF_INET所创建的套接字,address必须是一组双元素元组,格式为(host,port)。

3.使用socket对象的listen方法接受连接请求,如:

socket_server.listen(backlog)

backlog指定最多允许多少个客户连接到服务器,至少为1,如果达到设定值,则拒绝接受新请求。

4.服务器套接字通过socket对象的accept方法等待客户请求一个连接,如:

connection,address = socket_server.accept()

运行accept方法后,socket进入“waiting”状态,等待客户请求连接。当客户请求连接时,accept方法建立连接并返回服务器,返回一组含两个元素的元组(connection,address)。 connection是新的socket对象,服务器必须通过这个新的对象与客户端进行通信 ;address是客户端的Internet地址。

5.处理阶段,服务器和客户端通过“send”和“recv”方法通信:

服务器调用send,并采用 二进制   形式向客户发送信息。send方法返回已发送的字符个数。

服务器使用recv方法从客户端接受信息,调用recv时,服务器必须指定一个整数来表示可通过本次方法调用来接受的最大数据量。recv方法在接收数据时会进入“blocked”状态,最后返回一个字符串,它表示收到的数据。如果发送数据量超过recv所允许,数据会被截断。多余的数据将缓冲到接收端。以后调用recv时,多余的数据会从缓冲区删除。

6.传输结束,调用socket对象的close方法关闭连接,如:

connection.close()

socket_server.close()

注意:这里先关闭accept创建的新socket(connection)然后关闭服务器端socket(socket_server)

客户端上socket编写步骤:

1.创建一个socket以连接服务器,如:

socket_client = socket.socket(family,type)

2.使用connect方法连接服务器,对于AF_INET而言链接格式如:

socket_client.connect((host,port))

host代表主服务器主机名或IP,port为服务器进程所绑定的端口号。

3.处理阶段,客户端和服务器端通过send与recv方法进行通信 4.传输结束,调用close方法关闭连接,如:

socket_client.close()

注意这里的socket_client是第一步创建的对象,而服务器端使用的是accept创建的新socket(connection)

关于TCP的三次握手建立连接和四次挥手断开连接这里不做叙述(彻底讲解我功夫不到家,不敢乱说),把图转来大家看一下(这个感觉很基础, 但很重要):

python3利用Socket实现通信的方法示例

三次握手

python3利用Socket实现通信的方法示例

四次挥手

程序如下:

服务器端:

python3利用Socket实现通信的方法示例

环境与服务器配置信息

python3利用Socket实现通信的方法示例

接收文件方法

python3利用Socket实现通信的方法示例

发送文件方法

python3利用Socket实现通信的方法示例

处理命令1(接收、发送)方法

python3利用Socket实现通信的方法示例

处理命令2(显示可下载文件)方法

python3利用Socket实现通信的方法示例

服务器端运行主体

客户端:

python3利用Socket实现通信的方法示例

环境与服务器配置

python3利用Socket实现通信的方法示例

接收文件方法

python3利用Socket实现通信的方法示例

发送文件方法

python3利用Socket实现通信的方法示例

确认服务器端消息方法

python3利用Socket实现通信的方法示例

处理命令1(接收、发送)方法

python3利用Socket实现通信的方法示例

处理命令2(显示可下载文件)方法

python3利用Socket实现通信的方法示例

客户端运行主体

运行说明:

1.首先建立server.py和client.py文件,并分别置于两个不同的位置,如图:

python3利用Socket实现通信的方法示例

Server文件夹及其py文件

python3利用Socket实现通信的方法示例

Client文件夹及其py文件

在Server文件夹下放一个或多个文件用于下载(我这里是4个不同类型的文件以供下文dir指令调用)

在Client文件下放一个或多个文件用于上传(我这里是一个word文本)

2.在Server目录下运行server.py,等待客户端发送连接请求:

python3利用Socket实现通信的方法示例

服务器端等待连接请求

3.在Client目录下运行client.py,向服务器端发送连接请求:

python3利用Socket实现通信的方法示例

客户端发送请求 & 服务器端连接成功

注意:先启动服务器,再启动客户端,这个为什么不用多说吧?

4.在客户端输入“dir”指令,查看可下载目录文件:

python3利用Socket实现通信的方法示例

“dir”指令

注:这里我用“\t“即制表符来控制显示格式,但不知道为啥第一个文件后会自动换行,暂且放着不去管它(不影响通信功能)

5.在客户端输入“get”指令,下载服务器中指定文件:

python3利用Socket实现通信的方法示例

“get 射频仿真.pptx“指令

python3利用Socket实现通信的方法示例

“射频仿真.pptx”下载成功

6.在客户端输入“put”指令,上传指定文件到服务器:

python3利用Socket实现通信的方法示例

“put 天线15.doc”指令

python3利用Socket实现通信的方法示例

“天线15.doc”上传成功

7.在客户端输入“close”指令,关闭连接,服务器进入监听状态:

python3利用Socket实现通信的方法示例

“close”指令

注意几点:

1.send方法的第一个参数是二进制数据,使用bytes(字符串,encoding='utf-8')将字符串改为二进制进行发送

2.在做指令判断的时候,需要将“get”、“put”等指令转为二进制,才能与接收到的指令进行判断,这里不将二进制转为字符串(这样易于理解)的原因是,我没找到一个简单的方法让二进制转str(我不会)

3.理清楚创建流程后,主要的困难就是转换数据格式,哪里需要转哪里不需要,自己写一遍,再debug一会儿就会弄明白了

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
使用Python进行AES加密和解密的示例代码
Feb 02 Python
Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息示例
Jul 18 Python
解决sublime+python3无法输出中文的问题
Dec 12 Python
对python dataframe逻辑取值的方法详解
Jan 30 Python
Python给图像添加噪声具体操作
Mar 03 Python
python使用装饰器作日志处理的方法
Jul 11 Python
python对绑定事件的鼠标、按键的判断实例
Jul 17 Python
Python Web静态服务器非堵塞模式实现方法示例
Nov 21 Python
pandas中read_csv的缺失值处理方式
Dec 19 Python
python怎么判断模块安装完成
Jun 19 Python
浅谈keras中Dropout在预测过程中是否仍要起作用
Jul 09 Python
Python如何截图保存的三种方法(小结)
Sep 01 Python
75条笑死人的知乎神回复,用60行代码就爬完了
May 06 #Python
Python Flask 搭建微信小程序后台详解
May 06 #Python
Python玩转PDF的各种骚操作
May 06 #Python
使用Python和Prometheus跟踪天气的使用方法
May 06 #Python
Python中常用的8种字符串操作方法
May 06 #Python
基于python if 判断选择结构的实例详解
May 06 #Python
20行python代码的入门级小游戏的详解
May 05 #Python
You might like
用户的详细注册和判断
2006/10/09 PHP
php命令行使用方法和命令行参数说明
2014/04/08 PHP
php 解压rar文件及zip文件的方法
2014/05/05 PHP
详谈PHP中的密码安全性Password Hashing
2017/02/04 PHP
修改Laravel自带的认证系统的User类的命名空间的步骤
2019/10/15 PHP
JavaScript 利用Cookie记录用户登录信息
2009/12/08 Javascript
Extjs学习笔记之九 数据模型(上)
2010/01/11 Javascript
textarea焦点的用法实现获取焦点清空失去焦点提示效果
2014/05/19 Javascript
jquery实现类似淘宝星星评分功能实例
2014/09/12 Javascript
jquery ui bootstrap 实现自定义风格
2014/11/14 Javascript
实例解析JS布尔对象的toString()方法和valueOf()方法
2015/10/25 Javascript
AngularJS基础 ng-csp 指令详解
2016/08/01 Javascript
利用JavaScript实现拖拽改变元素大小
2016/12/14 Javascript
AngularJS的ng-repeat指令与scope继承关系实例详解
2017/01/21 Javascript
BootStrap实现带关闭按钮功能
2017/02/15 Javascript
js的OOP继承实现(必看篇)
2017/02/18 Javascript
快速解决Vue项目在IE浏览器中显示空白的问题
2018/09/04 Javascript
echarts多条折线图动态分层的实现方法
2019/05/24 Javascript
vue实现日历备忘录功能
2020/09/24 Javascript
微信小程序页面滚动到指定位置代码实例
2019/09/07 Javascript
python字典多键值及重复键值的使用方法(详解)
2016/10/31 Python
python编程嵌套函数实例代码
2018/02/11 Python
Python实现数据可视化看如何监控你的爬虫状态【推荐】
2018/08/10 Python
解决pytorch 数据类型报错的问题
2021/03/03 Python
Black Halo官方网站:购买连衣裙、礼服和连体裤
2018/06/13 全球购物
阿姆斯特丹杜莎夫人蜡像馆官方网站:Madame Tussauds Amsterdam
2019/03/12 全球购物
澳大利亚实惠时尚女装商店:Katies
2019/06/16 全球购物
局部内部类是否可以访问非final变量?
2013/04/20 面试题
中软Java笔试题
2012/11/11 面试题
这段代码难道不该打印出56吗
2013/02/27 面试题
专科毕业生自我鉴定
2013/12/01 职场文书
主治医师岗位职责
2013/12/10 职场文书
银行职员思想汇报
2013/12/31 职场文书
大学生校园创业计划书
2014/02/08 职场文书
项目经理聘任书
2014/03/29 职场文书
一文彻底理解js原生语法prototype,__proto__和constructor
2021/10/24 Javascript