Project1

标题: HTTP网络通信模块(外部EXE程序) [打印本页]

作者: 不死鸟之翼    时间: 2015-2-22 17:07
标题: HTTP网络通信模块(外部EXE程序)
本帖最后由 不死鸟之翼 于 2015-5-17 12:38 编辑

    应朋友的要求随手写的一个小程序,封装了基于WinInet系列API实现的HTTP协议,可以较为简单地实现RM的异步网络通信功能。
    该模块主要解决了在RM中直接调用网络相关API的“10秒杀”问题。为了更易于使用,放弃了Win32中的IPC机制,改用命令行或者文件进行通信。

当前版本:Version 0.3 (201KB)
更新命令行直接文件下载功能。

https://azurefx.name/article/%e9 ... %e6%a8%a1%e5%9d%97/
使用方法如下(2楼和5楼直接给出了在RGSS环境下的具体代码实现,可以参考)

★用法1:命令行简易模式
直接用参数启动程序就可以完成将文件下载到指定路径。
"RMHttpDelegate.exe SourceURL DestiniationPath"
其中SourceURL为源URL地址,DestinationPath为保存文件路径
例如
"RMHttpDelegate.exe http://www.baidu.com PageSource.txt"

★用法2:后台服务模式 (RGSS端代码范例参见5楼)
工程启动时执行此模块,参数传入RM自身进程的PID。如"RMHttpDelegate.exe 1234"
推荐在RM工程启动时调用,将始终在后台保持运行状态,RM退出后自动清理资源并退出。内存占用在600KB左右,可以多开游戏而不会相互干扰。
RM需要进行网络通信时,首先获得Temp文件夹的目录,可用GetTempPath API或者%TEMP%环境变量。
在Temp目录创建一个文件RM_HTTP_REQUEST_XXXX,其中XXXX为RM的PID,编码为ANSI
文件总共含4行,分别为Server,Action,Method,Data。Server为服务器地址,Action为请求目标,Method为HTTP请求类型,Data为附加数据(这行可以省略)

示例1:HTTP GET

www.yourserver.com
game/submit.php?score=100
GET

示例2:HTTP POST

www.yourserver.com
game/submit.php
POST
score=100

示例3:获取百度搜索结果的网页源代码

www.baidu.com
s?wd=Hello,World
GET

RM_HTTP_REQUEST_XXXX文件会在请求收到后自动删除,并在原地生成一个RM_HTTP_RESULT_XXXX文件,其内容为Success或者Failure,分别代表成功或失败。如果成功,则还会生成另一个RM_HTTP_CONTENT_XXXX,其内容为获取到的数据。如遇到网络问题导致失败,请在游戏内提示用户并重试。RM_HTTP_REQUEST_XXXX推荐在读取内容后删除。
当游戏进程退出后此模块会一并退出,并自动删除相关的临时文件。
提示:使用GET方法时请不要填写第四行Data。

以上是使用方法,如果有疑问欢迎留言。
作者: ML4455739    时间: 2015-2-22 18:08
本帖最后由 ML4455739 于 2015-2-23 13:47 编辑

楼下已经给出了一套完善的方案,所以敬请无视此楼……
请无视

楼下已经给出了一套完善的方案,所以敬请无视此楼……
作者: 赛露休斯    时间: 2015-2-22 21:13
很好,这样就不用在连接的时候等待了
另外,能不能提供一下RMHttpD_0.2.exe的源码呢?
如果不方便公开的话可以私信我
作者: 不死鸟之翼    时间: 2015-2-22 21:17
赛露休斯 发表于 2015-2-22 21:13
很好,这样就不用在连接的时候等待了
另外,能不能提供一下RMHttpD_0.2.exe的源码呢?
如果不方便公开的话 ...

目前更新很快,已经到0.3了。源码问题私下联系
作者: kuerlulu    时间: 2015-2-22 21:44
给你们个我刚写的配套使用代码【本人的水平拙劣,代码风格奇特,恐不符大众口味,还望见谅。
RUBY 代码复制下载
  1. class Http
  2.   Win32API.new("shell32","ShellExecute","lppppl","l").call(0,0,"RMHttpDelegate.exe","#{$$}",0,0)
  3.   REQUEST = "RM_HTTP_REQUEST_#{$$}"
  4.   RESULT  = "RM_HTTP_RESULT_#{$$}"
  5.   CONTENT = "RM_HTTP_CONTENT_#{$$}"
  6.   PATH = ENV['temp']
  7.   def self.option(*strs)
  8.     File.open("#{PATH}/#{REQUEST}", "w") {|f| f.write(strs.join("\n")) }
  9.   end
  10.   def self.check
  11.     if File.exist?("#{PATH}/#{RESULT}")
  12.       if File.read("#{PATH}/#{RESULT}") == "Success"
  13.         return File.read("#{PATH}/#{CONTENT}")
  14.       end
  15.     end
  16.     return nil
  17.   end
  18.   def self.dispose
  19.     File.delete("#{PATH}/#{REQUEST}") if File.exist?("#{PATH}/#{REQUEST}")
  20.     File.delete("#{PATH}/#{RESULT}")  if File.exist?("#{PATH}/#{RESULT}")
  21.     File.delete("#{PATH}/#{CONTENT}") if File.exist?("#{PATH}/#{CONTENT}")
  22.   end
  23. end
  24. END { Http.dispose }

食用姿势:
第一步 把主L的exe文件下载下来重命名为RMHttpDelegate.exe放到游戏根目录
第二步 仅供参考
  1. Http.option("www.baidu.com", "s?wd=Hello,World", "GET")
  2. switch = false
  3. loop do
  4.   Graphics.update
  5.    Input.update
  6.   if switch && Http.check
  7.     p Http.check
  8.     switch = false
  9.   end
  10. end
复制代码

作者: 赛露休斯    时间: 2015-2-23 22:07
感觉那个临时文件部分有安全隐患,通信的地址,数据都保存在里面,而且是明文,别人很容易获取,也有可能手动伪造个假的。最好能够不通过临时文件,直接与RM进行联系。我觉得RMHttpDelegate可以往这方面改进。
作者: 不死鸟之翼    时间: 2015-2-23 22:45
赛露休斯 发表于 2015-2-23 22:07
感觉那个临时文件部分有安全隐患,通信的地址,数据都保存在里面,而且是明文,别人很容易获取,也有可能手 ...

新的DLL模块已经写好,支持直接通信与多任务并行




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1