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 相关文章推荐
解决python3 urllib中urlopen报错的问题
Mar 25 Python
python清除字符串中间空格的实例讲解
May 11 Python
python pytest进阶之fixture详解
Jun 27 Python
对Django中static(静态)文件详解以及{% static %}标签的使用方法
Jul 28 Python
python 初始化一个定长的数组实例
Dec 02 Python
python单例设计模式实现解析
Jan 07 Python
python 安装impala包步骤
Mar 28 Python
PyTorch中model.zero_grad()和optimizer.zero_grad()用法
Jun 24 Python
keras和tensorflow使用fit_generator 批次训练操作
Jul 03 Python
详解Python中Pyyaml模块的使用
Oct 08 Python
总结Python使用过程中的bug
Jun 18 Python
如何通过一篇文章了解Python中的生成器
Apr 02 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
PHP MSSQL 存储过程的方法
2008/12/24 PHP
dojo 之基础篇
2007/03/24 Javascript
javascript一些不错的函数脚本代码
2008/09/10 Javascript
JS获取dom 对象 ajax操作 读写cookie函数
2009/11/18 Javascript
JavaScript 学习笔记(十一)
2010/01/19 Javascript
详解jquery uploadify 上传文件
2013/11/09 Javascript
简单js代码实现selece二级联动(推荐)
2014/02/18 Javascript
一个简单的jQuery插件ajaxfileupload.js实现ajax上传文件例子
2014/06/26 Javascript
JavaScript italics方法入门实例(把字符串显示为斜体)
2014/10/17 Javascript
jQuery中siblings()方法用法实例
2015/01/08 Javascript
jquery地址栏链接与a标签链接匹配之特效代码总结
2015/08/24 Javascript
Jquery ajax 同步阻塞引起的UI线程阻塞问题
2015/11/17 Javascript
微信小程序 条件渲染详解
2016/10/09 Javascript
Bootstrap基本组件学习笔记之面板(14)
2016/12/08 Javascript
AngularJS双向绑定和依赖反转实例详解
2017/04/15 Javascript
Angular.JS中指令ng-if、ng-show/ng-hide和ng-switch的使用教程
2017/05/07 Javascript
layui之select的option叠加问题的解决方法
2018/03/08 Javascript
详解vuex中mapState,mapGetters,mapMutations,mapActions的作用
2018/04/13 Javascript
Vue使用NPM方式搭建项目
2018/10/25 Javascript
Vue.js中的组件系统
2019/05/30 Javascript
微信小程序动画组件使用解析,类似vue,且更强大
2019/08/01 Javascript
解决layer.open后laydate失效的问题
2019/09/06 Javascript
python实现感知器
2017/12/19 Python
pygame实现俄罗斯方块游戏(基础篇2)
2019/10/29 Python
如何使用Python自动生成报表并以邮件发送
2020/10/15 Python
CSS3的column-fill属性对齐列内容高度的用法详解
2016/07/01 HTML / CSS
公司成立感言
2014/01/11 职场文书
幼师求职自荐信范文
2014/01/26 职场文书
超市创业计划书
2014/04/24 职场文书
小学运动会演讲稿
2014/08/25 职场文书
教师遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
会议接待欢迎标语
2014/10/08 职场文书
慈善募捐倡议书
2015/04/27 职场文书
2015年科普工作总结
2015/07/23 职场文书
Canvas三种动态画圆实现方法说明(小结)
2021/04/16 Javascript
Three.js实现雪糕地球的使用示例详解
2022/07/07 Javascript