基于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来做.至 ...
随机推荐
- Centos6.5 安装zabbix3(收藏,非原创)
1.安装PHP Zabbix 3.0对PHP的要求最低为5.4,而CentOS6默认为5.3.3,完全不满足要求,故需要利用第三方源,将PHP升级到5.4以上,注意,不支持PHP7 rpm -ivh ...
- HDU_2604 矩阵快速幂 较难推的公式
一个排队问题,f代表女,m代表男,f和m出现的几率相等.问一个长为L的队伍不能出现 fmf 和 fff这样的串总共有多少种. 这个题目的公式递推略难啊...我看了别人博客才想明白原来是这么递推出来的. ...
- 图解kubernetes容器状态同步机制核心实现
在K8s中将Pod调度到某一台Node节点之后,后续的状态维护信息则是由对应机器上的kubelet进行维护,如何实时反馈本地运行状态,并通知apiserver则是设计的难点, 本节主要是通过感知Pod ...
- POJ 1860 Currency Exchange【bellman-Ford模板题】
传送门:http://poj.org/problem?id=1860 题意:给出每两种货币之间交换的手续费和汇率,求出从当前货币s开始交换回到s,能否使本金增多. 思路:bellman-Ford模板题 ...
- 吴裕雄--天生自然ShellX学习笔记:Shell echo命令
Shell 的 echo 指令与 PHP 的 echo 指令类似,都是用于字符串的输出.命令格式: echo string 您可以使用echo实现更复杂的输出格式控制. 1.显示普通字符串: echo ...
- UI Automation编程辅助工具Inspect的下载和使用
UIAutomation微软提供的UI自动化库,主要用AutomationElement类来表示UI 自动化目录树中的一个UI自动化元素,.NET Windows的窗体应用程序和WPF应用程序. In ...
- Ubuntu下查看硬盘分区UUID的方法&所有Linux目录樹
在Ubuntu中UUID的两种获取方法,至于UUID是什么,你可以大概理解为分区的标识符,像条形码那样. 在终端中输入下面的命令就可心查看到分区UUID了.命令1.sudo blkid 命令2.ls ...
- 利用 wave 库 对音频进行格式处理
import wave r = r"D:\沫沫酱 - 旧伤口.wav" # 一个.wav格式文件 with wave.open(r, "rb") as f: # ...
- Kafka、RabbitMQ、RocketMQ等消息中间件的介绍和对比
本博客强烈推荐: Java电子书高清PDF集合免费下载 https://www.cnblogs.com/yuxiang1/p/12099324.html 前言 在分布式系统中,我们广泛运用消息中间件进 ...
- 对Spring aware理解
aware翻译过来时就是意识到,我对他的理解就是spring的感知器.是不是很诡异这个名字起得^_^ 先来看看aware接口的结构 spring提供了许多的aware,Aware.java也只是做一个 ...