Python socket 套接字实现通信详解
作者:月下独愁人 发布时间:2023-05-16 04:18:08
首先:我们介绍一下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命令的未传输完成的那部分那么就是这就是粘包了
那么是什么造成的呢?
怎样解决呢?
下次讲解
来源:https://www.cnblogs.com/wuzifan/p/11410805.html
猜你喜欢
- 怎么用javascript进行拖拽本文译自:http://www.webreference.com/programming/javascri
- <html><head>//搜索暂时没做,数据是出来了,但是却没法显示<link rel="styl
- 由于ajax在跨域的访问上有问题,目前最好的方法是做代理.写了个代理程序和心得为了做ajax的代理,研究了下服务器端的xmlhttp并和客户
- 有这么一个题目,说bt其实也不bt,为了重点突出其中的意图,特意加上了括号:var a = (++Math.P
- NumPy数组(2、数组的操作)基本运算数组的算术运算是按元素逐个运算。数组运算后将创建包含运算结果的新数组。>>> a=
- 上一篇中,我们已经打开了Django自带的用户认证模块,并配置了数据库连接,创建了相应的表,本篇我们将在Django自带的用户认证的基础上,
- 目前防采集的方法有很多种,先介绍一下常见防采集策略方法和它的弊端及采集对策: 一、判断一个IP在一定时间内对本站页面的访问次数,如果明显超过
- Python函数和代码复用什么是函数:  函数是一段具有特定功能的,可重用的语句组,通过函数名来表示和调
- 今天我们来学习字符串数据类型相关知识,将讨论如何声明字符串数据类型,字符串数据类型与 ASCII 表的关系,字符串数据类型的属性,以及一些重
- 很多时候关心的是优化SELECT 查询,因为它们是最常用的查询,而且确定怎样优化它们并不总是直截了当。相对来说,将数据装入数据库是直截了当的
- docx2txt的Github地址docx2txt是基于python的从docx文件中提取文本和图片的库。代码是从python-docx中获
- 目录1图像叠加2图像融合3按位操作1图像叠加可以通过OpenCV函数cv.add()或简单地通过numpy操作添加两个图像,res = im
- 安装SQL Server 遇到错误提示:以前的某个程序安装已在安装计算机上创建挂起的文件操作。运行安装程序之前必须重新启动计算机!。找了半天
- 近年来,广告已成为很多网站的主要收入来源。不久前,在线广告往往遭到访客的拒绝,广告客户也不确定它的价值和效力。今天,大多数访客期望在商业网站
- 一、安装FastDFS1-1:执行docker命令安装# 安装trackerdocker run -dti --network=host -
- 1、存储过程基本语法: create procedure sp_name() begin ...... end; 2、如何调用: call
- 如何用OdbcRegTool组件来创建一个数据源?OdbcRegTool是一个免费组件,在服务器上安装后,就可以来创建一个数据源:<h
- 1.如果每页都增加打印时间,又如何设置?打印时间的,你可以参考 for(var i=0;i<page.length;i++)
- 本文实例讲述了php 多个变量指向同一个引用($b = &$a)用法。分享给大家供大家参考,具体如下:引用是什么? 引用就是多个变量
- 本文实例讲述了Python查找最长不包含重复字符的子字符串算法。分享给大家供大家参考,具体如下:题目描述请从字符串中找出一个最长的不包含重复