基于TCP的大文件发送、UDP、socketserver
基于TCP的大文件发送
#server服务端
import struct
import json
import os
import socket server = socket.socket() # 默认TCP协议
server.bind(('127.0.0.1',8080)) # 传入IP和端口
server.listen(5) # 限制半连接池的数量 while True:
conn,addr = server.accept() # conn是连接,addr是地址,accept就是阻塞,等待一下,等客户端连接
while True:
try:
header_dict = conn.recv(4) # 接收一个字典的报头
dict_size = struct.unpack('i',header_dict)[0] # 解包得到字典的长度
dict_bytes = conn.recv(dict_size) # 接收一个字典
dict_json = json.loads(dict_bytes.decode('utf-8')) # 将字典解码并反序列化
total_size = dict_json.get('file_size') #拿出字典中真实数据的大小
recv_size = 0
with open(dict_json.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)
break
conn.close() # 关闭客户端套接字
#client客户端
import socket
import struct
import json
import os client = socket.socket()
client.connect(('127.0.0.1',8080))
while True:
MOVIE_DIR = r'D:\Program Files\feiq\work\untitled\work\sp' # 找到文件路径
movie_list = os.listdir(MOVIE_DIR) # 将文件夹下的文件名放到列表里
for i,movie in enumerate(movie_list,1): # 给列表中的文件名加上序号,从1开始
print(i,movie)
choice = input('请输入电影序号>>>:')
if choice.isdigit():
choice = int(choice) - 1
if choice in range(0,len(movie_list)):
path = movie_list[choice] # 根据用户的选择,拿到文件名
file_path = os.path.join(MOVIE_DIR,path) # 拼接文件名的路径
file_size = os.path.getsize(file_path) # 获得该文件的大小
res_d = {
'file_name':path,
'file_size':file_size,
'msg':'注意身体健康'
} # 将文件名,大小以及一些其他信息存放在字典里
json_d = json.dumps(res_d) # 将字典转换成json格式的数据
json_bytes = json_d.encode('utf-8') # 将这个数据变成二进制
header = struct.pack('i',len(json_bytes)) # 打包一个报头,报头的内容是字典的长度
client.send(header) # 发送一个报头
client.send(json_bytes) # 发送这个字典
with open(file_path,'rb') as f: # 找到给文件并准备发送
for line in f:
client.send(line) # 循环取出数据并发送
else:
print('not in range')
else:
print('must be a number')
UDP通信
特点:数据报协议(自带报头),没有双向通道,通信过程类似于发短信。
1.udp协议客户端允许发空
2.udp协议不会粘包
3.udp协议支持并发
***允许发空和不会粘包的原因都是因为基于数据报协议,自带了报头
UDP协议的基本使用:
#服务端
import socket server = 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 socket client = socket.socket(type=socket.SOCK_DGRAM)
# 不需要建立连接,直接进入通信循环
server_address = ('127.0.0.1',8080)
while True:
client.sendto(b'hello',server_address)
data,addr = client.recvfrom(1024)
print('服务端发来的数据',data)
print('服务端的地址',addr)
简易版本的QQ
#服务端:
import socket server = 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) #客户端:
import socket client = socket.socket(type=socket.SOCK_DGRAM)
server_address = ('127.0.0.1',8080) while True:
msg = input('>>>:')
res = '来自客户端1的消息:%s'%msg
client.sendto(res.encode('utf-8'),server_address)
data,server_addr = client.recvfrom(1024)
print(data.decode('utf-8'))
利用socketserver完成并发
#服务器
import socketserver class MyServer(socketserver.BaseRequestHandler):
def handle(self):
while True:
data, sock = self.request
print(self.client_address) # 客户端地址
print(data.decode('utf-8'))
sock.sendto(data.upper(), self.client_address) if __name__ == '__main__':
"""只要有客户端连接,会自动交给自定义类中的handl方法去处理"""
server = socketserver.ThreadingUDPServer(('127.0.0.1',8080), MyServer)
server.serve_forever() # 启动该服务对象 #客户端
import socket
import time client = socket.socket(type=socket.SOCK_DGRAM)
server_address = ('127.0.0.1',8080) while True:
client.sendto(b'hello',server_address)
data,addr = client.recvfrom(1024)
print(data.decode('utf-8'),addr)
time.sleep(1) # 睡眠1秒,让服务端有反馈的时间
并发:看起来像同时运行的
并行:真正意义上的同时运行
基于TCP的大文件发送、UDP、socketserver的更多相关文章
- Linux Linux程序练习十一(网络编程大文件发送UDP版)
//网络编程发送端--大文件传输(UDP) #include <stdio.h> #include <stdlib.h> #include <string.h> # ...
- (网络编程)基于tcp(粘包问题) udp协议的套接字通信
import socket 1.通信套接字(1人1句)服务端和1个客户端 2.通信循环(1人多句)服务端和1个客户端 3.通信循环(多人(串行)多句)多个客户端(服务端服务死:1个客户端---&g ...
- TCP大文件发送案例以及UDP介绍
基于TCP的大文件发送 #server服务端 import struct import json import os import socket server = socket.socket() # ...
- 基于TCP协议的大文件传输(粘包问题处理)
基于TCP的大文件上传服务端实现 # 服务端 # -*- coding: utf-8 -*- from socket import * import json, struct server = soc ...
- 网络编程----socket介绍、基于tcp协议的套接字实现、基于udp协议的套接字实现
一.客户端/服务器架构(C/S架构) 即C/S架构,包括: 1.硬件C/S架构(打印机) 2.软件C/S架 ...
- 基于TCP和UDP的socket
为什么学习socket 你自己现在完全可以写一些小程序了,但是前面的学习和练习,我们写的代码都是在自己的电脑上运行的,虽然我们学过了模块引入,文件引入import等等,我可以在程序中获取到另一个文件的 ...
- 基于tcp/udp的协议
使用TCP协议的常见端口主要有以下几种: (1) FTP:定义了文件传输协议,使用21端口.常说某某计算机开了FTP服务便是启动了文件传输服务.下载文件,上传主页,都要用到FTP服务. (2) Tel ...
- Day9 基于TCP的套接字和基于UDP的套接字
服务端: ss=socket() #创建服务器套接字 ss.bind() #把地址绑定到套接字 ss.listen() #监听套接字, inf_loop: #服务器无限循环 cs=ss.accept( ...
- Nginx基于TCP/UDP端口的四层负载均衡(stream模块)配置梳理
通过我们会用Nginx的upstream做基于http/https端口的7层负载均衡,由于Nginx老版本不支持tcp协议,所以基于tcp/udp端口的四层负载均衡一般用LVS或Haproxy来做.至 ...
随机推荐
- 当我们进行综合和I/O布局后会发生什么QwQ
基于的平台是Vivado 2018.2 本文主要以一个简单的半加器加器(组合逻辑为例)学习vivado的综合,I/O配置的一些内容. 本人小白,记一些自己的理解. 任务: 分析Log文件. 布局I/O ...
- MySQL--InnoDB 关键特性
插入缓冲 Insert Buffer 对于非聚集索引的插入或更新操作,不是每一次直接插入到索引页中,而是先判断插入的非聚集索引页是否在缓冲池中,若在,则直接插入:若不在,则先放入到一个 Insert ...
- Linux(CENTOS7) Tomcat服务成功发布但局域网浏览器无法访问
问题 : 我在linux搭建了一个tomcat服务器,tomcat开启后,发现在局域网浏览器上无法访问该tomcat,浏览器报无法访问服务器错误,我查看了tomcat的日志,路径..../tomcat ...
- h5-语义化标签的兼容性问题
1.html代码 <header>头</header> <nav>导航栏</nav> <main> <article>左< ...
- 2019杭电暑假多校训练 第六场 Snowy Smile HDU - 6638
很多题解都是简单带过,所以打算自己写一篇,顺便也加深自己理解 前置知识:线段树.线段树维护最大字段和.二维坐标离散化 题解: 1.很容易想到我们需要枚举所有子矩阵来得到一个最大子矩阵,所以我们的任务是 ...
- Python爬虫连载2-reponse\parse简介
一.reponse解析 urlopen的返回对象 (1)geturl:返回网页地址 (2)info:请求反馈对象的meta信息 (3)getcode:返回的http code from urllib ...
- beta函数与置信度估计
可信度的估计 二项分布中的\(p\) 服从Beta分布 $ {\rm beta}(\alpha, \beta)$, 密度函数 \(\frac1{B(\alpha, \beta)} x^{\alpha- ...
- Sort - Merge Sort
归并排序思想 归并排序时间复杂度分析 归并排序特点 归并排序实现 递归 #include <iostream> using namespace std; void merge(int *a ...
- RegressionTree(回归树)
1.概述 回归树就是用树模型做回归问题,每一片叶子都输出一个预测值.预测值一般是该片叶子所含训练集元素输出的均值, 即
- 初识API网关,API-gateway
1.API-gateway(含义) 所有API的调用统一接入API网关层,由网关层负责接入和输出. API Gateway是一个服务器,也可以说是进入系统的唯一节点.这跟面向对象设计模式中的Facad ...