文章目录

  • 1.实验效果
  • 2.文件结构说明
  • 3.操作步骤
  • 4.代码下载
  • 5.服务端文件
  • 6.客户端文件
  • 7.前端文件

1.实验效果




成功发送文件和接收文件


2.文件结构说明


3.操作步骤

(1)首先运行其服务端,处于监听状态;
(2)在运行客户端,之后根据https://127.0.0.1:5000/sendFiles进入浏览器,之后就可以操作发送文件了。


4.代码下载

https://github.com/KeepTryingTo/flask-socket.git


5.服务端文件

import os
import cv2
import json
import socket
import threading
#读取文件的最大数
max_len=1024#端口号和IP地址
remote_PORT=5001
remote_IP='192.168.223.1'
remote_addr=(remote_IP,remote_PORT)# 绑定IP地址和端口号PORT
socket_Server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket_Server.bind(remote_addr)def Server_Recv_File(socket_Server):""":param socket: 服务端套接字:param root: 主窗口:return:"""while True:# 监听socket_Server.listen()print('正在监听来自客户端的消息......')socket, addr = socket_Server.accept()#获取客户端发送的消息头msg_header=socket.recv(max_len)if msg_header=='Gameover':socket.close()breakheader=json.loads(msg_header.decode('utf-8'))#输出客户端发送的消息头信息print(header)#保存接收文件的地方curr_path=os.getcwd()filename=curr_path+'\\recvFiles\\'+header['filename']+header['msg_type']get_file_Size=header['msg_len']file_size=0#输出文件名和文件大小print('文件名: {}'.format(filename))print('file_size: {}'.format(get_file_Size))recv_count=0#如果文件不存在则创建if os.path.exists(filename)==False:with open(filename,'wb') as fp:while file_size!=get_file_Size:message=socket.recv(max_len)fp.write(message)file_size+=len(message)print(file_size)recv_count+=1else:with open(filename, 'wb') as fp:while file_size != get_file_Size:message = socket.recv(max_len)fp.write(message)file_size += len(message)print(file_size)recv_count+=1print('接收次数: {}'.format(recv_count))print('接收完成...')if __name__=='__main__':print('Pycharm')disconnection=FalseServer_Recv_File(socket_Server)

6.客户端文件

import os
import json
import socket
from flask_wtf import FlaskForm
from flask_wtf.file import FileField
from flask_sqlalchemy import SQLAlchemy
from werkzeug.utils import secure_filename
from sqlalchemy import String,Column,Integer
from wtforms.validators import DataRequired,Length
from flask import request,redirect,url_for,Flask,render_template,flash
from wtforms import StringField,TelField,DateField,SubmitField,PasswordField#定义读取的最大文件数
max_len=1024app=Flask(__name__)
app.secret_key='files'class Config:SQLALCHEMY_DATABASE_URI='mysql+pymysql://root:root@127.0.0.1:3306/main'SQLALCHEMY_TRACK_MODIFICATIONS=Falseapp.config.from_object(Config)
mysql=SQLAlchemy(app)class FormFiles(FlaskForm):filename=FileField(label='传输文件',validators=[DataRequired()])submit=SubmitField(label='提交文件')# class FormText(FlaskForm):
#     endtext=StringField(label='结束符')
#     end = SubmitField(label='结束传输')# http://127.0.0.1:5000/sendFiles
@app.route('/sendFiles',methods=['POST','GET'])
def sendFiles():formfiles=FormFiles()if request.method=='POST':if formfiles.validate_on_submit():# 定义端口和IP地址remote_PORT = 5001remote_IP = '192.168.223.1'remote_addr = (remote_IP, remote_PORT)# 绑定端口号和IP地址Socket_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)Socket_socket.connect(remote_addr)if formfiles.filename.data!=None:filename=secure_filename(formfiles.filename.data.filename)name=filenameformfiles.filename.data.save('files/'+filename)#切分文件名和点后缀名filename = 'files/' + filenamefile,type_file=os.path.splitext(name)#获取文件大小file_Size=os.stat(filename).st_size#定义发送消息头msg_header={'filename':file,'msg_type':type_file,'msg_len':file_Size}msg_header_bytes=bytes(json.dumps(msg_header),encoding='utf-8')#当消息头的长度不满1024时,使用空格填充msg_header_bytes+=b''*(max_len-len(msg_header_bytes))#发送消息头Socket_socket.send(msg_header_bytes)file_len=0recv_count=0#发送的文件消息头大小print('msg_header_bytes: {}'.format(len(msg_header_bytes)))# 发送的文件大小print('file_size: {}'.format(file_Size))#发送文件的类型print('type_file: {}'.format(type_file))with open(filename,'rb') as fp:while file_len!=file_Size:message=fp.read(max_len)Socket_socket.send(message)file_len+=len(message)recv_count+=1flash(message='文件传输成功!')print('发送次数: {}'.format(recv_count))print('发送完毕!')else:# 发送结束消息print('结束文件传输')flash(message='文件传输结束!')endstr='Gameover'.encode('utf-8')Socket_socket.send(endstr)Socket_socket.close()return render_template('index.html',formfiles=formfiles)@app.route('/index',methods=['POST','GET'])
def index():formfiles=FormFiles()return render_template('index.html',formfiles=formfiles)if __name__ == '__main__':print('Pycharm')app.run(debug=True)# import os
# from torchstat import stat
# import torchvision.models as models
#
# model=models.shufflenet_v2_x1_0()
# stat(model,(3,224,224))

7.前端文件

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><style>body {position:relative;}.convery {position:relative;margin:auto;width:200px;height:200px;border:2px solid #000000;margin-top:100px;}.file {position:absolute;width:30px;height:20px;margin-top:30px;margin-left:50px;}.submit {position:absolute;width:35px;height:25px;margin-left:50px;margin-top:70px;}.end {position:absolute;width:200px;height:90px;margin-left:900px;margin-top:-25px;}h3 {margin-top:20px;margin-left:50px;}.flash {color:red;font-size:30px;margin:auto;margin-left:650px;}</style>
</head>
<body><div class="flash">{% with messages=get_flashed_messages()%}{% if messages %}{% for message in messages %}<div><p style="color:red">{{message}}</p></div>{% endfor %}{% endif%}{% endwith %}</div><form class="convery" action="http://127.0.0.1:5000/sendFiles" method="POST" enctype="multipart/form-data">{{formfiles.csrf_token()}}<h3>文件传输</h3><label class="file">{{formfiles.filename}}</label><label class="submit">{{formfiles.submit}}</label>
<!--        <label class="end">-->
<!--            {{formfiles.end}}-->
<!--        </label>-->
<!--        <button name="结束" value="Gameover"></button>--></form ></body>
</html>

flask和socket结合使用实现客户端向服务端发送文件相关推荐

  1. python中使用socket编程实现带有界面的客户端向服务端发送文件和下载文件

    一主界面: **二:发送文件界面:**首先需要开启发送文件服务端(这里需要注意的是每一次发送文件之前都需要开启一次服务端,因为我在这里将每一次发送文件之后就关闭了客户端和服务端之间的连接) 输出相关客 ...

  2. TCP:利用Socket编程技术实现客户端向服务端上传一个图片。

    问题: 利用Socket编程技术实现客户端向服务端上传一个图片的程序. 客户端: import java.io.*; import java.net.Socket;public class clien ...

  3. java服务器向客户端发消息_java一个简单的客户端向服务端发送消息

    java一个简单的客户端向服务端发送消息 客户端代码: package com.chenghu.tcpip; import java.io.IOException; import java.io.Ou ...

  4. 客户端从服务端下载文件的流程分析

    客户端从服务端下载文件的流程分析: 浏览器发送一个请求,请求访问服务器中的某个网页(如:down.php),该网页的代码如下. 服务器接受到该请求以后,马上运行该down.php文件 运行该文件的时候 ...

  5. QT中使用C++ socket通信(了解socket通信、socket的三次握手和四次挥手、socket函数说明、客户端与服务端的代码实例)

    一.TCP/IP协议四个抽象层: 二.socket位置 socket就在应用程序的传输层和应用层之间,传输层的底一层的服务提供给socket抽象层,socket抽象层再提供给应用层. 三.socket ...

  6. java网络编程Socket实现客户端向服务端发送信息

    (可按目录按需阅读,我一般会整理的比较细) 前置知识 java IO Socket 什么是socket?socket字面意思其实就是一个插口或者套接字,包含了源ip地址.源端口.目的ip地址和源端口. ...

  7. QTcpSocket客户端和服务端发送图片(或大文件)小Demo

    先看一下效果: 思路: 发图片.大文件与发短字符不大一样. 1.文件和图片通过TCP可能一次发不过去,可能要发很多次.所以我们在发送文件.数据.以及文字最好带上文件的大小. 2.图片转换成文件流的形式 ...

  8. java与C语言socket通信(C客户端java服务端)

    服务器端代码 MyServer.java import java.io.*; import java.net.*; import java.util.*;public class MyServer { ...

  9. java与C语言之间socket通信(java客户端 C服务端)

    直接贴代码 服务端C代码 server.c #include <stdio.h> #include <sys/types.h> #include <sys/socket. ...

最新文章

  1. bert速度提升fastbert
  2. VB中对AutoCAD图形对象进行缩放操作
  3. 微信分享无响应的解决
  4. scrum 开发方式学习笔记
  5. python汉字排序规则_Python 中文排序
  6. freecplus框架-日志文件操作
  7. HDU 2072 单词数
  8. android 日历 时间选择,Android--DatePicker和TimePicker(日历选择器与时间选择器)
  9. 撸.NET Core的正确姿势
  10. vue引入bootstrap.min.css报错:Cannot find module ./assets/css/bootstrap.min.css
  11. Ubuntu下用glade和GTK+开发C语言界面程序(三)——学习make的使用方法
  12. JavaEE Tutorials (9) - 运行持久化示例
  13. 数据加载中...请稍后(js一句代码)
  14. 与Amnon Shashua的1小时:详解Mobileye自动驾驶进阶之路...
  15. GO下载地址备份百度网盘
  16. CRLF、CR、LF详解
  17. 数学分析教程(科大)——1.12笔记+习题
  18. [渝粤教育] 西南科技大学 英语词汇学 在线考试复习资料
  19. Redis知识点整理(详讲)
  20. 给 Java 初学者的学习路线建议

热门文章

  1. 子网划分的两种方法(详细步骤)
  2. 山东大学计算机组成与设计实验五 四位补码运算器
  3. fstab的理解与e2label
  4. plt.savefig()保存到本地的图片上下左右会有白边
  5. nginx 二十分钟入门
  6. 懒人的文件分类整理神器:归类所有文件素材
  7. 【微信公众号开发方案书】项目管理计划
  8. Electron 打包exe方法
  9. 0-1背包算法和完全背包算法MATLAB代码实现
  10. 【PARROT ANAFI】无人机仿真(一)——在Ubuntu18.04完成Olympe+Sphinx配置