前言

通常来说易语言写接口,并不是一件容易事。 需要借助三方模块,或者 E2EE 这样的框架,这样一来就比较笨重搭建起来也很不方便。这里教大家一个原生不借助模块的方法

现在很多高级语言写api已经很方便了,例如python的 fastapi 这种模块,只需要几行代码就能做api了(脏活苦活别人都帮我们干完了)

DLL命令定义

通过DLL创建服务: 一个I/O完成端口关联一个或多个文件句柄,返回的句柄。若为NULL创建失败,不为NULL创建成功


加载卸载com库

传输与客户端封包

内存处理

内存处理版块代码

.版本 2
.支持库 spec

.子程序 申请内存_文本, 整数型
.参数 参数内容, 文本型, , 传递的文本
.局部变量 参数, 整数型

参数 = 申请内存 (取文本长度 (参数内容) + 1, 真)
写到内存 (到字节集 (参数内容), 参数, )
返回 (参数)

.子程序 申请内存_字节, 整数型
.参数 参数内容, 字节集, , 传递的文本
.局部变量 参数, 整数型

参数 = 申请内存 (取字节集长度 (参数内容) + 1, 真)
写到内存 (参数内容, 参数, )
返回 (参数)

.子程序 取协议类型, 文本型, , _-@S<取协议类型>
.参数 文件类型, 文本型
.参数 中文编码, 逻辑型

文件类型 = 到小写 (文件类型)

.判断开始 (文件类型 = “css”)

    返回 (“Content-Type: text/css”)

.判断 (文件类型 = “html”)

    .如果真 (中文编码)
        返回 (“Content-Type: text/html;charset=gb2312”)
    .如果真结束

    返回 (“Content-Type: text/html”)

.判断 (文件类型 = “htm”)

    .如果真 (中文编码)
        返回 (“Content-Type: text/html;charset=gb2312”)
    .如果真结束

    返回 (“Content-Type: text/html”)
.判断 (文件类型 = “xhtml”)
    返回 (“Content-Type: application/xhtml+xml”)
.判断 (文件类型 = “ico”)
    返回 (“Content-Type: image/x-icon”)
.判断 (文件类型 = “txt”)
    返回 (“Content-Type: text/plain”)
.判断 (文件类型 = “doc”)
    返回 (“Content-Type: application/msword”)
.判断 (文件类型 = “bmp”)
    返回 (“Content-Type: image/bmp”)
.判断 (文件类型 = “gif”)
    返回 (“Content-Type: image/gif”)
.判断 (文件类型 = “ief”)
    返回 (“Content-Type: image/ief”)
.判断 (文件类型 = “jpeg”)
    返回 (“Content-Type: image/jpeg”)
.判断 (文件类型 = “jpg”)
    返回 (“Content-Type: image/jpeg”)
.判断 (文件类型 = “jpe”)
    返回 (“Content-Type: image/jpeg”)
.判断 (文件类型 = “png”)
    返回 (“Content-Type: image/png”)
.判断 (文件类型 = “exe”)
    返回 (“Content-Type: application/octet-stream”)
.判断 (文件类型 = “avi”)
    返回 (“Content-Type: video/x-msvideo”)
.判断 (文件类型 = “movie”)
    返回 (“Content-Type: video/x-sgi-movie”)
.判断 (文件类型 = “ice”)
    返回 (“Content-Type: x-conference/x-cooltalk”)
.判断 (文件类型 = “xsl”)
    返回 (“Content-Type: text/xml”)
.判断 (文件类型 = “json”)
    返回 (“Content-Type: application/json”)
.判断 (文件类型 = “xml”)
    返回 (“Content-Type: text/xml”)
.判断 (文件类型 = “mpeg”)
    返回 (“Content-Type: video/mpeg”)
.判断 (文件类型 = “mpg”)
    返回 (“Content-Type: video/mpeg”)
.判断 (文件类型 = “mpe”)
    返回 (“Content-Type: video/mpeg”)
.判断 (文件类型 = “pdf”)
    返回 (“Content-Type: application/pdf”)
.判断 (文件类型 = “ez”)
    返回 (“Content-Type: application/andrew-inset”)
.判断 (文件类型 = “hqx”)
    返回 (“Content-Type: application/mac-binhex40”)
.判断 (文件类型 = “cpt”)
    返回 (“Content-Type: application/mac-compactpro”)
.判断 (文件类型 = “bin”)
    返回 (“Content-Type: application/octet-stream”)
.判断 (文件类型 = “dms”)
    返回 (“Content-Type: application/octet-stream”)
.判断 (文件类型 = “lha”)
    返回 (“Content-Type: application/octet-stream”)
.判断 (文件类型 = “lzh”)
    返回 (“Content-Type: application/octet-stream”)
.判断 (文件类型 = “class”)
    返回 (“Content-Type: application/octet-stream”)
.判断 (文件类型 = “so”)
    返回 (“Content-Type: application/octet-stream”)
.判断 (文件类型 = “dll”)
    返回 (“Content-Type: application/octet-stream”)
.判断 (文件类型 = “oda”)
    返回 (“Content-Type: application/oda”)
.判断 (文件类型 = “pdf”)
    返回 (“Content-Type: application/pdf”)
.判断 (文件类型 = “ai”)
    返回 (“Content-Type: application/postscript”)
.判断 (文件类型 = “eps”)
    返回 (“Content-Type: application/postscript”)
.判断 (文件类型 = “ps”)
    返回 (“Content-Type: application/postscript”)
.判断 (文件类型 = “smi”)
    返回 (“Content-Type: application/smil”)
.判断 (文件类型 = “smil”)
    返回 (“Content-Type: application/smil”)
.判断 (文件类型 = “ppt”)
    返回 (“Content-Type: application/vnd.ms-powerpoint”)
.判断 (文件类型 = “wbxml”)
    返回 (“Content-Type: application/vnd.wap.wbxml”)
.判断 (文件类型 = “wmlc”)
    返回 (“Content-Type: application/vnd.wap.wmlc”)
.判断 (文件类型 = “wmlsc”)
    返回 (“Content-Type: application/vnd.wap.wmlc”)
.判断 (文件类型 = “bcpio”)
    返回 (“Content-Type: application/x-bcpio”)
.判断 (文件类型 = “vcd”)
    返回 (“Content-Type: application/x-cdlink”)
.判断 (文件类型 = “pgn”)
    返回 (“Content-Type: application/x-chess-pgn”)
.判断 (文件类型 = “cpio”)
    返回 (“Content-Type: application/x-cpio”)
.判断 (文件类型 = “csh”)
    返回 (“Content-Type: application/x-csh”)
.判断 (文件类型 = “dcr”)
    返回 (“Content-Type: application/x-director”)
.判断 (文件类型 = “dir”)
    返回 (“Content-Type: application/x-director”)
.判断 (文件类型 = “dxr”)
    返回 (“Content-Type: application/x-director”)
.判断 (文件类型 = “dvi”)
    返回 (“Content-Type: application/x-dvi”)
.判断 (文件类型 = “spl”)
    返回 (“Content-Type: application/x-futuresplash”)
.判断 (文件类型 = “gtar”)
    返回 (“Content-Type: application/x-gtar”)
.判断 (文件类型 = “hdf”)
    返回 (“Content-Type: application/x-hdf”)
.判断 (文件类型 = “js”)
    返回 (“Content-Type: application/x-javascript”)
.判断 (文件类型 = “skp”)
    返回 (“Content-Type: application/x-koan”)
.判断 (文件类型 = “skd”)
    返回 (“Content-Type: application/x-koan”)
.判断 (文件类型 = “skt”)
    返回 (“Content-Type: application/x-koan”)
.判断 (文件类型 = “skm”)
    返回 (“Content-Type: application/x-koan”)
.判断 (文件类型 = “latex”)
    返回 (“Content-Type: application/x-latex”)
.判断 (文件类型 = “nc”)
    返回 (“Content-Type: application/x-netcdf”)
.判断 (文件类型 = “cdf”)
    返回 (“Content-Type: application/x-netcdf”)
.判断 (文件类型 = “sh”)
    返回 (“Content-Type: application/x-sh”)
.判断 (文件类型 = “shar”)
    返回 (“Content-Type: application/x-shar”)
.判断 (文件类型 = “swf”)
    返回 (“Content-Type: application/x-shockwave-flash”)
.判断 (文件类型 = “sit”)
    返回 (“Content-Type: application/x-stuffit”)
.判断 (文件类型 = “sv4cpio”)
    返回 (“Content-Type: application/x-sv4cpio”)
.判断 (文件类型 = “tex”)
    返回 (“Content-Type: application/x-tex”)
.判断 (文件类型 = “tcl”)
    返回 (“Content-Type: application/x-tcl”)
.判断 (文件类型 = “tar”)
    返回 (“Content-Type: application/x-tar”)
.判断 (文件类型 = “sv4crc”)
    返回 (“Content-Type: application/x-sv4crc”)
.判断 (文件类型 = “texinfo”)
    返回 (“Content-Type: application/x-texinfo”)
.判断 (文件类型 = “texi”)
    返回 (“Content-Type: application/x-texinfo”)
.判断 (文件类型 = “t”)
    返回 (“Content-Type: application/x-troff”)
.判断 (文件类型 = “tr”)
    返回 (“Content-Type: application/x-troff”)
.判断 (文件类型 = “roff”)
    返回 (“Content-Type: application/x-troff”)
.判断 (文件类型 = “man”)
    返回 (“Content-Type: application/x-troff-man”)
.判断 (文件类型 = “me”)
    返回 (“Content-Type: application/x-troff-me”)
.判断 (文件类型 = “ms”)
    返回 (“Content-Type: application/x-troff-ms”)
.判断 (文件类型 = “ustar”)
    返回 (“Content-Type: application/x-ustar”)
.判断 (文件类型 = “src”)
    返回 (“Content-Type: application/x-wais-source”)
.判断 (文件类型 = “xht”)
    返回 (“Content-Type: application/xhtml+xml”)
.判断 (文件类型 = “zip”)
    返回 (“Content-Type: application/zip”)
.判断 (文件类型 = “au”)
    返回 (“Content-Type: audio/basic”)
.判断 (文件类型 = “snd”)
    返回 (“Content-Type: audio/basic”)
.判断 (文件类型 = “mid”)
    返回 (“Content-Type: audio/midi”)
.判断 (文件类型 = “midi”)
    返回 (“Content-Type: audio/midi”)
.判断 (文件类型 = “kar”)
    返回 (“Content-Type: audio/midi”)
.判断 (文件类型 = “mpga”)
    返回 (“Content-Type: audio/mpeg”)
.判断 (文件类型 = “mp2”)
    返回 (“Content-Type: audio/mpeg”)
.判断 (文件类型 = “mp3”)
    返回 (“Content-Type: audio/mpeg”)
.判断 (文件类型 = “aif”)
    返回 (“Content-Type: audio/x-aiff”)
.判断 (文件类型 = “aiff”)
    返回 (“Content-Type: audio/x-aiff”)
.判断 (文件类型 = “aifc”)
    返回 (“Content-Type: audio/x-aiff”)
.判断 (文件类型 = “m3u”)
    返回 (“Content-Type: audio/x-mpegurl”)
.判断 (文件类型 = “ram”)
    返回 (“Content-Type: audio/x-pn-realaudio”)
.判断 (文件类型 = “rm”)
    返回 (“Content-Type: audio/x-pn-realaudio”)
.判断 (文件类型 = “rpm”)
    返回 (“Content-Type: audio/x-pn-realaudio-plugin”)
.判断 (文件类型 = “ra”)
    返回 (“Content-Type: audio/x-realaudio”)
.判断 (文件类型 = “wav”)
    返回 (“Content-Type: audio/x-wav”)
.判断 (文件类型 = “pdb”)
    返回 (“Content-Type: chemical/x-pdb”)
.判断 (文件类型 = “rm”)
    返回 (“Content-Type: chemical/x-xyz”)
.判断 (文件类型 = “tiff”)
    返回 (“Content-Type: image/tiff”)
.判断 (文件类型 = “tif”)
    返回 (“Content-Type: image/tiff”)
.判断 (文件类型 = “djvu”)
    返回 (“Content-Type: image/vnd.djvu”)
.判断 (文件类型 = “djv”)
    返回 (“Content-Type: image/vnd.djvu”)
.判断 (文件类型 = “wbmp”)
    返回 (“Content-Type: image/vnd.wap.wbmp”)
.判断 (文件类型 = “ras”)
    返回 (“Content-Type: image/x-cmu-raster”)
.判断 (文件类型 = “pnm”)
    返回 (“Content-Type: image/x-portable-anymap”)
.判断 (文件类型 = “pbm”)
    返回 (“Content-Type: image/x-portable-bitmap”)
.判断 (文件类型 = “pgm”)
    返回 (“Content-Type: image/x-portable-graymap”)
.判断 (文件类型 = “ppm”)
    返回 (“Content-Type: image/x-portable-pixmap”)
.判断 (文件类型 = “rgb”)
    返回 (“Content-Type: image/x-rgb”)
.判断 (文件类型 = “xbm”)
    返回 (“Content-Type: image/x-xbitmap”)
.判断 (文件类型 = “xpm”)
    返回 (“Content-Type: image/x-xpixmap”)
.判断 (文件类型 = “xwd”)
    返回 (“Content-Type: image/x-xwindowdump”)
.判断 (文件类型 = “igs”)
    返回 (“Content-Type: model/iges”)
.判断 (文件类型 = “iges”)
    返回 (“Content-Type: model/iges”)
.判断 (文件类型 = “msh”)
    返回 (“Content-Type: model/mesh”)
.判断 (文件类型 = “mesh”)
    返回 (“Content-Type: model/mesh”)
.判断 (文件类型 = “silo”)
    返回 (“Content-Type: model/mesh”)
.判断 (文件类型 = “wrl”)
    返回 (“Content-Type: model/vrml”)
.判断 (文件类型 = “vrml”)
    返回 (“Content-Type: model/vrml”)
.判断 (文件类型 = “asc”)
    返回 (“Content-Type: text/plain”)
.判断 (文件类型 = “rtx”)
    返回 (“Content-Type: text/richtext”)
.判断 (文件类型 = “rtf”)
    返回 (“Content-Type: text/rtf”)
.判断 (文件类型 = “sgml”)
    返回 (“Content-Type: text/sgml”)
.判断 (文件类型 = “sgml”)
    返回 (“Content-Type: text/sgml”)
.判断 (文件类型 = “sgm”)
    返回 (“Content-Type: text/sgml”)
.判断 (文件类型 = “tsv”)
    返回 (“Content-Type: text/tab-separated-values”)
.判断 (文件类型 = “wml”)
    返回 (“Content-Type: text/vnd.wap.wml”)
.判断 (文件类型 = “wmls”)
    返回 (“Content-Type: text/vnd.wap.wmlscript”)
.判断 (文件类型 = “etx”)
    返回 (“Content-Type: text/x-setext”)
.判断 (文件类型 = “qt”)
    返回 (“Content-Type: video/quicktime”)
.判断 (文件类型 = “mov”)
    返回 (“Content-Type: video/quicktime”)
.判断 (文件类型 = “mxu”)
    返回 (“Content-Type: video/vnd.mpegurl”)
.默认
    返回 (“Content-Type: application/octet-stream”)
.判断结束

返回 (“Content-Type: application/octet-stream”)

时区处理

时区处理版块代码

.版本 2

.子程序 时区类型一, 文本型, , _-@S<时区类型一>
.参数 时区设置, 整数型
.参数 增减值, 整数型
.局部变量 时间文本, 文本型
.局部变量 当前时间, 日期时间型
.局部变量 星期, 整数型

当前时间 = 增减时间 (取现行时间 (), #分钟, 增减值)
当前时间 = 增减时间 (当前时间, #小时, -8 + 时区设置)
星期 = 取星期几 (当前时间)
.判断开始 (星期 = 1)
    时间文本 = “Sun, ”
.判断 (星期 = 2)
    时间文本 = “Mon, ”
.判断 (星期 = 3)
    时间文本 = “Tue, ”
.判断 (星期 = 4)
    时间文本 = “Wed, ”
.判断 (星期 = 5)
    时间文本 = “Thu, ”
.判断 (星期 = 6)
    时间文本 = “Fri, ”
.判断 (星期 = 7)
    时间文本 = “Sat, ”
.默认

.判断结束
星期 = 取日 (当前时间)
.判断开始 (星期 < 10)
    时间文本 = 时间文本 + “0” + 到文本 (星期) + “ ”
.默认
    时间文本 = 时间文本 + 到文本 (星期) + “ ”
.判断结束
星期 = 取月份 (当前时间)
.判断开始 (星期 = 1)
    时间文本 = 时间文本 + “Jan ”
.判断 (星期 = 2)
    时间文本 = 时间文本 + “Feb ”
.判断 (星期 = 3)
    时间文本 = 时间文本 + “Mar ”
.判断 (星期 = 4)
    时间文本 = 时间文本 + “Apr ”
.判断 (星期 = 5)
    时间文本 = 时间文本 + “May ”
.判断 (星期 = 6)
    时间文本 = 时间文本 + “Jun ”
.判断 (星期 = 7)
    时间文本 = 时间文本 + “Jul ”
.判断 (星期 = 8)
    时间文本 = 时间文本 + “Aug ”
.判断 (星期 = 9)
    时间文本 = 时间文本 + “Sep ”
.判断 (星期 = 10)
    时间文本 = 时间文本 + “Oct ”
.判断 (星期 = 11)
    时间文本 = 时间文本 + “Nov ”
.判断 (星期 = 12)
    时间文本 = 时间文本 + “Dec ”
.默认

.判断结束
星期 = 取年份 (当前时间)
时间文本 = 时间文本 + 到文本 (星期) + “ ”
星期 = 取小时 (当前时间)
.判断开始 (星期 < 10)
    时间文本 = 时间文本 + “0” + 到文本 (星期) + “:”
.默认
    时间文本 = 时间文本 + 到文本 (星期) + “:”
.判断结束
星期 = 取分钟 (当前时间)
.判断开始 (星期 < 10)
    时间文本 = 时间文本 + “0” + 到文本 (星期) + “:”
.默认
    时间文本 = 时间文本 + 到文本 (星期) + “:”
.判断结束
星期 = 取秒 (当前时间)
.如果 (星期 < 10)
    时间文本 = 时间文本 + “0” + 到文本 (星期) + “ GMT”
.否则
    时间文本 = 时间文本 + 到文本 (星期) + “ GMT”
.如果结束

返回 (时间文本)

.子程序 时区类型二, 文本型, , _-@S<时区类型二>
.参数 时区设置, 整数型
.参数 增加值, 整数型
.局部变量 时间文本, 文本型
.局部变量 当前时间, 日期时间型
.局部变量 星期, 整数型

当前时间 = 增减时间 (取现行时间 (), #分钟, 增加值)
当前时间 = 增减时间 (当前时间, #小时, -8 + 时区设置)
星期 = 取星期几 (当前时间)
.判断开始 (星期 = 1)
    时间文本 = “Sun, ”
.判断 (星期 = 2)
    时间文本 = “Mon, ”
.判断 (星期 = 3)
    时间文本 = “Tue, ”
.判断 (星期 = 4)
    时间文本 = “Wed, ”
.判断 (星期 = 5)
    时间文本 = “Thu, ”
.判断 (星期 = 6)
    时间文本 = “Fri, ”
.判断 (星期 = 7)
    时间文本 = “Sat, ”
.默认

.判断结束
星期 = 取日 (当前时间)
.判断开始 (星期 < 10)
    时间文本 = 时间文本 + “0” + 到文本 (星期) + “-”
.默认
    时间文本 = 时间文本 + 到文本 (星期) + “-”
.判断结束
星期 = 取月份 (当前时间)
.判断开始 (星期 = 1)
    时间文本 = 时间文本 + “Jan-”
.判断 (星期 = 2)
    时间文本 = 时间文本 + “Feb-”
.判断 (星期 = 3)
    时间文本 = 时间文本 + “Mar-”
.判断 (星期 = 4)
    时间文本 = 时间文本 + “Apr-”
.判断 (星期 = 5)
    时间文本 = 时间文本 + “May-”
.判断 (星期 = 6)
    时间文本 = 时间文本 + “Jun-”
.判断 (星期 = 7)
    时间文本 = 时间文本 + “Jul-”
.判断 (星期 = 8)
    时间文本 = 时间文本 + “Aug-”
.判断 (星期 = 9)
    时间文本 = 时间文本 + “Sep-”
.判断 (星期 = 10)
    时间文本 = 时间文本 + “Oct-”
.判断 (星期 = 11)
    时间文本 = 时间文本 + “Nov-”
.判断 (星期 = 12)
    时间文本 = 时间文本 + “Dec-”
.默认

.判断结束
星期 = 取年份 (当前时间)
时间文本 = 时间文本 + 到文本 (星期) + “ ”
星期 = 取小时 (当前时间)
.判断开始 (星期 < 10)
    时间文本 = 时间文本 + “0” + 到文本 (星期) + “:”
.默认
    时间文本 = 时间文本 + 到文本 (星期) + “:”
.判断结束
星期 = 取分钟 (当前时间)
.判断开始 (星期 < 10)
    时间文本 = 时间文本 + “0” + 到文本 (星期) + “:”
.默认
    时间文本 = 时间文本 + 到文本 (星期) + “:”
.判断结束
星期 = 取秒 (当前时间)
.如果 (星期 < 10)
    时间文本 = 时间文本 + “0” + 到文本 (星期) + “ GMT”
.否则
    时间文本 = 时间文本 + 到文本 (星期) + “ GMT”
.如果结束

返回 (时间文本)

HTTP组包

HTTP组包版块代码

.版本 2

.子程序 HTTP_302组包, 字节集
.参数 跳转地址, 文本型

返回 (到字节集 (“HTTP/1.1 302 Object moved” + #换行符 + “Content-Length: 0” + #换行符 + “Location: ” + 跳转地址 + “Content-Type: text/html” + #换行符 + #换行符))

.子程序 HTTP_400组包, 字节集
.参数 返回文本, 文本型

返回 (到字节集 (“HTTP/1.1 400 Not Found” + #换行符 + “Content-Length: ” + 到文本 (取文本长度 (返回文本)) + #换行符 + “Content-Type: text/html” + #换行符 + #换行符 + 返回文本))

.子程序 HTTP_404组包, 字节集
.参数 返回文本, 文本型

返回 (到字节集 (“HTTP/1.1 404 Not Found” + #换行符 + “Content-Length: ” + 到文本 (取文本长度 (返回文本)) + #换行符 + “Content-Type: text/html” + #换行符 + #换行符 + 返回文本))

.子程序 取请求文件后缀
.参数 访问地址, 文本型
.参数 文件后缀, 文本型, 参考 可空, 如html,jpg,css等
.参数 文件类型, 整数型, 参考 可空, 1.网页;2.图片;3.其他;4.未知
.局部变量 局_临时文本, 文本型

.如果 (访问地址 = “/”)
    文件后缀 = “html”
    文件类型 = 1
.否则
    文件后缀 = 文本_取右边 (访问地址, “.”)
    .如果 (到小写 (文件后缀) = “html” 或 到小写 (文件后缀) = “htm” 或 到小写 (文件后缀) = “txt”)
        文件类型 = 1
    .否则
        .如果 (到小写 (文件后缀) = “jpg” 或 到小写 (文件后缀) = “gif” 或 到小写 (文件后缀) = “png” 或 到小写 (文件后缀) = “jpeg”)
            ' 判断数据类型,这里自己写个方法判断吧。我简单写下
            文件类型 = 2
        .否则
            .如果 (到小写 (文件后缀) = “js” 或 到小写 (文件后缀) = “css” 或 到小写 (文件后缀) = “json”)
                文件类型 = 3
            .否则
                文件类型 = 4
                文件后缀 = “html”
            .如果结束

        .如果结束


    .如果结束

.如果结束

数据处理

数据处理版块代码

.版本 2
.支持库 EThread
.支持库 spec

.程序集 数据处理
.程序集变量 变动线程数
.程序集变量 变动线程许可

.子程序 初始化_数据处理集
.局部变量 i, 整数型

.判断开始 (是否为调试版 ())
    i = 20
.默认
    i = 300
.判断结束
数据变动处理许可 = 创建进入许可证 ()
变动线程许可 = 创建进入许可证 ()
数据变动IO = DLL_创建服务 (-1, 0, 0, i)
.计次循环首 (i, i)
    启动线程 (&数据变动处理线程池, i, )
.计次循环尾 ()


.子程序 数据变动处理线程池
.参数 参数序号
.局部变量 a, 整数型
.局部变量 类型type, 整数型
.局部变量 客户指针, 整数型
.局部变量 内存指针, 整数型
.局部变量 客户地址, 文本型
.局部变量 封包文本, 文本型
.局部变量 返回文本, 文本型
.局部变量 封包, 字节集
.局部变量 封包长度, 整数型
.局部变量 文件路径, 文本型
.局部变量 访问地址, 文本型
.局部变量 文件类型, 整数型
.局部变量 文件后缀, 文本型
.局部变量 数据长度, 整数型
.局部变量 POST数据, 文本型

' 调用方式
' PostQueuedCompletionStatus (数据变动IO, 0, 客户句柄, 申请内存_文本 (数据文本))


加载COM (0)
.判断循环首 (a = 0)
    .如果真 (DLL_取投递信息 (数据变动IO, 类型type, 客户指针, 内存指针, -1) = 0)
        到循环尾 ()
    .如果真结束
    .如果真 (类型type = -1)
        返回 ()
    .如果真结束
    .判断开始 (类型type = 0)  ' GET数据到达

        调试输出 (“GET 数据到达 处理”)
        .如果 (内存指针 > 1)  ' 一般不会出现这种情况 但是做个判断还是好的
            封包文本 = 指针到文本 (内存指针)
            客户地址 = 指针到文本 (客户指针)
            释放内存 (内存指针)
            释放内存 (客户指针)
            ' 在这边可以直接处理 但是再去调用事件 是为了方便理解
            ' index.html
            访问地址 = 删全部空 (文本_取出中间文本 (封包文本, “GET”, “HTTP/1.1”))
            ' 简单的提取访问地址跟提交数据
            .判断开始 (文本_取出中间文本 (封包文本, “?”, “HTTP/1.1”) ≠ “”)
                GET_事件 (客户地址, 访问地址, 文本_取出中间文本 (封包文本, “?”, “HTTP/1.1”))

            .默认

            .判断结束

            ' 挺少用到下面的地方,一般都是用于api接口的调用,没怎么去弄页面的返回,写得不对的自己开发下脑子吧


            取请求文件后缀 (访问地址, 文件后缀, 文件类型)
            调试输出 (访问地址, 文件类型, 文件后缀)
            文件路径 = 子文本替换 (访问地址, “/”, “\”, , , 真)

            .判断开始 (文件类型 = 1)
                .如果 (文件路径 = “\” 或 寻找文本 (文件路径, 首页名, , 假) ≠ -1)
                    封包 = 读入文件 (网站根 + “\” + 首页名)
                    封包 = 封包协议数据 (封包, 文件后缀)
                    服务端_发送 (客户地址, 封包, 15)

                .否则
                    .如果 (文件是否存在 (网站根 + 文件路径))
                        封包 = 读入文件 (网站根 + 文件路径)
                        封包 = 封包协议数据 (封包, 文件后缀)
                        服务端_发送 (客户地址, 封包, 15)
                    .否则

                        封包 = HTTP_404组包 (“您访问的页面不存在!”)
                        服务端_发送 (客户地址, 封包, 15)
                    .如果结束

                .如果结束

            .判断 (文件类型 = 2)
                .如果 (文件是否存在 (网站根 + 文件路径))
                    封包 = 读入文件 (网站根 + 文件路径)
                    封包 = 封包协议数据 (封包, 文件后缀)
                    服务端_发送 (客户地址, 封包, 15)

                .否则

                    封包 = HTTP_404组包 (“您访问的页面不存在!”)
                    服务端_发送 (客户地址, 封包, 15)

                .如果结束

            .判断 (文件类型 = 3)
                .如果 (文件是否存在 (网站根 + 文件路径))
                    封包 = 读入文件 (网站根 + 文件路径)
                    封包 = 封包协议数据 (封包, 文件后缀)
                    服务端_发送 (客户地址, 封包, 15)

                .否则

                    封包 = HTTP_404组包 (“您访问的页面不存在!”)
                    服务端_发送 (客户地址, 封包, 15)

                .如果结束

            .判断 (文件类型 = 4)

                封包 = HTTP_404组包 (“您访问的页面不存在!”)
                服务端_发送 (客户地址, 封包, 15)

            .默认

            .判断结束

        .否则


        .如果结束




    .判断 (类型type = 1)  ' POST数据到达

        调试输出 (“POST数据到达 处理”)
        ' 在这边可以直接处理 但是再去调用 事件 是为了方便理解

        .如果 (内存指针 > 1)  ' 一般不会出现这种情况 但是做个判断还是好的
            封包文本 = 指针到文本 (内存指针)
            客户地址 = 指针到文本 (客户指针)
            释放内存 (内存指针)
            释放内存 (客户指针)
            ' 在这边可以直接处理 但是再去调用事件 是为了方便理解
            访问地址 = 删全部空 (文本_取出中间文本 (封包文本, “POST”, “HTTP/1.1”))
            数据长度 = 到整数 (文本_取出中间文本 (封包文本, “Content-Length: ”, #换行符))
            POST数据 = 删全部空 (取文本中间 (封包文本, 取文本长度 (封包文本) - 数据长度, 数据长度 + 1))
            POST数据 = 子文本替换 (POST数据, 字符 (10), , , , 真)
            调试输出 (访问地址, POST数据)

            POST事件 (客户地址, 访问地址, POST数据)

            封包 = 到字节集 (“接收到POST数据”)
            文件后缀 = “html”
            封包 = 封包协议数据 (封包, 文件后缀)
            服务端_发送 (客户地址, 封包, 15)


        .否则


        .如果结束


    .判断 (类型type = 2)  ' TCP数据到达
        ' 在这边可以直接处理 但是再去调用事件 是为了方便理解
        调试输出 (“TCP 数据到达 处理”)
        .如果 (内存指针 > 1)  ' 一般不会出现这种情况 但是做个判断还是好的
            封包 = 指针到字节集 (内存指针, 封包长度)
            客户地址 = 指针到文本 (客户指针)
            释放内存 (内存指针)
            释放内存 (客户指针)
            ' 在这边可以直接处理 但是再去调用事件 是为了方便理解

            ' TCP_事件 ()


        .否则

        .如果结束

    .默认

    .判断结束

.判断循环尾 ()
卸载COM ()

成品代码

Last modification:July 21st, 2020 at 10:50 am
如果觉得我的文章对你有用,请随意赞赏