设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2424|回复: 6
打印 上一主题 下一主题

[通用发布] HTTP网络通信模块(外部EXE程序)

[复制链接]

Lv3.寻梦者

梦石
0
星屑
1803
在线时间
133 小时
注册时间
2013-10-6
帖子
193
跳转到指定楼层
1
发表于 2015-2-22 17:07:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 不死鸟之翼 于 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。

以上是使用方法,如果有疑问欢迎留言。

评分

参与人数 2星屑 +60 收起 理由
imsy + 30 又到了大角虫们出来收膝盖的季节.
ML4455739 + 30 精品文章

查看全部评分

←你看到一只经常潜水的萌新。

Lv2.观梦者

梦石
0
星屑
672
在线时间
2184 小时
注册时间
2009-12-6
帖子
607

开拓者

2
发表于 2015-2-22 18:08:58 | 只看该作者
本帖最后由 ML4455739 于 2015-2-23 13:47 编辑

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

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

点评

ML大触何必如此…   发表于 2015-2-23 15:42
……请不要这样  发表于 2015-2-22 18:23
ML大触何必如此…  发表于 2015-2-22 18:21

评分

参与人数 1星屑 +30 收起 理由
kuerlulu + 30 手滑

查看全部评分

往事简直不堪回首,稍微做点想做的事吧
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
167
在线时间
434 小时
注册时间
2009-1-1
帖子
643
3
发表于 2015-2-22 21:13:51 | 只看该作者
很好,这样就不用在连接的时候等待了
另外,能不能提供一下RMHttpD_0.2.exe的源码呢?
如果不方便公开的话可以私信我

评分

参与人数 1星屑 +30 收起 理由
kuerlulu + 30 手滑

查看全部评分

最近在研究XAS
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1803
在线时间
133 小时
注册时间
2013-10-6
帖子
193
4
 楼主| 发表于 2015-2-22 21:17:25 | 只看该作者
赛露休斯 发表于 2015-2-22 21:13
很好,这样就不用在连接的时候等待了
另外,能不能提供一下RMHttpD_0.2.exe的源码呢?
如果不方便公开的话 ...

目前更新很快,已经到0.3了。源码问题私下联系
←你看到一只经常潜水的萌新。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
76
在线时间
1379 小时
注册时间
2012-7-5
帖子
1698

开拓者

5
发表于 2015-2-22 21:44:13 | 只看该作者
给你们个我刚写的配套使用代码【本人的水平拙劣,代码风格奇特,恐不符大众口味,还望见谅。
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 14:17
嗯第一次的switch应该=true•﹏•  发表于 2015-2-23 11:15
就等着呢,造福R界  发表于 2015-2-22 21:48
赞!ww  发表于 2015-2-22 21:47

  -fk: -azogi:
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
167
在线时间
434 小时
注册时间
2009-1-1
帖子
643
6
发表于 2015-2-23 22:07:24 | 只看该作者
感觉那个临时文件部分有安全隐患,通信的地址,数据都保存在里面,而且是明文,别人很容易获取,也有可能手动伪造个假的。最好能够不通过临时文件,直接与RM进行联系。我觉得RMHttpDelegate可以往这方面改进。
最近在研究XAS
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1803
在线时间
133 小时
注册时间
2013-10-6
帖子
193
7
 楼主| 发表于 2015-2-23 22:45:08 | 只看该作者
赛露休斯 发表于 2015-2-23 22:07
感觉那个临时文件部分有安全隐患,通信的地址,数据都保存在里面,而且是明文,别人很容易获取,也有可能手 ...

新的DLL模块已经写好,支持直接通信与多任务并行
←你看到一只经常潜水的萌新。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-22 02:48

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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