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 getopt 参数处理小示例
Jun 09 Python
Python中Class类用法实例分析
Nov 12 Python
python3 与python2 异常处理的区别与联系
Jun 19 Python
python实现微信远程控制电脑
Feb 22 Python
Selenium控制浏览器常见操作示例
Aug 13 Python
python中pip的使用和修改下载源的方法
Jul 08 Python
Python Django模板之模板过滤器与自定义模板过滤器示例
Oct 18 Python
tensorflow 模型权重导出实例
Jan 24 Python
python logging.info在终端没输出的解决
May 12 Python
简单了解如何封装自己的Python包
Jul 08 Python
python3中calendar返回某一时间点实例讲解
Nov 18 Python
常用的Python代码调试工具总结
Jun 23 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
用mysql内存表来代替php session的类
2009/02/01 PHP
PHP结合Ueditor并修改图片上传路径
2016/10/16 PHP
PHP使用正则表达式实现过滤非法字符串功能示例
2018/06/04 PHP
PHP addcslashes()函数讲解
2019/02/03 PHP
Laravel自动生成UUID,从建表到使用详解
2019/10/24 PHP
ExtJS 2.0实用简明教程之应用ExtJS
2009/04/29 Javascript
JS 面向对象的5钟写法
2009/07/31 Javascript
JavaScript常用小技巧小结
2014/12/29 Javascript
JS+CSS实现鼠标经过弹出一个DIV框完整实例(带缓冲动画渐变效果)
2016/03/25 Javascript
浅析Bootstrap验证控件的使用
2016/06/23 Javascript
js实现table添加行tr、删除行tr、清空行tr的简单实例
2016/10/15 Javascript
详解js的延迟对象、跨域、模板引擎、弹出层、AJAX【附实例下载】
2016/12/19 Javascript
Bootstrap警告(Alerts)的实现方法
2017/03/22 Javascript
详解JS获取HTML DOM元素的8种方法
2017/06/17 Javascript
JS数据类型(基本数据类型、引用数据类型)及堆和栈的区别分析
2020/03/04 Javascript
Angular处理未可知异常错误的方法详解
2021/01/17 Javascript
vue实现简易计算器功能
2021/01/20 Vue.js
pymssql ntext字段调用问题解决方法
2008/12/17 Python
代码讲解Python对Windows服务进行监控
2018/02/11 Python
python爬虫爬取微博评论案例详解
2019/03/27 Python
Python super()函数使用及多重继承
2020/05/06 Python
python的dict判断key是否存在的方法
2020/12/09 Python
python 实现的IP 存活扫描脚本
2020/12/10 Python
使用CSS3代码绘制可爱的Hello Kitty猫
2016/08/03 HTML / CSS
德国箱包网上商店:koffer24.de
2016/07/27 全球购物
精选鞋类、服装和配饰的全球领先目的地:Bodega
2021/02/27 全球购物
.NET面试题:什么是值类型和引用类型
2016/01/12 面试题
集体婚礼证婚词
2014/01/13 职场文书
美术专业个人自我评价
2014/01/18 职场文书
文明家庭先进事迹材料
2014/05/14 职场文书
护理学专业求职信
2014/06/29 职场文书
学校拾金不昧表扬信
2015/01/16 职场文书
幼师中班个人总结
2015/02/12 职场文书
2016年“节能宣传周”活动总结
2016/04/05 职场文书
python Django框架快速入门教程(后台管理)
2021/07/21 Python
python入门学习关于for else的特殊特性讲解
2021/11/20 Python