Python socket 套接字实现通信详解


Posted in Python onAugust 27, 2019

首先:我们介绍一下socket什么是socket:

1. socket 在操作系统中它是处于应用层与传输层的抽象层,它是一组操作起来非常简单的接口(接收数据的),此接口接受数据之后交个操作系统

那么为什么?直接给操作系统不是更方便吗?那么你就想错了

因为操作系统的接口远比我们想象的要丑陋复杂,使用操作系统交换数据,非诚繁琐,,开发者们只能想办法让一个中间人和他们打交道,来简单的实现数据交换,那么就是socket套接字.它的作用就是:与操作系统之间数据交换将这些繁琐的操作,进行高度化封装,和简化,

2.我们能够用它实现简单的通信

在Python中有一个简单的内置socket 模块我们可以用它实现简单的基于TCP协议的通信

#基于切换连接的循环通信
 import socket #首先我们在文件中导入socket 模块
 phone = socket.socket() #实例化一个对象
 phone.bind(('127.0.01',8765))#bind是存放ip地址的(这里存放的是本地的IP地址)
 phone.listen(5)#可以设置连接的个数,
 while 1:#循环等待连接
  conn,adds = phone.accept()
  while 1:#要循环聊天我们要重复接收发送
   try: #异常处理
    receives_commands = conn.recv(1024) #接收命令请求,最多接收1024字节当然你也可以调整
    receivse_commands = receives_commands.decode('utf-8')#网络传输是以字节的形势的所以我们要进行解码
    print(f'来自客户端的消息{receives_commands}') #打印消息
    if receives_commands.upper(0 == 'Q':break #正常结束
    dispatch_orders = inport('请输入:').strip().encode('utf-8')
    conn.send(dispatch_orders)
   except ConnectionResetError:#客户端异常结束
    print('客户端终端')
    break
  conn.close() #关闭连接
 phone.close#关闭服务端
 #客户端
 import socket
 phone = socket.socket()
 phone.connect(('127.0.01',8765))  #连接服务端地址   
 while 1:     
  dispatch_orders = inport('请输入:').strip().encode('utf-8')#发送请求
  if not dispatch_orders:print('不能为空')#不能为空
  phone.send(dispatch_orders)  #发送      
  if dispatch_orders.upper() ==b'Q':#正常退出
   break
  receives_commands = phone.recv(1024)#接收服务端的回执
  receives_commands = receives_commands.decode('utf-8')#解码
  print(f'来自客户端的消息{receives_commands}') #打印        
 phone.close()#关闭客户端

那么我们就通过socket实现了一个简单的通信链接循环

其中我们需要注意的是:

1.阻塞 accept 和recv 当服务器和客户端都属于同种类阻塞时,那么谁都是同步接受或同步发送的状态那么是处于静止的,这样是不合理的(就是bug)

2.当我们设计时我们需要知道发送不能为空,不然服务端是接收不到消息的所以我们设置一个判断
有时我们会发现当我们接受的超过1024字节会发生什么?

那么下面我们就来将回答下这个问题:

下面我们引入一个操作系统的模块

Python中 subprocess 模块就是用来和cmd 命令行进行交流的模块

obj = subprocess.Popen('dir',#实例化对象括号内第一个参数就是我们的cmd命令行的命令,这里我们写的是dir显示文件夹中内容
         shell=True,
         stdout=subprocess.PIPE,
         stderr=subprocess.PIPE,
         )
   print(obj.stdout.read().decode('gbk')) # 正确命令
   print(obj.stderr.read().decode('gbk')) # 错误命令

那么我们在这个基础上建立一个服务端响应客户端命令的机制

import socket
import subprocess
phone = socket.socket()
phone.bind(('127.0.01',8695))
phone.listen(5)
while 1:
 conn,adds = phone.accept()
 while 1:
  try:
   receives_commands = conn.recv(1024)
   if receiver_commands ==b'Q':break 
   #obj = subprocess.Popen(Receiving_instructiors,
         # shell= True,
       #stdout = subprocess.PIPE,
       #stderr = subprocess.PIPE
         )
  obj = subprocess.Popen(receives_commands.decode('utf-8')#动态的传入命令
       shell = True
       stdout = subprocess.PIPE
       stderr = subprocess.PIPE 
       )
 # print(obj.stdout.read().decode('gbk')) # 正确命令
 # print(obj.stderr.read().decode('gbk')) # 错误命令
  ret = obj.stodut.read()+obj.stderr.read()#将产生的内容进行拼接
  conn.send(ret)
 except ConnectionResetError:
   print('客户端终端')
   break 
 conn.close()
phone.close()
import socket
phone = socket.socket()
phone.connect(('127.0.01',8695))
while 1:
 dispatch_orders = inport('请输入命令:').strip().encode('utf-8')
 if not dispatch_orders:print('输入不能为空')
 phone.send(dispatch_orders)
 if dispatch_orders.upper() ==b'Q':break
 receives_commands = phone.recv(1024)
 receives_commands = receives_commands.decode('utf-8')
 print(f'来自客户端的消息{receives_commands}')
phone.close()

那么我们就会发现一个问题,当我们输入的help命令的时候超过了1024字节那么怎么办

还发现一个问题那就是当我们输入的下个命令时,还是出来help命令的未传输完成的那部分那么就是这就是粘包了

那么是什么造成的呢?

怎样解决呢?

下次讲解

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

Python 相关文章推荐
使用Python的Zato发送AMQP消息的教程
Apr 16 Python
Python基于jieba库进行简单分词及词云功能实现方法
Jun 16 Python
在Python中获取两数相除的商和余数方法
Nov 10 Python
Python和Go语言的区别总结
Feb 20 Python
利用django+wechat-python-sdk 创建微信服务器接入的方法
Feb 20 Python
python读取并定位excel数据坐标系详解
Jun 26 Python
程序员的七夕用30行代码让Python化身表白神器
Aug 07 Python
np.newaxis 实现为 numpy.ndarray(多维数组)增加一个轴
Nov 30 Python
Python drop方法删除列之inplace参数实例
Jun 27 Python
Python使用socket模块实现简单tcp通信
Aug 18 Python
用Python提取PDF表格的方法
Apr 11 Python
python中__slots__节约内存的具体做法
Jul 04 Python
python 使用pdfminer3k 读取PDF文档的例子
Aug 27 #Python
手写一个python迭代器过程详解
Aug 27 #Python
浅析Python语言自带的数据结构有哪些
Aug 27 #Python
python3应用windows api对后台程序窗口及桌面截图并保存的方法
Aug 27 #Python
python协程gevent案例 爬取斗鱼图片过程解析
Aug 27 #Python
Python中Unittest框架的具体使用
Aug 27 #Python
详解python3中用HTMLTestRunner.py报ImportError: No module named 'StringIO'如何解决
Aug 27 #Python
You might like
漫荒推荐:画风超赞的国风漫画推荐 超长假期不无聊
2020/03/08 国漫
php download.php实现代码 跳转到下载文件(response.redirect)
2009/08/26 PHP
PHP实现HTML页面静态化的方法
2015/11/04 PHP
分享10段PHP常用代码
2015/11/11 PHP
分享php邮件管理器源码
2016/01/06 PHP
PHPStorm 2020.1 调试 Nodejs的多种方法详解
2020/09/17 NodeJs
面向对象的Javascript之三(封装和信息隐藏)
2012/01/27 Javascript
在jQuery ajax中按钮button和submit的区别分析
2012/10/07 Javascript
Json字符串转换为JS对象的高效方法实例
2013/05/01 Javascript
javascript自动给文本url地址增加链接的方法分享
2014/01/20 Javascript
javascript实现锁定网页、密码解锁效果(类似系统屏幕保护效果)
2014/08/15 Javascript
javascript实现点击提交按钮后显示loading的方法
2015/07/03 Javascript
jQuery幻灯片特效代码分享--鼠标滑过按钮时切换(2)
2020/11/18 Javascript
JS+CSS实现带有碰撞缓冲效果的竖向导航条代码
2015/09/15 Javascript
JavaScript中Boolean对象的属性解析
2015/10/21 Javascript
JavaScript获取各大浏览器信息图示
2015/11/20 Javascript
jQuery购物车插件jsorder用法(支持后台处理程序直接转换成DataTable处理)
2016/06/08 Javascript
js对象浅拷贝和深拷贝详解
2016/09/05 Javascript
Jquery鼠标放上去显示全名的实现方法
2017/02/06 Javascript
JS中的事件委托实例浅析
2018/03/22 Javascript
js对象简介与基本用法示例
2020/03/13 Javascript
[03:07]DOTA2英雄基础教程 冰霜诅咒极寒幽魂
2013/12/06 DOTA
Python操作MySQL简单实现方法
2015/01/26 Python
Python脚本修改阿里云的访问控制列表的方法
2019/03/08 Python
python之生成多层json结构的实现
2020/02/27 Python
python 统计list中各个元素出现的次数的几种方法
2021/02/20 Python
几个Linux面试题笔试题
2016/08/01 面试题
高级文秘工作总结的自我评价
2013/09/28 职场文书
个人简历中的自我评价怎么写
2014/01/26 职场文书
餐厅楼面部长岗位职责范文
2014/02/16 职场文书
技校毕业生自荐信
2014/06/03 职场文书
工地门卫岗位职责范本
2014/07/01 职场文书
自愿离婚协议书范本2016
2016/03/18 职场文书
2016年第十九届推普周活动总结
2016/04/06 职场文书
Python中X[:,0]和X[:,1]的用法
2021/05/10 Python
vue中控制mock在开发环境使用,在生产环境禁用方式
2022/04/06 Vue.js