鱼C论坛

 找回密码
 立即注册
查看: 3619|回复: 26

求指点!怎么用python代码开启HTTP server?

[复制链接]
发表于 2021-6-21 20:32:27 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 曼查克 于 2021-6-25 17:33 编辑

怎么用python代码开启HTTP server?(不要在terminal输指令执行,直接脚本实现的那种!!!)
想要接收请求,处理数据,用哪些工具比较好?


20210623
现在用的是flask的app.run开启的服务,适合用于开发不适合生产。
我的需求是几十台客户端同时请求,但是数据比较多,而且都是通过同一个路由处理的。
为了避免堵住,希望处理数据的部分由子线程来做。
不知道怎么实现?

希望利用现成的框架来实现。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-21 20:44:32 From FishC Mobile | 显示全部楼层
做bs吗,python可以配合flask
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-22 09:19:03 | 显示全部楼层
看你要什么类型的啊,自己创建一个http框架, 运行就是一个HTTP了, 如果是要运行别人的另外看代码,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-22 09:21:56 | 显示全部楼层
z5560636 发表于 2021-6-22 09:19
看你要什么类型的啊,自己创建一个http框架, 运行就是一个HTTP了, 如果是要运行别人的另外看代码,

需求是这样的:
开启HTTP服务,接收客户端发送的json信息,处理。
最好支持多线程。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-22 09:24:11 | 显示全部楼层
wp231957 发表于 2021-6-21 20:44
做bs吗,python可以配合flask

就简单做个server,处理客户端发送的信息。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-22 09:44:20 From FishC Mobile | 显示全部楼层
曼查克 发表于 2021-6-22 09:24
就简单做个server,处理客户端发送的信息。

小型服务器python+flask
或者nodejs
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-22 18:54:00 | 显示全部楼层
wp231957 发表于 2021-6-22 09:44
小型服务器python+flask
或者nodejs

谢谢,flask了解了,但是好像只能开启开发测试服务,能不能开更适合生产使用的,可分配线程的服务呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-22 18:55:35 From FishC Mobile | 显示全部楼层
曼查克 发表于 2021-6-22 18:54
谢谢,flask了解了,但是好像只能开启开发测试服务,能不能开更适合生产使用的,可分配线程的服务呢?

如果是单位几十台局域网用的话,flask也是可以的,至于你说的多线程是啥意思呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-22 19:00:06 | 显示全部楼层
wp231957 发表于 2021-6-22 18:55
如果是单位几十台局域网用的话,flask也是可以的,至于你说的多线程是啥意思呢

几十台够了;多线程的意思是,每个客户端都会发送不少数据,然后服务端来处理,接收一个处理一个的话会有问题吧?所以考虑接收到数据后处理的部分交给子线程做。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-22 19:02:46 From FishC Mobile | 显示全部楼层
曼查克 发表于 2021-6-22 19:00
几十台够了;多线程的意思是,每个客户端都会发送不少数据,然后服务端来处理,接收一个处理一个的话会有 ...

你方便描述一下你的具体业务吗,是否涉及数据库
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-22 19:04:32 | 显示全部楼层
wp231957 发表于 2021-6-22 19:02
你方便描述一下你的具体业务吗,是否涉及数据库

不涉及数据库。客户端发送json文件,内容是图片编码。服务端同时接收多台客户端发送的json处理并保存。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-22 19:28:40 From FishC Mobile | 显示全部楼层
曼查克 发表于 2021-6-22 19:04
不涉及数据库。客户端发送json文件,内容是图片编码。服务端同时接收多台客户端发送的json处理并保存。

我没做过这方面的东西,没有话语权
不过我搜了一下,flask也能处理高并发,多线程的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-22 22:33:06 | 显示全部楼层
我有现成的代码你要吗,socket 原生的服务器,我可以把框架代码给你。你自己写功能。前提是你得懂http协议。(我自己写的框架)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-23 09:08:16 | 显示全部楼层
nahongyan1997 发表于 2021-6-22 22:33
我有现成的代码你要吗,socket 原生的服务器,我可以把框架代码给你。你自己写功能。前提是你得懂http协议 ...

方便嘛,才初步接触web,对http有简单了解,有机会学习一下也好~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-23 09:22:17 | 显示全部楼层
曼查克 发表于 2021-6-23 09:08
方便嘛,才初步接触web,对http有简单了解,有机会学习一下也好~

  你搞复杂了,   http 服务器都是多线程的,  并不是你一个页面访问,就把后端挂死在函数里面了。  如果你对数据并发有很高的要求,可是试试 python FastAPI 框架,每秒1W条数据,还是轻轻松松的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-23 09:47:01 | 显示全部楼层
曼查克 发表于 2021-6-23 09:08
方便嘛,才初步接触web,对http有简单了解,有机会学习一下也好~

global_control.py
from time import sleep
from time import localtime
from subprocess import STARTUPINFO,CREATE_NEW_CONSOLE,STARTF_USESHOWWINDOW,SW_HIDE
from file_process import File

down_speed_list = {}
up_speed_list = {}

transmitting = []
request_method = {}

input_check = False           # 子线程占用输入框检查
global_input_content = None   # 子线程获取到的数据

first_sign = 0                # 首次开启标记
cloud_pid = None              # 主线程pid
process_pids = []             # 所有开启的进程的pid
base_dir = None               # 程序根目录
time = None                   # 当前时间(使用time.localtime获取)

file_open_return = None

ai_message = None             # 向主窗口发送的信息
main_window = None            # 主窗口状态

break_program = False         # 全部中断检测
break_program_number = []     # 要打断的程序 

PROGRESS_BAR = {'RedProgressBar': "QProgressBar  {   border: 1px solid white; border-radius: 2px;} QProgressBar::chunk {background-color: #ff0000;}",
                'YellowProgressBar': "QProgressBar {  border: 1px solid white; border-radius: 2px;} QProgressBar::chunk {background-color: #F4ECA3;}",
                'GreenProgressBar': "QProgressBar {  border: 1px solid white; border-radius: 2px;} QProgressBar::chunk {background-color: #009688;}"}



response_status = {'200':'HTTP/1.1 200 OK',
                   '201':'HTTP/1.1 201 Created',
                   '206':'HTTP/1.1 206 Partial Content',
                   '404':'HTTP/1.1 404 Page Not Found',
                   '403':'HTTP/1.1 403 Forbidden'}

CONTENT_TYPE = {
'.load': 'text/html',
'.123': 'application/vnd.lotus-1-2-3',
'.3ds': 'image/x-3ds',
'.3g2': 'video/3gpp',
'.3ga': 'video/3gpp',
'.3gp': 'video/3gpp',
'.3gpp': 'video/3gpp',
'.602': 'application/x-t602',
'.669': 'audio/x-mod',
'.7z': 'application/x-7z-compressed',
'.a': 'application/x-archive',
'.aac': 'audio/mp4',
'.abw': 'application/x-abiword',
'.abw.crashed': 'application/x-abiword',
'.abw.gz': 'application/x-abiword',
'.ac3': 'audio/ac3',
'.ace': 'application/x-ace',
'.adb': 'text/x-adasrc',
'.ads': 'text/x-adasrc',
'.afm': 'application/x-font-afm',
'.ag': 'image/x-applix-graphics',
'.ai': 'application/illustrator',
'.aif': 'audio/x-aiff',
'.aifc': 'audio/x-aiff',
'.aiff': 'audio/x-aiff',
'.al': 'application/x-perl',
'.alz': 'application/x-alz',
'.amr': 'audio/amr',
'.ani': 'application/x-navi-animation',
'.anim[1-9j]': 'video/x-anim',
'.anx': 'application/annodex',
'.ape': 'audio/x-ape',
'.arj': 'application/x-arj',
'.arw': 'image/x-sony-arw',
'.as': 'application/x-applix-spreadsheet',
'.asc': 'text/plain',
'.asf': 'video/x-ms-asf',
'.asp': 'application/x-asp',
'.ass': 'text/x-ssa',
'.asx': 'audio/x-ms-asx',
'.atom': 'application/atom+xml',
'.au': 'audio/basic',
'.avi': 'video/x-msvideo',
'.aw': 'application/x-applix-word',
'.awb': 'audio/amr-wb',
'.awk': 'application/x-awk',
'.axa': 'audio/annodex',
'.axv': 'video/annodex',
'.bak': 'application/x-trash',
'.bcpio': 'application/x-bcpio',
'.bdf': 'application/x-font-bdf',
'.bib': 'text/x-bibtex',
'.bin': 'application/octet-stream',
'.blend': 'application/x-blender',
'.blender': 'application/x-blender',
'.bmp': 'image/bmp',
'.bz': 'application/x-bzip',
'.bz2': 'application/x-bzip',
'.c': 'text/x-csrc',
'.c++': 'text/x-c++src',
'.cab': 'application/vnd.ms-cab-compressed',
'.cb7': 'application/x-cb7',
'.cbr': 'application/x-cbr',
'.cbt': 'application/x-cbt',
'.cbz': 'application/x-cbz',
'.cc': 'text/x-c++src',
'.cdf': 'application/x-netcdf',
'.cdr': 'application/vnd.corel-draw',
'.cer': 'application/x-x509-ca-cert',
'.cert': 'application/x-x509-ca-cert',
'.cgm': 'image/cgm',
'.chm': 'application/x-chm',
'.chrt': 'application/x-kchart',
'.class': 'application/x-java',
'.cls': 'text/x-tex',
'.cmake': 'text/x-cmake',
'.cpio': 'application/x-cpio',
'.cpio.gz': 'application/x-cpio-compressed',
'.cpp': 'text/x-c++src',
'.cr2': 'image/x-canon-cr2',
'.crt': 'application/x-x509-ca-cert',
'.crw': 'image/x-canon-crw',
'.cs': 'text/x-csharp',
'.csh': 'application/x-csh',
'.css': 'text/css',
'.cssl': 'text/css',
'.csv': 'text/csv',
'.cue': 'application/x-cue',
'.cur': 'image/x-win-bitmap',
'.cxx': 'text/x-c++src',
'.d': 'text/x-dsrc',
'.dar': 'application/x-dar',
'.dbf': 'application/x-dbf',
'.dc': 'application/x-dc-rom',
'.dcl': 'text/x-dcl',
'.dcm': 'application/dicom',
'.dcr': 'image/x-kodak-dcr',
'.dds': 'image/x-dds',
'.deb': 'application/x-deb',
'.der': 'application/x-x509-ca-cert',
'.desktop': 'application/x-desktop',
'.dia': 'application/x-dia-diagram',
'.diff': 'text/x-patch',
'.divx': 'video/x-msvideo',
'.djv': 'image/vnd.djvu',
'.djvu': 'image/vnd.djvu',
'.dng': 'image/x-adobe-dng',
'.doc': 'application/msword',
'.docbook': 'application/docbook+xml',
'.docm': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'.docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'.dot': 'text/vnd.graphviz',
'.dsl': 'text/x-dsl',
'.dtd': 'application/xml-dtd',
'.dtx': 'text/x-tex',
'.dv': 'video/dv',
'.dvi': 'application/x-dvi',
'.dvi.bz2': 'application/x-bzdvi',
'.dvi.gz': 'application/x-gzdvi',
'.dwg': 'image/vnd.dwg',
'.dxf': 'image/vnd.dxf',
'.e': 'text/x-eiffel',
'.egon': 'application/x-egon',
'.eif': 'text/x-eiffel',
'.el': 'text/x-emacs-lisp',
'.emf': 'image/x-emf',
'.emp': 'application/vnd.emusic-emusic_package',
'.ent': 'application/xml-external-parsed-entity',
'.eps': 'image/x-eps',
'.eps.bz2': 'image/x-bzeps',
'.eps.gz': 'image/x-gzeps',
'.epsf': 'image/x-eps',
'.epsf.bz2': 'image/x-bzeps',
'.epsf.gz': 'image/x-gzeps',
'.epsi': 'image/x-eps',
'.epsi.bz2': 'image/x-bzeps',
'.epsi.gz': 'image/x-gzeps',
'.epub': 'application/epub+zip',
'.erl': 'text/x-erlang',
'.es': 'application/ecmascript',
'.etheme': 'application/x-e-theme',
'.etx': 'text/x-setext',
'.exe': 'application/x-ms-dos-executable',
'.exr': 'image/x-exr',
'.ez': 'application/andrew-inset',
'.f': 'text/x-fortran',
'.f90': 'text/x-fortran',
'.f95': 'text/x-fortran',
'.fb2': 'application/x-fictionbook+xml',
'.fig': 'image/x-xfig',
'.fits': 'image/fits',
'.fl': 'application/x-fluid',
'.flac': 'audio/x-flac',
'.flc': 'video/x-flic',
'.fli': 'video/x-flic',
'.flv': 'video/x-flv',
'.flw': 'application/x-kivio',
'.fo': 'text/x-xslfo',
'.for': 'text/x-fortran',
'.g3': 'image/fax-g3',
'.gb': 'application/x-gameboy-rom',
'.gba': 'application/x-gba-rom',
'.gcrd': 'text/directory',
'.ged': 'application/x-gedcom',
'.gedcom': 'application/x-gedcom',
'.gen': 'application/x-genesis-rom',
'.gf': 'application/x-tex-gf',
'.gg': 'application/x-sms-rom',
'.gif': 'image/gif',
'.glade': 'application/x-glade',
'.gmo': 'application/x-gettext-translation',
'.gnc': 'application/x-gnucash',
'.gnd': 'application/gnunet-directory',
'.gnucash': 'application/x-gnucash',
'.gnumeric': 'application/x-gnumeric',
'.gnuplot': 'application/x-gnuplot',
'.gp': 'application/x-gnuplot',
'.gpg': 'application/pgp-encrypted',
'.gplt': 'application/x-gnuplot',
'.gra': 'application/x-graphite',
'.gsf': 'application/x-font-type1',
'.gsm': 'audio/x-gsm',
'.gtar': 'application/x-tar',
'.gv': 'text/vnd.graphviz',
'.gvp': 'text/x-google-video-pointer',
'.gz': 'application/x-gzip',
'.h': 'text/x-chdr',
'.h++': 'text/x-c++hdr',
'.hdf': 'application/x-hdf',
'.hh': 'text/x-c++hdr',
'.hp': 'text/x-c++hdr',
'.hpgl': 'application/vnd.hp-hpgl',
'.hpp': 'text/x-c++hdr',
'.hs': 'text/x-haskell',
'.htm': 'text/html',
'.html': 'text/html',
'.hwp': 'application/x-hwp',
'.hwt': 'application/x-hwt',
'.hxx': 'text/x-c++hdr',
'.ica': 'application/x-ica',
'.icb': 'image/x-tga',
'.icns': 'image/x-icns',
'.ico': 'image/vnd.microsoft.icon',
'.ics': 'text/calendar',
'.idl': 'text/x-idl',
'.ief': 'image/ief',
'.iff': 'image/x-iff',
'.ilbm': 'image/x-ilbm',
'.ime': 'text/x-imelody',
'.imy': 'text/x-imelody',
'.ins': 'text/x-tex',
'.iptables': 'text/x-iptables',
'.iso': 'application/x-cd-image',
'.iso9660': 'application/x-cd-image',
'.it': 'audio/x-it',
'.j2k': 'image/jp2',
'.jad': 'text/vnd.sun.j2me.app-descriptor',
'.jar': 'application/x-java-archive',
'.java': 'text/x-java',
'.jng': 'image/x-jng',
'.jnlp': 'application/x-java-jnlp-file',
'.jp2': 'image/jp2',
'.jpc': 'image/jp2',
'.jpe': 'image/jpeg',
'.jpeg': 'image/jpeg',
'.jpf': 'image/jp2',
'.jpg': 'image/jpeg',
'.jpr': 'application/x-jbuilder-project',
'.jpx': 'image/jp2',
'.js': 'application/javascript',
'.json': 'application/json',
'.jsonp': 'application/jsonp',
'.k25': 'image/x-kodak-k25',
'.kar': 'audio/midi',
'.karbon': 'application/x-karbon',
'.kdc': 'image/x-kodak-kdc',
'.kdelnk': 'application/x-desktop',
'.kexi': 'application/x-kexiproject-sqlite3',
'.kexic': 'application/x-kexi-connectiondata',
'.kexis': 'application/x-kexiproject-shortcut',
'.kfo': 'application/x-kformula',
'.kil': 'application/x-killustrator',
'.kino': 'application/smil',
'.kml': 'application/vnd.google-earth.kml+xml',
'.kmz': 'application/vnd.google-earth.kmz',
'.kon': 'application/x-kontour',
'.kpm': 'application/x-kpovmodeler',
'.kpr': 'application/x-kpresenter',
'.kpt': 'application/x-kpresenter',
'.kra': 'application/x-krita',
'.ksp': 'application/x-kspread',
'.kud': 'application/x-kugar',
'.kwd': 'application/x-kword',
'.kwt': 'application/x-kword',
'.la': 'application/x-shared-library-la',
'.latex': 'text/x-tex',
'.ldif': 'text/x-ldif',
'.lha': 'application/x-lha',
'.lhs': 'text/x-literate-haskell',
'.lhz': 'application/x-lhz',
'.log': 'text/x-log',
'.ltx': 'text/x-tex',
'.lua': 'text/x-lua',
'.lwo': 'image/x-lwo',
'.lwob': 'image/x-lwo',
'.lws': 'image/x-lws',
'.ly': 'text/x-lilypond',
'.lyx': 'application/x-lyx',
'.lz': 'application/x-lzip',
'.lzh': 'application/x-lha',
'.lzma': 'application/x-lzma',
'.lzo': 'application/x-lzop',
'.m': 'text/x-matlab',
'.m15': 'audio/x-mod',
'.m2t': 'video/mpeg',
'.m3u': 'audio/x-mpegurl',
'.m3u8': 'application/x-mpegurl',
'.m4': 'application/x-m4',
'.m4a': 'audio/mp4',
'.m4b': 'audio/x-m4b',
'.m4v': 'video/mp4',
'.mab': 'application/x-markaby',
'.man': 'application/x-troff-man',
'.mbox': 'application/mbox',
'.md': 'application/x-genesis-rom',
'.mdb': 'application/vnd.ms-access',
'.mdi': 'image/vnd.ms-modi',
'.me': 'text/x-troff-me',
'.med': 'audio/x-mod',
'.metalink': 'application/metalink+xml',
'.mgp': 'application/x-magicpoint',
'.mid': 'audio/midi',
'.midi': 'audio/midi',
'.mif': 'application/x-mif',
'.minipsf': 'audio/x-minipsf',
'.mka': 'audio/x-matroska',
'.mkv': 'video/x-matroska',
'.ml': 'text/x-ocaml',
'.mli': 'text/x-ocaml',
'.mm': 'text/x-troff-mm',
'.mmf': 'application/x-smaf',
'.mml': 'text/mathml',
'.mng': 'video/x-mng',
'.mo': 'application/x-gettext-translation',
'.mo3': 'audio/x-mo3',
'.moc': 'text/x-moc',
'.mod': 'audio/x-mod',
'.mof': 'text/x-mof',
'.moov': 'video/quicktime',
'.mov': 'video/quicktime',
'.movie': 'video/x-sgi-movie',
'.mp+': 'audio/x-musepack',
'.mp2': 'video/mpeg',
'.mp3': 'audio/mpeg',
'.mp4': 'video/mp4',
'.mpc': 'audio/x-musepack',
'.mpe': 'video/mpeg',
'.mpeg': 'video/mpeg',
'.mpg': 'video/mpeg',
'.mpga': 'audio/mpeg',
'.mpp': 'audio/x-musepack',
'.mrl': 'text/x-mrml',
'.mrml': 'text/x-mrml',
'.mrw': 'image/x-minolta-mrw',
'.ms': 'text/x-troff-ms',
'.msi': 'application/x-msi',
'.msod': 'image/x-msod',
'.msx': 'application/x-msx-rom',
'.mtm': 'audio/x-mod',
'.mup': 'text/x-mup',
'.mxf': 'application/mxf',
'.n64': 'application/x-n64-rom',
'.nb': 'application/mathematica',
'.nc': 'application/x-netcdf',
'.nds': 'application/x-nintendo-ds-rom',
'.nef': 'image/x-nikon-nef',
'.nes': 'application/x-nes-rom',
'.nfo': 'text/x-nfo',
'.not': 'text/x-mup',
'.nsc': 'application/x-netshow-channel',
'.nsv': 'video/x-nsv',
'.o': 'application/x-object',
'.obj': 'application/x-tgif',
'.ocl': 'text/x-ocl',
'.oda': 'application/oda',
'.odb': 'application/vnd.oasis.opendocument.database',
'.odc': 'application/vnd.oasis.opendocument.chart',
'.odf': 'application/vnd.oasis.opendocument.formula',
'.odg': 'application/vnd.oasis.opendocument.graphics',
'.odi': 'application/vnd.oasis.opendocument.image',
'.odm': 'application/vnd.oasis.opendocument.text-master',
'.odp': 'application/vnd.oasis.opendocument.presentation',
'.ods': 'application/vnd.oasis.opendocument.spreadsheet',
'.odt': 'application/vnd.oasis.opendocument.text',
'.oga': 'audio/ogg',
'.ogg': 'video/x-theora+ogg',
'.ogm': 'video/x-ogm+ogg',
'.ogv': 'video/ogg',
'.ogx': 'application/ogg',
'.old': 'application/x-trash',
'.oleo': 'application/x-oleo',
'.opml': 'text/x-opml+xml',
'.ora': 'image/openraster',
'.orf': 'image/x-olympus-orf',
'.otc': 'application/vnd.oasis.opendocument.chart-template',
'.otf': 'application/x-font-otf',
'.otg': 'application/vnd.oasis.opendocument.graphics-template',
'.oth': 'application/vnd.oasis.opendocument.text-web',
'.otp': 'application/vnd.oasis.opendocument.presentation-template',
'.ots': 'application/vnd.oasis.opendocument.spreadsheet-template',
'.ott': 'application/vnd.oasis.opendocument.text-template',
'.owl': 'application/rdf+xml',
'.oxt': 'application/vnd.openofficeorg.extension',
'.p': 'text/x-pascal',
'.p10': 'application/pkcs10',
'.p12': 'application/x-pkcs12',
'.p7b': 'application/x-pkcs7-certificates',
'.p7s': 'application/pkcs7-signature',
'.pack': 'application/x-java-pack200',
'.pak': 'application/x-pak',
'.par2': 'application/x-par2',
'.pas': 'text/x-pascal',
'.patch': 'text/x-patch',
'.pbm': 'image/x-portable-bitmap',
'.pcd': 'image/x-photo-cd',
'.pcf': 'application/x-cisco-vpn-settings',
'.pcf.gz': 'application/x-font-pcf',
'.pcf.z': 'application/x-font-pcf',
'.pcl': 'application/vnd.hp-pcl',
'.pcx': 'image/x-pcx',
'.pdb': 'chemical/x-pdb',
'.pdc': 'application/x-aportisdoc',
'.pdf': 'application/pdf',
'.pdf.bz2': 'application/x-bzpdf',
'.pdf.gz': 'application/x-gzpdf',
'.pef': 'image/x-pentax-pef',
'.pem': 'application/x-x509-ca-cert',
'.perl': 'application/x-perl',
'.pfa': 'application/x-font-type1',
'.pfb': 'application/x-font-type1',
'.pfx': 'application/x-pkcs12',
'.pgm': 'image/x-portable-graymap',
'.pgn': 'application/x-chess-pgn',
'.pgp': 'application/pgp-encrypted',
'.php': 'application/x-php',
'.php3': 'application/x-php',
'.php4': 'application/x-php',
'.pict': 'image/x-pict',
'.pict1': 'image/x-pict',
'.pict2': 'image/x-pict',
'.pickle': 'application/python-pickle',
'.pk': 'application/x-tex-pk',
'.pkipath': 'application/pkix-pkipath',
'.pkr': 'application/pgp-keys',
'.pl': 'application/x-perl',
'.pla': 'audio/x-iriver-pla',
'.pln': 'application/x-planperfect',
'.pls': 'audio/x-scpls',
'.pm': 'application/x-perl',
'.png': 'image/png',
'.pnm': 'image/x-portable-anymap',
'.pntg': 'image/x-macpaint',
'.po': 'text/x-gettext-translation',
'.por': 'application/x-spss-por',
'.pot': 'text/x-gettext-translation-template',
'.ppm': 'image/x-portable-pixmap',
'.pps': 'application/vnd.ms-powerpoint',
'.ppt': 'application/vnd.ms-powerpoint',
'.pptm': 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
'.pptx': 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
'.ppz': 'application/vnd.ms-powerpoint',
'.prc': 'application/x-palm-database',
'.ps': 'application/postscript',
'.ps.bz2': 'application/x-bzpostscript',
'.ps.gz': 'application/x-gzpostscript',
'.psd': 'image/vnd.adobe.photoshop',
'.psf': 'audio/x-psf',
'.psf.gz': 'application/x-gz-font-linux-psf',
'.psflib': 'audio/x-psflib',
'.psid': 'audio/prs.sid',
'.psw': 'application/x-pocket-word',
'.pw': 'application/x-pw',
'.py': 'text/x-python',
'.pyc': 'application/x-python-bytecode',
'.pyo': 'application/x-python-bytecode',
'.qif': 'image/x-quicktime',
'.qt': 'video/quicktime',
'.qtif': 'image/x-quicktime',
'.qtl': 'application/x-quicktime-media-link',
'.qtvr': 'video/quicktime',
'.ra': 'audio/vnd.rn-realaudio',
'.raf': 'image/x-fuji-raf',
'.ram': 'application/ram',
'.rar': 'application/x-rar',
'.ras': 'image/x-cmu-raster',
'.raw': 'image/x-panasonic-raw',
'.rax': 'audio/vnd.rn-realaudio',
'.rb': 'application/x-ruby',
'.rdf': 'application/rdf+xml',
'.rdfs': 'application/rdf+xml',
'.reg': 'text/x-ms-regedit',
'.rej': 'application/x-reject',
'.rgb': 'image/x-rgb',
'.rle': 'image/rle',
'.rm': 'application/vnd.rn-realmedia',
'.rmj': 'application/vnd.rn-realmedia',
'.rmm': 'application/vnd.rn-realmedia',
'.rms': 'application/vnd.rn-realmedia',
'.rmvb': 'application/vnd.rn-realmedia',
'.rmx': 'application/vnd.rn-realmedia',
'.roff': 'text/troff',
'.rp': 'image/vnd.rn-realpix',
'.rpm': 'application/x-rpm',
'.rss': 'application/rss+xml',
'.rt': 'text/vnd.rn-realtext',
'.rtf': 'application/rtf',
'.rtx': 'text/richtext',
'.rv': 'video/vnd.rn-realvideo',
'.rvx': 'video/vnd.rn-realvideo',
'.s3m': 'audio/x-s3m',
'.sam': 'application/x-amipro',
'.sami': 'application/x-sami',
'.sav': 'application/x-spss-sav',
'.scm': 'text/x-scheme',
'.sda': 'application/vnd.stardivision.draw',
'.sdc': 'application/vnd.stardivision.calc',
'.sdd': 'application/vnd.stardivision.impress',
'.sdp': 'application/sdp',
'.sds': 'application/vnd.stardivision.chart',
'.sdw': 'application/vnd.stardivision.writer',
'.sgf': 'application/x-go-sgf',
'.sgi': 'image/x-sgi',
'.sgl': 'application/vnd.stardivision.writer',
'.sgm': 'text/sgml',
'.sgml': 'text/sgml',
'.sh': 'application/x-shellscript',
'.shar': 'application/x-shar',
'.shn': 'application/x-shorten',
'.siag': 'application/x-siag',
'.sid': 'audio/prs.sid',
'.sik': 'application/x-trash',
'.sis': 'application/vnd.symbian.install',
'.sisx': 'x-epoc/x-sisx-app',
'.sit': 'application/x-stuffit',
'.siv': 'application/sieve',
'.sk': 'image/x-skencil',
'.sk1': 'image/x-skencil',
'.skr': 'application/pgp-keys',
'.slk': 'text/spreadsheet',
'.smaf': 'application/x-smaf',
'.smc': 'application/x-snes-rom',
'.smd': 'application/vnd.stardivision.mail',
'.smf': 'application/vnd.stardivision.math',
'.smi': 'application/x-sami',
'.smil': 'application/smil',
'.sml': 'application/smil',
'.sms': 'application/x-sms-rom',
'.snd': 'audio/basic',
'.so': 'application/x-sharedlib',
'.spc': 'application/x-pkcs7-certificates',
'.spd': 'application/x-font-speedo',
'.spec': 'text/x-rpm-spec',
'.spl': 'application/x-shockwave-flash',
'.spx': 'audio/x-speex',
'.sql': 'text/x-sql',
'.sr2': 'image/x-sony-sr2',
'.src': 'application/x-wais-source',
'.srf': 'image/x-sony-srf',
'.srt': 'application/x-subrip',
'.ssa': 'text/x-ssa',
'.stc': 'application/vnd.sun.xml.calc.template',
'.std': 'application/vnd.sun.xml.draw.template',
'.sti': 'application/vnd.sun.xml.impress.template',
'.stm': 'audio/x-stm',
'.stw': 'application/vnd.sun.xml.writer.template',
'.sty': 'text/x-tex',
'.sub': 'text/x-subviewer',
'.sun': 'image/x-sun-raster',
'.sv4cpio': 'application/x-sv4cpio',
'.sv4crc': 'application/x-sv4crc',
'.svg': 'image/svg+xml',
'.svgz': 'image/svg+xml-compressed',
'.swf': 'application/x-shockwave-flash',
'.sxc': 'application/vnd.sun.xml.calc',
'.sxd': 'application/vnd.sun.xml.draw',
'.sxg': 'application/vnd.sun.xml.writer.global',
'.sxi': 'application/vnd.sun.xml.impress',
'.sxm': 'application/vnd.sun.xml.math',
'.sxw': 'application/vnd.sun.xml.writer',
'.sylk': 'text/spreadsheet',
'.t': 'text/troff',
'.t2t': 'text/x-txt2tags',
'.tar': 'application/x-tar',
'.tar.bz': 'application/x-bzip-compressed-tar',
'.tar.bz2': 'application/x-bzip-compressed-tar',
'.tar.gz': 'application/x-compressed-tar',
'.tar.lzma': 'application/x-lzma-compressed-tar',
'.tar.lzo': 'application/x-tzo',
'.tar.xz': 'application/x-xz-compressed-tar',
'.tar.z': 'application/x-tarz',
'.tbz': 'application/x-bzip-compressed-tar',
'.tbz2': 'application/x-bzip-compressed-tar',
'.tcl': 'text/x-tcl',
'.tex': 'text/x-tex',
'.texi': 'text/x-texinfo',
'.texinfo': 'text/x-texinfo',
'.tga': 'image/x-tga',
'.tgz': 'application/x-compressed-tar',
'.theme': 'application/x-theme',
'.themepack': 'application/x-windows-themepack',
'.tif': 'image/tiff',
'.tiff': 'image/tiff',
'.tk': 'text/x-tcl',
'.tlz': 'application/x-lzma-compressed-tar',
'.tnef': 'application/vnd.ms-tnef',
'.tnf': 'application/vnd.ms-tnef',
'.toc': 'application/x-cdrdao-toc',
'.torrent': 'application/x-bittorrent',
'.tpic': 'image/x-tga',
'.tr': 'text/troff',
'.ts': 'application/x-linguist',
'.tsv': 'text/tab-separated-values',
'.tta': 'audio/x-tta',
'.ttc': 'application/x-font-ttf',
'.ttf': 'application/x-font-ttf',
'.ttx': 'application/x-font-ttx',
'.txt': 'text/plain',
'.txz': 'application/x-xz-compressed-tar',
'.tzo': 'application/x-tzo',
'.ufraw': 'application/x-ufraw',
'.ui': 'application/x-designer',
'.uil': 'text/x-uil',
'.ult': 'audio/x-mod',
'.uni': 'audio/x-mod',
'.uri': 'text/x-uri',
'.url': 'text/x-uri',
'.ustar': 'application/x-ustar',
'.vala': 'text/x-vala',
'.vapi': 'text/x-vala',
'.vcf': 'text/directory',
'.vcs': 'text/calendar',
'.vct': 'text/directory',
'.vda': 'image/x-tga',
'.vhd': 'text/x-vhdl',
'.vhdl': 'text/x-vhdl',
'.viv': 'video/vivo',
'.vivo': 'video/vivo',
'.vlc': 'audio/x-mpegurl',
'.vob': 'video/mpeg',
'.voc': 'audio/x-voc',
'.vor': 'application/vnd.stardivision.writer',
'.vst': 'image/x-tga',
'.wav': 'audio/x-wav',
'.wax': 'audio/x-ms-asx',
'.wb1': 'application/x-quattropro',
'.wb2': 'application/x-quattropro',
'.wb3': 'application/x-quattropro',
'.wbmp': 'image/vnd.wap.wbmp',
'.wcm': 'application/vnd.ms-works',
'.wdb': 'application/vnd.ms-works',
'.webm': 'video/webm',
'.wk1': 'application/vnd.lotus-1-2-3',
'.wk3': 'application/vnd.lotus-1-2-3',
'.wk4': 'application/vnd.lotus-1-2-3',
'.wks': 'application/vnd.ms-works',
'.wma': 'audio/x-ms-wma',
'.wmf': 'image/x-wmf',
'.wml': 'text/vnd.wap.wml',
'.wmls': 'text/vnd.wap.wmlscript',
'.wmv': 'video/x-ms-wmv',
'.wmx': 'audio/x-ms-asx',
'.wp': 'application/vnd.wordperfect',
'.wp4': 'application/vnd.wordperfect',
'.wp5': 'application/vnd.wordperfect',
'.wp6': 'application/vnd.wordperfect',
'.wpd': 'application/vnd.wordperfect',
'.wpg': 'application/x-wpg',
'.wpl': 'application/vnd.ms-wpl',
'.wpp': 'application/vnd.wordperfect',
'.wps': 'application/vnd.ms-works',
'.wri': 'application/x-mswrite',
'.wrl': 'model/vrml',
'.wv': 'audio/x-wavpack',
'.wvc': 'audio/x-wavpack-correction',
'.wvp': 'audio/x-wavpack',
'.wvx': 'audio/x-ms-asx',
'.x3f': 'image/x-sigma-x3f',
'.xac': 'application/x-gnucash',
'.xbel': 'application/x-xbel',
'.xbl': 'application/xml',
'.xbm': 'image/x-xbitmap',
'.xcf': 'image/x-xcf',
'.xcf.bz2': 'image/x-compressed-xcf',
'.xcf.gz': 'image/x-compressed-xcf',
'.xhtml': 'application/xhtml+xml',
'.xi': 'audio/x-xi',
'.xla': 'application/vnd.ms-excel',
'.xlc': 'application/vnd.ms-excel',
'.xld': 'application/vnd.ms-excel',
'.xlf': 'application/x-xliff',
'.xliff': 'application/x-xliff',
'.xll': 'application/vnd.ms-excel',
'.xlm': 'application/vnd.ms-excel',
'.xls': 'application/vnd.ms-excel',
'.xlsm': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
'.xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
'.xlt': 'application/vnd.ms-excel',
'.xlw': 'application/vnd.ms-excel',
'.xm': 'audio/x-xm',
'.xmf': 'audio/x-xmf',
'.xmi': 'text/x-xmi',
'.xml': 'application/xml',
'.xpm': 'image/x-xpixmap',
'.xps': 'application/vnd.ms-xpsdocument',
'.xsl': 'application/xml',
'.xslfo': 'text/x-xslfo',
'.xslt': 'application/xml',
'.xspf': 'application/xspf+xml',
'.xul': 'application/vnd.mozilla.xul+xml',
'.xwd': 'image/x-xwindowdump',
'.xyz': 'chemical/x-pdb',
'.xz': 'application/x-xz',
'.w2p': 'application/w2p',
'.z': 'application/x-compress',
'.zabw': 'application/x-abiword',
'.zip': 'application/zip',
'.zoo': 'application/x-zoo',
}

file_send = File.send

macs = None
web_data = []
web_command = []
web_message = []

base_user_data = {
    "phone-number": "",
    "sex": "",
    "age": "",
    "e-mail":"",

}



def send_command(string):
    global command
    if string and string != '\n':
        command = string

    
def input(string=None):
    '''调用这个模块,使你的子线程占用主线程的input.
返回输入的内容'''
    global input_check,global_input_content,ai_message
    # 检测是否已经被调用
    while input_check:sleep(0.5)
    # 调用全局输入框
    input_check = True
    # 刷新主窗口
    ai_message = string
    # 等待返回
    while global_input_content is None:sleep(0.5)
    # 获取结果
    result = global_input_content
    # 初始化输入框
    input_check = False
    global_input_content = None
    
    return result

def add_pid(pid):
    global process_pids
    process_pids.append(pid)

def del_pid(pid):
    global process_pids
    process_pids.remove(pid)
    


    
def show_window():
    global main_window
    main_window = True

def hide_window():
    global main_window
    main_window = False

def file_open_box(ui,file_name,tool_name):
    global file_open_return
    # 调用文件选择框选择要清理的文件夹
    ui.file_open_box(file_name,tool_name)
    # 等待返回
    while not file_open_return:sleep(0.5)
    # 获取结果
    result = file_open_return
    # 初始化文件选择框状态
    file_open_return = None

    return result

def proc_over(sign):
    global break_program_number
    break_program_number.append(sign)

def get_name(name):
    return '_'+''.join(filter(lambda x:x.isalnum(),name))



__all__ = ['input','add_pid','file_open_box','send_command','proc_over']

web_server.py
from socket import *
from threading import Thread
from PyQt5.QtCore import QThread,pyqtSignal
from urllib.parse import unquote
import global_control
import traceback
from event_handler import Http_Event_Handler

class Speed_Manager(QThread):
    tree_widget_attribute_signal = pyqtSignal(dict)
    def __init__(self, parent):
        super().__init__()
        self.parent = parent

    def run(self):
        while True:
            # 计算上传速度
            for each_key in global_control.up_speed_list:
                # print('ups')
                if global_control.up_speed_list[each_key]:
                    self.set_treewidget_attribute(name=each_key, method='setvalue', args=((1, f'{int(global_control.up_speed_list[each_key] / 1024)}KB/S'),))
                    global_control.up_speed_list[each_key] = 0

            # 计算下载速度
            for each_key in global_control.down_speed_list:
                #                 print('downs')
                if global_control.down_speed_list[each_key]:
                    self.set_treewidget_attribute(name=each_key, method='setvalue', args=(
                    (2, f'{int(global_control.down_speed_list[each_key] / 1024)}KB/S'),))
                    global_control.down_speed_list[each_key] = 0

            global_control.sleep(1)
    # 刷新主窗口上下行速度与请求方法
    def set_treewidget_attribute(self, name, method, part=None, args=None):
        self.tree_widget_attribute_signal.emit({'name': name,
                                                'method': method,
                                                'part': part,
                                                'args': args})

class Http_Server(QThread):
    event_message_signal = pyqtSignal(str)
    event_refresh_signal = pyqtSignal(str)
    tree_widget_attribute_signal = pyqtSignal(dict)

    def __init__(self,parent):
        super().__init__()
        self.parent = parent
        
        # 新建http服务器
        self.http_server = socket(AF_INET,SOCK_STREAM)
        self.http_server.bind(('',80))
        self.http_server.listen(999999)
        
        self.number = 0
        
    def run(self):
        while True:
            request,address = self.http_server.accept()
            exec(f'self.thread{self.number} = Http_Data_Recv(request,address,self)')
            exec(f'self.thread{self.number}.setDaemon(True)')
            exec(f'self.thread{self.number}.start()')
            self.number += 1
    
    def new_speed(self,name,address,flag):
        if flag == 'up':
            if name not in global_control.transmitting:
                global_control.transmitting.append(name)
                self.set_treewidget_attribute(name = name,method = 'add',part = 'up_down_load_speed')
                self.set_treewidget_attribute(name = name,method = 'setvalue',args = ((0,str(address[0])),(1,'N/A'),(2,'N/A')))
            
            if name not in global_control.up_speed_list:
                global_control.up_speed_list[name] = 0
        elif flag == 'down':
            if name not in global_control.transmitting:
                global_control.transmitting.append(name)
                self.set_treewidget_attribute(name = name,method = 'add',part = 'up_down_load_speed')
                self.set_treewidget_attribute(name = name,method = 'setvalue',args = ((0,str(address[0])),(1,'N/A'),(2,'N/A')))
            
            if name not in global_control.down_speed_list:
                global_control.down_speed_list[name] = 0

    # 刷新主窗口上下行速度与请求方法
    def set_treewidget_attribute(self,name,method,part=None,args=None):
        self.tree_widget_attribute_signal.emit({'name': name,
                                                       'method': method,
                                                       'part': part,
                                                       'args': args})
    # 显示事件
    def event_show(self,string,refresh = False):
        if refresh:
            current_text = self.parent.Event_Message.toPlainText()
            current_text = current_text[:current_text.rfind('\n')]
            self.event_refresh_signal.emit(current_text+'\n'+str(string))            
        else:
            self.event_message_signal.emit(str(string))

class Http_Data_Recv(Thread):
    def __init__(self, request, address, parent):
        super().__init__()
        self.event_handler = Http_Event_Handler(parent)
        self.request = request
        self.address = address
        self.parent = parent
        self.CHUNK = 4194496
        print(self.address)
        self.timeout = 0
        self.ok = False

    def run(self):
        # 添加主窗口速度目录
        name = '_' + self.address[0].replace('.', '')
        self.parent.new_speed(name, self.address, 'down')

        # 开始接收数据
        header_flag = 0
        data = b''
        while True:
            # 接收数据
            try:
                temp_data = self.request.recv(self.CHUNK)
            except (ConnectionAbortedError,ConnectionResetError) as e:
                print(e)
                temp_data = b''

            data += temp_data

            # 计算速度
            global_control.down_speed_list[name] += len(temp_data)

            if b'\r\n\r\n' in data:  # 发现请求头结尾
                header_flag = 1

                # 提取请求头
                header = data[:data.find(b'\r\n\r\n') + 4]
                # 分析请求头
                args = self.analysis_request_header_argument(header)
                # 如果网址不合法
                if args == 1 and len(temp_data) < self.CHUNK:
                    break

            if header_flag:
                if 'content-length' in args['headers'].keys() or 'Content-Length' in args['headers'].keys():
                    data_size = len(header) + int(args['headers']['Content-Length'])
                    if len(data) >= data_size:
                        break
                else:
                    break
            if len(temp_data) < 1024:
                args = 0
                break

        # 数据接收完成

        # 如果url合法开始执行
        print(args or 'URL 不合法')
        self.event_handler.start(self.request, self.address, args, data)
        self.ok = True

    def analysis_request_header_argument(self, request_header):
        heart_args = {}
        heart_data_list = request_header.decode().split('\r\n')

        # 请求方法,url,http协议
        method, url, agreement = heart_data_list[0].split(' ')

        heart_args['method'] = method.strip()

        # 从url中分解出要调用的程序和参数
        # 有参数的程序
        if '?' in url:
            #  程序                    url参数
            heart_args['engine'], url_argument = unquote(url[1:].split('?')[0]), unquote(url.split('?')[1])

            if heart_args['engine'] == '' or not url_argument:
                print('error')
                return 1

            # 分解 Query String Parameters
            heart_args['url-argument'] = {}
            all_arg = url_argument.split('&')
            for each_arg in all_arg:
                key, value = each_arg.split('=')
                heart_args['url-argument'][key] = value

        # 没有参数的程序
        else:
            heart_args['engine'] = unquote(url[1:])
            heart_args['url-argument'] = {}

        # 分解 headers
        try:
            # 分解请求头
            heart_args['headers'] = {}
            for each_arg in heart_data_list[1:]:
                if each_arg:
                    key, value = each_arg.split(':', 1)
                    heart_args['headers'][key] = value.strip()
        except:
            traceback.print_exc()
        finally:
            # 头参数:请求方法,请求程序,URL参数,头参数
            # heart_args:method,engine,url-argument,headers
            return heart_args

class Thread_Manager(QThread):
    def __init__(self,parent,server):
        super(Thread_Manager, self).__init__()
        self.parent =  parent
        self.server =server

    def run(self):
        while True:
            try:
                for each_child_class in self.server.__dict__:
                    try:
                        if eval(f'self.server.{each_child_class}.ok'):
                            exec(f'del self.server.{each_child_class}')
                            # print(each_child_class,'已被删除')
                    except AttributeError:
                        pass
                    except Exception as e:
                        print(e)

                global_control.sleep(1)
            except RuntimeError:
                pass
            except:
                traceback.print_exc()

event_handler.py
import global_control
import traceback

class Http_Event_Handler:
    def __init__(self,parent):
        self.parent = parent

        self.all_program = {'404':'_404',
                            # 写好的处理程序登记在这里
                            }

    def start(self,request,address,args,data = None):
        self.request = request
        self.address = address
        self.args = args
        self.data = data

        if args == 0:
            self.request.close()
            return
        elif args == 1:
            self.engine = '404'

        self.engine = args['engine']


        if '/' in self.engine:
            self.engine,self.file_dir = self.engine.split('/',1)
        self.handle_event()

    def handle_event(self):
        if self.engine:
            module = self.all_program.get(self.engine)
            # 分析事件
            try:
                if module:
                    exec(f'import {module}')
                    exec(f'{module}.main(self.parent,self.request,self.address,self.args,self.data)')
                else:
                    import _404
                    _404.main(self.parent,self.request,self.address,self.args,self.data)
            except AttributeError as e:
                print(e)
                import _404
                _404.main(self.parent,self.request,self.address,self.args,self.data)
            except:
                pass
                traceback.print_exc()
        else:
            import home
            home.main(self.parent,self.request,self.address,self.args,self.data)

        from web_server import Http_Data_Recv
        self.child_thread = Http_Data_Recv(self.request,self.address,self.parent)
        self.child_thread.run()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-23 10:45:42 | 显示全部楼层
本帖最后由 曼查克 于 2021-6-23 10:47 编辑
z5560636 发表于 2021-6-23 09:22
你搞复杂了,   http 服务器都是多线程的,  并不是你一个页面访问,就把后端挂死在函数里面了。  如果 ...


现在用的是flask的app.run开启的服务,适合用于开发不适合生产。
我的需求是几十台客户端同时请求,但是数据比较多,而且都是通过同一个路由处理的。
为了避免堵住,希望处理数据的部分由子线程来做。
不知道怎么实现?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-23 10:53:49 | 显示全部楼层
曼查克 发表于 2021-6-23 10:45
现在用的是flask的app.run开启的服务,适合用于开发不适合生产。
我的需求是几十台客户端同时请求,但 ...

我的代码居然还没通过审核
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-23 11:12:13 | 显示全部楼层
nahongyan1997 发表于 2021-6-23 10:53
我的代码居然还没通过审核

写的太乱,审核看不懂,要研究下。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-23 11:23:06 | 显示全部楼层
曼查克 发表于 2021-6-23 11:12
写的太乱,审核看不懂,要研究下。

不至于不至于
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-14 18:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表