首先:我们介绍一下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命令的未传输完成的那部分那么就是这就是粘包了
那么是什么造成的呢?
怎样解决呢?
下次讲解
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 群星《前途海量 电影原声专辑》[FLAC/分轨][227.78MB]
- 张信哲.1992-知道新曲与精丫巨石】【WAV+CUE】
- 王翠玲.1995-ANGEL【新艺宝】【WAV+CUE】
- 景冈山.1996-我的眼里只有你【大地唱片】【WAV+CUE】
- 群星《八戒 电影原声带》[320K/MP3][188.97MB]
- 群星《我的阿勒泰 影视原声带》[320K/MP3][139.47MB]
- 纪钧瀚《胎教古典音乐 钢琴与大提琴的沉浸时光》[320K/MP3][148.91MB]
- 刘雅丽.2001-丽花皇后·EMI精选王【EMI百代】【FLAC分轨】
- 齐秦.1994-黄金十年1981-1990CHINA.TOUR.LIVE精丫上华】【WAV+CUE】
- 群星.2008-本色·百代音乐人创作专辑【EMI百代】【WAV+CUE】
- 群星.2001-同步过冬AVCD【环球】【WAV+CUE】
- 群星.2020-同步过冬2020冀待晴空【环球】【WAV+CUE】
- 沈雁.1986-四季(2012梦田复刻版)【白云唱片】【WAV+CUE】
- 纪钧瀚《胎教古典音乐 钢琴与大提琴的沉浸时光》[FLAC/分轨][257.88MB]
- 《国语老歌 怀旧篇 3CD》[WAV/分轨][1.6GB]