day29 socket编程TCP和UDP

1 发送大文件

2 UDP基本使用

3 UDP实现建议版本的QQ

4 TCP与UDP之间的区别

5 socketserver模块

6 异常处理

 

1 发送大文件

 

通过客户端上传大文件到服务端 

服务端

import socket
import json
import structserver = socket.socket()
server.bind(('127.0.0.1', 8080))
server.listen(5)while True:conn, addr = server.accept()while True:try:header = conn.recv(4)dict_len = struct.unpack('i', header)[0]  # [0]一定要记得加上去dict_real = conn.recv(dict_len)dict_json = json.loads(dict_real.decode('utf-8'))file_size = dict_json.get('file_size')file_name = dict_json.get('file_name')recv_size = 0with open(file_name, 'wb') as f:while recv_size < file_size:data = conn.recv(1024)f.write(data)  # 出过错recv_size += len(data)print('上传成功')except ConnectionResetError:breakconn.close()

注释版

import socket, json, structserver = socket.socket()
server.bind(('127.0.0.1', 8080))
server.listen(5)while True:conn, addr = server.accept()while True:try:header_len = conn.recv(4)# 解析字典报头header_len = struct.unpack('i', header_len)[0]# 再接收字典数据header_dic = conn.recv(header_len)real_dic = json.loads(header_dic.decode('utf-8'))# 获取数据长度total_size = real_dic.get('file_size')# 循环接收并写入文件recv_size = 0with open(real_dic.get('file_name'), 'wb') as f:while recv_size < total_size:data = conn.recv(1024)f.write(data)recv_size += len(data)print('上传成功')except ConnectionResetError as e:print(e)breakconn.close()

 

 

客户端

import socket
import os
import json
import structclient = socket.socket()
client.connect(('127.0.0.1', 8080))
path = r'/Users/yuanjianwei/PycharmProjects/untitled/day28/network'
path_list = os.listdir(path)while True:for index, movie in enumerate(path_list, 1):print(index, movie)choice = input("请选择上传的电影>>>: ").strip()if choice.isdigit() and (int(choice) in range(1, len(path_list) + 1)):  # int(choice)忘了加movie_name = path_list[int(choice)]movie_path = os.path.join(path, movie_name)movie_size = os.path.getsize(movie_path)file_dict = {'file_name': '性感荷官在线发牌.py','file_size': movie_size,'file_info': '要想身体好,多喝健力宝'}file_json = json.dumps(file_dict).encode('utf-8')header = struct.pack('i', len(file_json))  # struct.error: required argument is not an integer 忘了加len()
        client.send(header)client.send(file_json)with open(movie_path, 'rb') as f:for line in f:client.send(line)print('上传完成')else:print('请输入正确的数字序号!')

 

注释版

import socket, json, os, structclient = socket.socket()
client.connect(('127.0.0.1', 8080))while True:# 获取电影列表 循环展示MOVIE_DIR = r'D:\python脱产10期视频\day25\视频'movie_list = os.listdir(MOVIE_DIR)# print(movie_list)for i, movie in enumerate(movie_list, 1):print(i, movie)# 用户选择choice = input('please choice movie to upload>>>:')# 判断是否是数字且是否在列表范围内if choice.isdigit() and (int(choice) in range(0, len(movie_list))):choice = int(choice) - 1# 获取到用户想上传的文件路径path = movie_list[choice]# 拼接文件的绝对路径file_path = os.path.join(MOVIE_DIR, path)# 获取文件大小file_size = os.path.getsize(file_path)# 定义一个字典res_d = {'file_name': '性感荷官在线发牌.mp4','file_size': file_size,'msg': '注意身体,多喝营养快线'}# 序列化字典json_d = json.dumps(res_d)json_bytes = json_d.encode('utf-8')# 1.先制作字典格式的报头header = struct.pack('i', len(json_bytes))# 2.发送字典的报头
        client.send(header)# 3.再发字典
        client.send(json_bytes)# 4.再发文件数据(打开文件循环发送)with open(file_path, 'rb') as f:for line in f:client.send(line)else:print('must be a number and in range')

 

 

2 UDP基本使用

UDP通信

# 数据报协议(自带报头),但没有双向通道 通信类似于发短信
1.udp协议客户端允许发空
2.udp协议不会粘包
3.udp协议服务端不存在的情况下,客户端照样不会报错?
4.udp协议支持并发

 


UDP类似于发短信,TCP类似于打电话
并发:看起来像同时运行的
并行:真正意义上的同时运行

服务端:

import socketserver = socket.socket(type=socket.SOCK_DGRAM)  # UDP协议
server.bind(('127.0.0.1', 8080))
# UDP不需要设置半连接池 它也没有半连接池的概念# 因为没有双向通道  不需要accept  直接就是通信循环
while True:data, addr = server.recvfrom(1024)print('数据:', data)  # 客户端发来的消息print('地址:', addr)  # 客户端的地址server.sendto(data.upper(), addr)

 

客户端:

import socketclient = socket.socket(type=socket.SOCK_DGRAM)server_addr = ('127.0.0.1', 8080)while True:client.sendto(b'hello', server_addr)data, addr = client.recvfrom(1024)print('服务端发来的数据', data)print('服务端的地址', addr)

 

 

3 UDP实现建议版本的QQ

服务器

import socketserver = socket.socket(type=socket.SOCK_DGRAM)
server.bind(('127.0.0.1', 8080))while True:data, addr = server.recvfrom(1024)print(data.decode('utf-8'))msg = input('>>>')server.sendto(msg.encode('utf-8'), addr)

客户端1

import socketclient = socket.socket(type=socket.SOCK_DGRAM)
addr = ('127.0.0.1', 8080)while True:msg = input('>>>>')msg = f"来自客户端1的消息{msg}"client.sendto(msg.encode('utf-8'), addr)data, addr = client.recvfrom(1024)print(data.decode('utf-8'))

客户端2

import socketclient = socket.socket(type=socket.SOCK_DGRAM)
addr = ('127.0.0.1', 8080)while True:msg = input('>>>>')msg = f"来自客户端2的消息{msg}"client.sendto(msg.encode('utf-8'), addr)data, addr = client.recvfrom(1024)print(data.decode('utf-8'))

 

4 TCP与UDP之间的区别

服务端

import socketserver = socket.socket(type=socket.SOCK_DGRAM)  # 需要type把默认的TCP套接字转化成UDP的
server.bind(('127.0.0.1', 8080))

data, addr = server.recvfrom(1024) # recv变成recvfrom
print(data)
data, addr1 = server.recvfrom(1024)
print(data)
data, addr2 = server.recvfrom(1024)
print(data)

 

客户端

import socketclient = socket.socket(type=socket.SOCK_DGRAM)
server_address = ('127.0.0.1', 8080)
# while True:
# msg = input('>>>:')
client.sendto(b'hello', server_address)  # send变成sendto
client.sendto(b'hello', server_address)
client.sendto(b'hello', server_address)
# data, server_addr = client.recvfrom(1024)
# print(data)

 

 

5 socketserver模块(支持TCP的并发)

服务端

import socketserverclass MyServer(socketserver.BaseRequestHandler):  # 请求处理器(RequestHandler)def handle(self):  # 处理器# print('来啦 老弟')while True:data = self.request.recv(1024)  # 接受传输的内容print(self.client_address)  # 客户端地址print(data.decode('utf-8'))self.request.send(data.upper())  # request 请求if __name__ == '__main__':"""只要有客户端连接  会自动交给自定义类中的handle方法去处理"""server = socketserver.ThreadingTCPServer(('127.0.0.1', 8080), MyServer)  # 创建一个基于TCP的对象  thread(穿过通过)server.serve_forever()  # 启动该服务对象,让server永远运行下去,除非强制停止程序# 设置allow_reuse_address允许服务器重用地址socketserver.TCPServer.allow_reuse_address = True# 创建一个server, 将服务地址绑定到127.0.0.1:9999server = socketserver.TCPServer((HOST, PORT),Myserver)

 

 

客户端

import socketclient = socket.socket()
client.connect(('127.0.0.1', 8080))while True:client.send(b'hello')data = client.recv(1024)print(data.decode('utf-8'))

 

 

6 异常处理


什么是异常?

程序在运行过程中出现了不可预知的错误
并且该错误没有对应的处理机制,那么就会以异常的形式表现出来
造成的影响就是整个程序无法再正常运行

 


异常的结构

# 1.异常的类型:NAMEERROR
# 2.异常的信息:name 'fdsdfsdf' is not defined
# 3.异常的位置:Traceback (most recent call last):
File "D:/python脱产10期视频/day29/01 异常处理.py", line 1, in <module>
fdsdfsdf

 


异常的种类(两大类)

# 1.语法错误
是你程序立刻就能解决的,这种错误是不能被容忍的
语法上的错误 发现之后应该立刻解决# 2.逻辑错误
这种错是可以被容忍的 因为一眼看不出来
针对逻辑上的错误 可以采用异常处理机制进行捕获

 


常见的错误类型

# NAMERROR 名字错误
# SyntaxError 语法错误
# KeyError 键不存在
# ValueError 值错误
# IndexError 索引错误

 


如何避免
异常处理
在你认为可能会出现bug的代码块上方try一下:注意try内部的代码块越少越好

try:
可能出错的代码
except 出错的类型 as e: # 将报错信息赋值给变量e
出错之后的处理机制

 

转载于:https://www.cnblogs.com/Ryan-Yuan/p/11323320.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/482555.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

万字长文!DeepMind科学家总结2021年的15个高能研究

来源&#xff1a;新智元2021年ML和NLP依然发展迅速&#xff0c;DeepMind科学家最近总结了过去一年的十五项亮点研究方向&#xff0c;快来看看哪个方向适合做你的新坑&#xff01;最近&#xff0c;DeepMind科学家Sebastian Ruder总结了15个过去一年里高能、有启发性的研究领域&a…

编程书籍

计算机书籍控 http://bestcbooks.com/recommend/most-influential-book/ 转载于:https://www.cnblogs.com/water-bear/p/11325111.html

情人节特刊| 爱的神经机制

来源&#xff1a;浙江大学学术委员会文&#xff1a;周炜1在哺乳动物的物种中&#xff0c;仅有不到10%的物种能够形成基于一夫一妻制的配对关系。随着时间的推移&#xff0c;通过选择性地寻找伴侣和与伴侣互动&#xff0c;夫妻关系得以维持和加强。大多数实验室啮齿动物包括大小…

应用安全 - 渗透测试 - .net网站

注入 注入 单引号检测 - 多数使用MSSQL数据库常规注入绕过 "or | or oror | oror" 上传 加图片头GIF89A 转载于:https://www.cnblogs.com/AtesetEnginner/p/11327462.html

为了自动驾驶,谷歌用NeRF在虚拟世界中重建了旧金山市

来源&#xff1a;机器学习研究组订阅真不用来做成元宇宙&#xff1f;训练自动驾驶系统需要高精地图&#xff0c;海量的数据和虚拟环境&#xff0c;每家致力于此方向的科技公司都有自己的方法&#xff0c;Waymo 有自己的自动驾驶出租车队&#xff0c;英伟达创建了用于大规模训练…

day30 并发编程

大文件上传思维逻辑 服务端 # 1.socket创建TCP服务 # 2.连接循环 # 3.通信循环接受固定长度的字典的报头解析获取字典数据的真实长度接受字典数据 解码 反序列化成字典从字典中获取文件大小 以及文件名等其他信息 # 4.循环接受文件数据文件操作(wb) 接受一行往文件中写入一行 客…

人工智能可以自己编码?2022年这8个人工智能趋势值得关注!

来源&#xff1a;产业大视野译者&#xff1a;Sambodhi1. AI-on-5G2022 年&#xff0c;工业 AI 和 AI-on-5G 物联网应用将会成为主流。想象一下&#xff0c;当我我以元宇宙为目标的时候&#xff0c;我们对物理空间的升级方式同样令人印象深刻。AI-on-5G 组合计算基础设施为传感器…

通过OracleDataReader来读取BLOB类型的数据

在实际的应用过程中&#xff0c;需要把大块的二进制数据存储在数据库中。读取这些大块的数据&#xff0c;可以通过强制类型转换成为byte数组&#xff0c;但是当这个二进制数据体够大时&#xff08;几十兆或者上百兆&#xff09;&#xff0c;一次并不能获取到他的完整长度&#…

完美的优化目标,人工智能的盲点

来源&#xff1a;AI科技评论译者&#xff1a;辛西娅编辑&#xff1a;维克多人工智能&#xff08;AI&#xff09;系统的脆弱性一直被行业人员所诟病&#xff0c;稍微的数据错误就会使系统发生故障。例如在图像识别中&#xff0c;图片微小的像素改变&#xff0c;不会干扰人类视觉…

C#中创建对象的方式

C#中对象创建的方式 使用new 创建使用对象的MemberwiseClone使用工厂方法创建使用序列化和反序列化创建使用反射创建使用类型推导&#xff08;c# 3.0&#xff09; 另外c# 3.0 中增加了一种类型扩展方法。 转载于:https://www.cnblogs.com/zzj8704/archive/2008/08/05/1260848.h…

转:Some interesting facts about SharePoint 2007 Search

Some interesting facts about SharePoint 2007 Search Published 14 November 08 06:21 PM | harikumh Can we search in any language other than English? Do we need language pack for the same? Language Pack has nothing to do with search in languages other th…

宇宙和世界真的是虚拟的吗?

来源&#xff1a;数学中国 2021年元宇宙无疑成为科技领域最火爆的概念之一&#xff0c;扎克伯格曾表示未来脸书将从一家社交媒体公司转变为一家元宇宙公司&#xff0c;之后元宇宙这个词席卷了整个互联网与投资圈。在大多数人还搞不懂元宇宙是什么的时候&#xff0c;科技公司们已…

Web高效管理多个项目的SVN仓库

转至:https://www.jianshu.com/p/a0af00642585 采用方案 LinuxApacheSubversionMySQLJDKTomcatSvnadmin 目录 0.安装准备 0.1 升级系统软件包 0.2 关闭SELinux 0.3 安装wget 1.部署Apache 1.1 安装apache 1.2 修改配置文件 1.3 启动apache服务 1.4 调整防火墙&#xff0c;允许8…

粒子物理学有了新的基础数学理论

来源&#xff1a;科技日报科技日报柏林2月13日电 &#xff08;记者李山&#xff09;近日&#xff0c;来自奥地利和英国的科学家共同发表了一个粒子物理学的基础数学新理论。他们定义和研究了黎曼曲面上存在的非常稳定的希格斯丛&#xff0c;其蕴涵了全局幂零锥稳定分量的多重性…

01.MyBatis入门

MyBatis入门&#xff1a; 第一天接触Mybatis&#xff0c;总结一下入门案例的流程: 首先导入Mybatis的jar包和数据库的驱动包 1.创建数据表和实体类 2.创建一个表和实体类映射的xml配置文件&#xff0c;具体配置如下&#xff1a; 1 <?xml version"1.0" encoding&q…

2022年重大颠覆性科技创新趋势报告(完整版)

来源&#xff1a;点滴科技资讯未来智能实验室的主要工作包括&#xff1a;建立AI智能系统智商评测体系&#xff0c;开展世界人工智能智商评测&#xff1b;开展互联网&#xff08;城市&#xff09;大脑研究计划&#xff0c;构建互联网&#xff08;城市&#xff09;大脑技术和企业…

02.Mybatis的动态代理方式实现增删改查

动态代理的方式实现增删改查: 通过约定的方式定位sql语句 约定 > 配置文件 > 硬编码 约定的目标是省略掉通过硬编码的方式定位sql的代码&#xff0c;通过接口直接定位出sql语句,以下代码为通过硬编码的方法定位sql: 1      //读取conf.xml 配置文件2 Reader…

孙正义看未来30年:这个趋势,永远不会错(附完整PPT)

来源&#xff1a;大数据实验室 对于今后30年来讲&#xff0c;我认为现在是个很关键的时刻&#xff0c;尤其是在各位的人生当中。而且现在是一整个概念的转变&#xff0c;我们要包容这个概念的转变。我想先给大家看两张照片。这是美国纽约的第五大道&#xff0c;左边那张是1900年…

JavaScript每日学习日记(0)

8.10.2019 1.JavaScript能改变HTML内容、属性、样式&#xff0c;能隐藏或显示HTML元素。 2.JavaScript函数可以任意数量被放置在<body>、<head>部分中&#xff0c;但必须位于<script>与</script>标签之间。 3.脚本可放置于后缀为.js的外部文件中&#…

可视化解释11种基本神经网络架构

来源&#xff1a;海豚数据科学实验室标准&#xff0c;循环&#xff0c;卷积和自动编码器网络随着深度学习的飞速发展&#xff0c;已经创建了完整的神经网络体系结构主机&#xff0c;以解决各种各样的任务和问题。尽管有无数的神经网络架构&#xff0c;但对于任何深度学习工程师…