首先:我们介绍一下socket什么是socket:
1. socket 在操作系统中它是处于应用层与传输层的抽象层,它是一组操作起来非常简单的接口(接收数据的),此接口接受数据之后交个操作系统
那么为什么"htmlcode">
#基于切换连接的循环通信
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字节会发生什么"htmlcode">
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命令的未传输完成的那部分那么就是这就是粘包了
那么是什么造成的呢?
怎样解决呢?
下次讲解
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件!
如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
暂无“Python socket 套接字实现通信详解”评论...
P70系列延期,华为新旗舰将在下月发布
3月20日消息,近期博主@数码闲聊站 透露,原定三月份发布的华为新旗舰P70系列延期发布,预计4月份上市。
而博主@定焦数码 爆料,华为的P70系列在定位上已经超过了Mate60,成为了重要的旗舰系列之一。它肩负着重返影像领域顶尖的使命。那么这次P70会带来哪些令人惊艳的创新呢?
根据目前爆料的消息来看,华为P70系列将推出三个版本,其中P70和P70 Pro采用了三角形的摄像头模组设计,而P70 Art则采用了与上一代P60 Art相似的不规则形状设计。这样的外观是否好看见仁见智,但辨识度绝对拉满。
更新动态
2025年11月06日
2025年11月06日
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]