python网络编程(通过tcp或者udp协议通信)
1、基于tcp协议传送文件:
客户端:
import socket
import os
import json
import struct
client = socket.socket()
client.connect(('127.0.0.1',8080)) # 文件大小
file_size = os.path.getsize(r'F:\老男孩Python7期\day32\视频\02TCP发送大文件.mp4') # 文件名字
file_name = 'TCP发送大文件.mp4'
# 定义一个字典
d = {
'file_name':file_name,
'file_size':file_size
}
data_pytes = json.dumps(d).encode('utf-8')
# 制作报头
header = struct.pack('i',len(data_pytes))
# 发送报文
client.send(header)
# 发送字典
client.send(data_pytes)
# 发送真实数据
with open(r'F:\老男孩Python7期\day32\视频\02TCP发送大文件.mp4','rb') as f:
for lie in f:
client.send(lie)
服务端:
import socket
import struct
import json
import os server = 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)
# 解析报头,获取长度
header_len = struct.unpack('i',header)[0]
print('长度为'+header_len)
# 接收字典,其中header_len显示为接收内容的长度
header_bytes = conn.recv(header_len)
header_dic = json.loads(header_bytes.decode('utf-8'))
print(header_dic)
# 根据字典中的key获取对应的value
file_name = header_dic['file_name']
file_size = header_dic['file_size']
resc_size = 0
# 文件操作
with open(file_name,'wb') as f:
while resc_size <file_size:
data = conn.recv(1024)
f.write(data)
resc_size += len(data)
except ConnectionRefusedError:
break
conn.close() 2、UDP协议通信(由于没有双通道,不会出现沾包、客户端中断或者服务端中断不影响、客户端可以发空内容)
客户端:
import socket client = socket.socket(type=socket.SOCK_DGRAM)
service_addr =('127.0.0.1',8080)
while True:
msg = input('输入要发送的消息:')
msg = '客户发送的消息:%s' % msg
client.sendto(msg.encode('utf-8'),service_addr)
data,addr = client.recvfrom(1024)
print(data.decode('utf-8'))
print(addr)
服务端:
import socket service = socket.socket(type=socket.SOCK_DGRAM)
service.bind(('127.0.0.1',8080))
while True:
msg,addr = service.recvfrom(1024)
print(msg.decode('utf-8'))
print(addr)
data = input('请输入回复消息:').encode('utf-8')
service.sendto(data,addr) 基于sockerServer模块下tcp和udp高并发通讯
这里的高并发并不是真正意义上的高并发,是看起来像是同时运行的就成为并发
# 注意事项:udp在测试高并发的时候不要默认循环测试,最好使用客户端使用一些io操作,不然会出现卡死现象 1、基于tcp的sockerServer模块使用 客户端:
import socket client = socket.socket()
client.connect(('127.0.0.1',8080))
while True:
msg = input('请输入要发送的消息:').encode('utf-8')
client.send(msg)
data = client.recv(1024)
print(data.decode('utf-8'))
服务端:
import socketserver
class Mybaby(socketserver.BaseRequestHandler):
def handle(self):
while True:
data = self.request.recv(1024)
print(data.decode('utf-8'))
msg = input('请输入要发送的消息:').encode('utf-8')
self.request.send(msg)
if __name__ == '__main__':
server = socketserver.ThreadingTCPServer(('127.0.0.1',8080),Mybaby)
server.serve_forever() 2、基于UDP通信
客户端:
import socket
import time
client = socket.socket(type=socket.SOCK_DGRAM)
service_addr = ('127.0.0.1', 8080)
while True:
client.sendto(b'hello world',service_addr)
data, addr = client.recvfrom(1024)
print(data)
print(addr)
time.sleep(2)
服务端:
import socketserver class MyBaby(socketserver.BaseRequestHandler):
def handle(self):
while True:
data,sock = self.request
print(data)
print(self.client_address)
sock.sendto(data,self.client_address)
if __name__ == '__main__':
server = socketserver.ThreadingUDPServer(('127.0.0.1',8080),MyBaby)
server.serve_forever()
总结: 1、为什么会出现粘包现象?
只有在tcp协议中才会出现粘包现象,因为tcp协议是流式协议
特点是将数据量比较小且间隔时间短的数据一次性打包发送出去,本质还是因为我们不知道需要接收数据的长短。
2、怎么解决粘包?
1、发送数据先告诉对方数据量的大小
2、利用struct模块定制自己的消息传输协议
UDP协议:
1、udp协议客户端允许发空内容。
2、udp协议不会出现粘包。
3、udp协议服务端不存在的情况下,客户端照样不会报错。
4、udp协议支持并发。
udp协议叫数据协议,发消息接收消息都带有报头
upd的service不需要监听也不需要建立连接
在启动服务后只能被动的等待客户端发送消息过来,客户端发送消息过来的时候,带上服务端的地址,服务端回复消息的时候,也到带上客户端的地址。
并发编程:
多道技术的产生:
解决cpu在执行程序,遇到io时,cpu不干活的情况
串行:一个程序完完整整的运行完毕,才能运行下一个程序。
并发:看上去像是同时运行。
多道技术:
空间上的复用(多个程序共用一套硬件设别,它是多道技术实现时间上的复用的基础。)
时间上的复用(单个cpu的电脑上,起多个应用程序,cpu快速切换,给人的感觉是同时运行)
一个任务占用cpu时间过长或被操作系统强行剥夺走cpu的执行权限(比起串行效率而降低)
一个任务执行过程中遇到io操作(等待时间),也会被操作系统强行剥夺cpu的执行权限(比串行效率高)
python网络编程(通过tcp或者udp协议通信)的更多相关文章
- 《Python网络编程》学习笔记--UDP协议
第二章中主要介绍了UDP协议 UDP协议的定义(转自百度百科) UDP是OSI参考模型中一种无连接的传输层协议,它主要用于不要求分组顺序到达的传输中,分组传输顺序的检查与排序由应用层完成,提供面向事务 ...
- python网络编程05 /TCP阻塞机制
python网络编程05 /TCP阻塞机制 目录 python网络编程05 /TCP阻塞机制 1.什么是拥塞控制 2.拥塞控制要考虑的因素 3.拥塞控制的方法: 1.慢开始和拥塞避免 2.快重传和快恢 ...
- Linux 系统编程 学习:07-基于socket的网络编程2:基于 UDP 的通信
Linux 系统编程 学习:07-基于socket的网络编程2:基于 UDP 的通信 背景 上一讲我们介绍了网络编程的一些概念.socket的网络编程的有关概念 这一讲我们来看UDP 通信. 知识 U ...
- 【网络编程1】网络编程基础-TCP、UDP编程
网络基础知识 网络模型知识 OSI七层模型:(Open Systems Interconnection Reference Model)开放式通信系统互联参考模型,是国际标准化组织(ISO)提出的一个 ...
- 网络编程:tcp、udp、socket、struct、socketserver
一.TCP.UDP 一.ARP(Address Resolution Protocol)即地址解析协议,用于实现从 IP 地址到 MAC 地址的映射,即询问目标IP对应的MAC地址. 二.在网络通信中 ...
- python socket 编程(TCP与UDP)
实验环境:python2 一.TCP编程 1.建立TCP服务器 ①创建TCPServer.py文件 ②编写服务器代码 1)创建socket对象,调用socket构造函数 2)绑定ip端口(IP号和端口 ...
- 2015/12/14 Python网络编程,TCP/IP客户端和服务器初探
一直不是很清楚服务器的定义,对于什么是服务器/客户端架构也只有一个模糊的感觉.最近开始学习,才明白一些什么服务器和客户端的关系. 所谓的服务器,就是提供服务的东西,它是一个硬件或者软件,可以向一个或者 ...
- android 网络编程--socket tcp/ip udp http之间的关系
网络七层由下往上分别为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层,一般编程人员接触最多的就是应用层和运输层,再往下的就是所谓的媒体层了,不是我们研究的对象. 下面是应用层.运输层,网络 ...
- python网络编程(TCP/IP、发邮件)
TCP/IP 关注公众号"轻松学编程"了解更多. 计算机为了联网,就必须规定通讯协议,早期的计算机网络是由各个厂商规定的一些协议,他们之间互不兼容. 为了把全世界的电脑能够连接到一 ...
随机推荐
- ESXI | ESXI6.7如何在网页端添加用户并且赋予不同的权限
一.首先添加一个用户 管理---用户---安全和用户 添加的新用户会显示在下面 二.给添加上的用户赋予对应权限(我这里演示赋予的是只读权限) 主机---操作---权限 三.测试登录 当用只赋予了只读权 ...
- 【Thread】java线程之对象锁、类锁、线程安全
说明: 1.个人技术也不咋滴.也没在项目中写过线程,以下全是根据自己的理解写的.所以,仅供参考及希望指出不同的观点. 2.其实想把代码的github贴出来,但还是推荐在初学的您多亲自写一下,就没贴出来 ...
- 一道有趣的for循环题
一道有趣的for循环题 今天在复习js基础知识时发现了一个for循环的题,第一眼看到直接懵逼了,没想到for循环竟然还可以这样玩?涨姿势了. 题目是这样的 for(i=0, j=0; i<10, ...
- windows密码抓取工具-mimikatz
前言 介绍一下windows的密码hash值的组成: Windows系统下的hash密码格式为:用户名称:RID:LM-HASH值:NT-HASH值,例如: Administrator::C8825D ...
- Wannafly Winter Camp 2020 Day 5J Xor on Figures - 线性基,bitset
有一个\(2^k\cdot 2^k\) 的全零矩阵 \(M\),给出 \(2^k\cdot 2^k\) 的 \(01\) 矩阵 \(F\),现在可以将 \(F\) 的左上角置于 \(M\) 的任一位置 ...
- python3练习100题——054
题目:取一个整数a从右端开始的4〜7位. a=input('please input a num:') print(a[-7:-3])
- Django生成脚本迁移文件时,报错django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3.
一.本人环境:django:3.0.2, python:3.8.1, pymysql:0.9.3 二.解决步骤: 1.django目录下找到 base.py文件: 2.在base.py文件中注释以下 ...
- java - GC垃圾收集器详解(三)
以前收集器的特点 年轻代和老年代是各自独立且连续的内存块 年轻代收集必须使用单个eden+S0+S1进行复制算法 老年代收集扫描整个老年代区域 都是以尽可能少而快速地执行GC为设计原则 G1是什么 G ...
- babel plugin
a = () => {}, // Support for the experimental syntax 'classProperties' isn't currently enabled ya ...
- SKlearn | 学习总结
1 简介 scikit-learn,又写作sklearn,是一个开源的基于python语言的机器学习工具包.它通过NumPy, SciPy和Matplotlib等python数值计算的库实现高效的算法 ...