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

Project1

 找回密码
 注册会员
搜索
查看: 2515|回复: 7

[通用发布] 【Version 2】异步可并发HTTP通信解决方案(不会超时强退)

[复制链接]

Lv3.寻梦者

梦石
0
星屑
1803
在线时间
133 小时
注册时间
2013-10-6
帖子
193
发表于 2016-11-10 12:01:42 | 显示全部楼层 |阅读模式

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

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

x
好像一两年前发过,那个库我觉得有点图样所以就重写了一下,同时自己配了一个Ruby实现,可以实现真·异步通信,不会阻塞正常的流程。

食用姿势大概如下
  1. query=AsHttp::Query.make("http://127.0.0.1","GET")
  2. query.set_header("User-Agent","AsHttp")
  3. query.start{
  4.         if query.finished?
  5.                 p query.data
  6.         else
  7.                 p "Network Error"
  8.         end
  9.         query.finalize
  10. }
复制代码


因为RM的Thread似乎是假的,所以这边采用轮询的方式了
欢迎试用并反馈建议和bug。相关的下载和文档我会更新在blog上,不过因为是Rb封装所以大家看Rb的食用姿势就好,如果C/C++用户的话加个头文件吧

https://azurefx.name/article/win ... %BF%A1%E5%BA%93dll/
←你看到一只经常潜水的萌新。

Lv1.梦旅人

梦石
0
星屑
167
在线时间
434 小时
注册时间
2009-1-1
帖子
643
发表于 2016-11-10 15:18:20 | 显示全部楼层
以前的版本我用过,在windowsXP下会卡死,似乎是缺少运行库
最近在研究XAS
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (版主)

梦石
1
星屑
23963
在线时间
3338 小时
注册时间
2011-7-8
帖子
3925

开拓者

发表于 2017-5-12 00:39:36 | 显示全部楼层
楼主的这个我试了试,感觉很好用,蛮喜欢的。因为我用的是win8/10,所以也没有楼上的问题。

不过我有一个疑问一直不太清楚:

可否利用这个http库,修改header把协议升级成websocket?

不知我的表述是否准确,或者说,如果想在xp/vx/va里实现websocket通讯,什么思路比较合适呢?
熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1803
在线时间
133 小时
注册时间
2013-10-6
帖子
193
 楼主| 发表于 2017-5-29 17:35:21 | 显示全部楼层
guoxiaomi 发表于 2017-5-12 00:39
楼主的这个我试了试,感觉很好用,蛮喜欢的。因为我用的是win8/10,所以也没有楼上的问题。

不过我有一个 ...

不可
因为这里实现的HTTP是一个请求一个响应,无法进行持久TCP连接
如果要做的话你可以从TCP写起,按照RFC的标准做就好了,就是比较麻烦
其实我觉得简易聊天室类应用,轮询就足够了

点评

谢指点迷津!  发表于 2017-5-29 17:47
←你看到一只经常潜水的萌新。
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (版主)

梦石
1
星屑
23963
在线时间
3338 小时
注册时间
2011-7-8
帖子
3925

开拓者

发表于 2017-6-16 22:15:19 | 显示全部楼层
本帖最后由 guoxiaomi 于 2017-6-16 22:29 编辑

刚刚研究出来如何上传和下载文件,其实也没有什么难的地方,这里就作为试用反馈写下来吧!

下载:
1. 准备一个可以访问的地址,比如
  1. http://server.com/test.txt
复制代码

2. 使用 AsHttp,GET 方案
  1. url = "http://server.com/test.txt"
  2. query = AsHttp::Query.make(url, "GET")
  3. query.set_header("User-Agent","AsHttp")
  4. query.set_data("t=#{rand}")
  5.    
  6. query.start{
  7.   if query.finished?
  8.     $data = ""
  9.     $data << query.data
  10.   else
  11.     # produce_network_error
  12.   end
  13.   query.finalize
  14. }
复制代码
3. 上面的请求在成功的时候,就已经把 GET 到的数据写入了 $data 里,下面写入文件 result:
  1. File.open('result', "wb") do |f|
  2.   f << $data
  3. end
复制代码
注意写入模式是 "wb", 然后改一下文件名就行了。除此之外的还有一点是,不要在 start 的 block 里面处理文件的写入,因为这个线程老是动不动就暂停。

上传:
POST 请求分为 header 和 content 两个部分,每个 header 一行一个,换行符是 \r\n,当遇到连续两个 \r\n 时,header 部分结束,后面的数据全部是 content。

对于一般的 post 请求, content 里面就是跟 get 请求一样的一行字符串,只是 get 请求是串在地址后面。
但是上传文件的 post 请求,就要使用到 boundary。boundary 的规则是这样的:
1. header Content-Type 中要设置好 boundary 的值,一般取30-40长度的随机字符串
2. content 的第一行是 boundary,但是前面要加 '--'。
3. content 的最后一行也是 boundary,但是前后都要加 '--'。

所以先设置好 header,接着是一个空行,然后是 boundary 和文件属性、文件大小、文件内容以及结尾的 boundary 。

用 ashttp 库里面的方法就是这样做的,提供了两个方法:set_header 和 set_data 。
"脑补"


如此写代码就可以生成一个提交文件的 POST 请求。
  1. file = File.open(filename, "rb")
  2.   filedata = ""
  3.   filedata << file.read
  4. file.close

  5. url = "http://server.com/recieve.php" # url 换成自己要用的 url # 没错,PHP 就是最好的语言! # 划掉
  6. query = AsHttp::Query.make(url,"POST")
  7. query.set_header("User-Agent", "AsHttp")
  8. boundary = '-------------------BZuyg871afvOGVui'
  9. query.set_header("Content-Type", "multipart/form-data;boundary=#{boundary}")

  10. post_data = ""
  11. post_data << "--" << boundary << "\r\n"
  12. post_data << "Content-Disposition: form-data; name=\"file\"; filename=\"#{filename}\"\r\n"
  13. post_data << "Content-Type: text/plain\r\n"
  14. post_data << "\r\n"
  15. post_data << filedata
  16. post_data << "\r\n--" << boundary << "--"

  17. query.set_data(post_data)
  18. query.start
复制代码


至于服务端如何读取文件,那个就跟这个库没有关系了。
熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复 支持 1 反对 0

使用道具 举报

Lv5.捕梦者 (暗夜天使)

只有笨蛋才会看到

梦石
1
星屑
20915
在线时间
9331 小时
注册时间
2012-6-19
帖子
7105

开拓者短篇九导演组冠军

发表于 2019-5-8 14:38:51 | 显示全部楼层
guoxiaomi 发表于 2017-6-16 22:15
刚刚研究出来如何上传和下载文件,其实也没有什么难的地方,这里就作为试用反馈写下来吧!

下载:

snipaste_20190508_143531.png

试着在用这个库,直接照着测试用例的代码获取 baidu 首页,但是对应的结果一直没有输出出来

插入了一些输出之后发现流程卡在了获取 data 这一步
后台输出 1、2、3 以后就停了流程没有继续往下走,你有遇到这种问题吗?


点评

有,应该是产生buffer的代码不适用va,看一下我签名里的rgsos里面的具体写法吧?  发表于 2019-5-8 20:26
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-4-19 04:22

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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