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中的CURL PycURL使用例子
Jun 01 Python
python中子类调用父类函数的方法示例
Aug 18 Python
Python简单实现控制电脑的方法
Jan 22 Python
python 利用栈和队列模拟递归的过程
May 29 Python
python实现键盘控制鼠标移动
Nov 27 Python
啥是佩奇?使用Python自动绘画小猪佩奇的代码实例
Feb 20 Python
Python调用钉钉自定义机器人的实现
Jan 03 Python
解决安装新版PyQt5、PyQT5-tool后打不开并Designer.exe提示no Qt platform plugin的问题
Apr 24 Python
Python使用Matlab命令过程解析
Jun 04 Python
学生如何注册Pycharm专业版以及pycharm的安装
Sep 24 Python
Python尾递归优化实现代码及原理详解
Oct 09 Python
Python3.9最新版下载与安装图文教程详解(Windows系统为例)
Nov 28 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
ThinkPHP表单自动提交验证实例教程
2014/07/18 PHP
PHP+MYSQL中文乱码问题
2015/07/01 PHP
php mysql procedure实现获取多个结果集的方法【基于thinkPHP】
2016/11/09 PHP
javascript XMLHttpRequest对象全面剖析
2010/04/24 Javascript
jquery键盘事件介绍
2011/01/31 Javascript
理解JavaScript的prototype属性
2012/02/11 Javascript
Javascript无阻塞加载具体方式
2013/06/28 Javascript
JS实现仿京东淘宝竖排二级导航
2014/12/08 Javascript
jQuery性能优化技巧分析
2015/02/20 Javascript
javascript关于运动的各种问题经典总结
2015/04/27 Javascript
AngularJS  双向数据绑定详解简单实例
2016/10/20 Javascript
JS判断字符串是否为整数的方法--简单的正则判断
2018/07/23 Javascript
vue2.0$nextTick监听数据渲染完成之后的回调函数方法
2018/09/11 Javascript
微信小程序 (地址选择1)--选取搜索地点并显示效果
2019/12/17 Javascript
Vue.js的模板语法详解
2020/02/16 Javascript
vue中的双向数据绑定原理与常见操作技巧详解
2020/03/16 Javascript
[06:11]2014DOTA2国际邀请赛 专访团结一心的VG战队
2014/07/21 DOTA
[01:38]【DOTA2亚洲邀请赛】Sumail——梦开始的地方
2017/03/03 DOTA
[01:09:23]KG vs TNC 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
在Python中使用cookielib和urllib2配合PyQuery抓取网页信息
2015/04/25 Python
python中zip和unzip数据的方法
2015/05/27 Python
python实现的AES双向对称加密解密与用法分析
2017/05/02 Python
Python实现的简单排列组合算法示例
2018/07/04 Python
Selenium关闭INFO:CONSOLE提示的解决
2020/12/07 Python
css3过渡_动力节点Java学院整理
2017/07/11 HTML / CSS
很酷的HTML5电子书翻页动画特效
2016/02/25 HTML / CSS
玩具反斗城西班牙网上商城:ToysRUs西班牙
2017/01/19 全球购物
写给保洁员表扬信
2014/01/08 职场文书
三好学生个人总结
2015/02/15 职场文书
奖学金个人总结
2015/03/04 职场文书
企业投资意向书
2015/05/09 职场文书
重阳节活动主持词
2015/07/04 职场文书
采购部2015年度工作总结
2015/07/24 职场文书
MySQL的索引你了解吗
2022/03/13 MySQL
Python中npy和mat文件的保存与读取
2022/04/24 Python
JavaScript parseInt0.0000005打印5原理解析
2022/07/23 Javascript