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

Project1

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

[通用发布] 异步可并发HTTP通信库(更新:可获取下载进度、取消操作)

[复制链接]

Lv1.梦旅人

路人党员

梦石
0
星屑
51
在线时间
2276 小时
注册时间
2010-12-30
帖子
3225
1
发表于 2015-3-17 22:55:06 | 显示全部楼层
kuerlulu 发表于 2015-2-24 15:04
发一个我刚写的Http#用之前先把上一个exe版本的Http删掉【本人的水平拙劣,代码风格奇特,恐不符大众口味, ...

帮你改进了一些==
  1. class HTTP
  2.   Create   = Win32API.new('AHttp.dll', 'Create',   'pppp',   'l')
  3.   CreateEx = Win32API.new('AHttp.dll', 'CreateEx', 'pppppp', 'l')
  4.   Query    = Win32API.new('AHttp.dll', 'QueryEx',  'lpp',    'i')
  5.   Retrieve  = Win32API.new('AHttp.dll', 'Retrieve', 'lp',     'i')
  6.   Close    = Win32API.new('AHttp.dll', 'Close',    'l',      'l')
  7.   INVALID  = 0;    SUCCESS = 1;    FAILURE = 2;    PENDING = 3
  8.   def initialize(type, server, action, meth, data, ctype = "", browser = "")
  9.     @token = type == 0 ?
  10.               Create.call(server, action, meth, data) :
  11.               CreateEx.call(server, action, meth, ctype, browser)
  12.     @total = [0].pack("L")
  13.     @loaded = [0].pack("L")
  14.   end
  15.   def total_bytes
  16.     query
  17.     return @total.unpack("L").first
  18.   end
  19.   def loaded_bytes
  20.     query
  21.     return @loaded.unpack("L").first
  22.   end
  23.   def query
  24.     Query.call(@token, @total, @loaded)
  25.   end
  26.   def retrieve
  27.     if query == SUCCESS
  28.       length = Retrieve.call(@token, 0)
  29.       buffer = "\0" * length
  30.       Retrieve.call(@token, buffer)
  31.       return buffer
  32.     end
  33.   end
  34.   def close
  35.     Close.call(@token)
  36.   end
  37.   def self.create(server, action, meth, data={})
  38.     @conn = new(0, server, action, meth, data_encode(data))
  39.     if block_given?
  40.       yield @conn
  41.       @conn.close
  42.     else
  43.       return @conn
  44.     end
  45.   end
  46.   def self.create_ex(server, action, meth, ctype, browser, data={})
  47.     @conn = new(0, server, action, meth, data_encode(data), ctype, browser)
  48.     if block_given?
  49.       yield @conn
  50.       @conn.close
  51.     else
  52.       return @conn
  53.     end
  54.   end
  55.   def self.data_encode(data)
  56.     d = ""
  57.     data.each_pair do |k, v|
  58.       d += "%" + k.to_s.unpack("C*").map{|s|s.to_s(16)}.join("%") + "="
  59.       d += "%" + v.to_s.unpack("C*").map{|s|s.to_s(16)}.join("%") + "&"
  60.     end
  61.     return d.sub(/.$/, "")
  62.   end
  63.   private_class_method :new, :data_encode
  64. end
复制代码

  1. s = Sprite.new
  2. b = Bitmap.new(640, 32)
  3. s.bitmap = b
  4. #HTTP.create("localhost", "projects/test.php", "POST", {"test"=>"hahahaha"}){ |h|
  5. HTTP.create("rpg.blue", "forum.php", "GET"){ |h|
  6.         while(!h.retrieve)
  7.     b.clear
  8.     b.draw_text(0,0, 640, 32, "#{h.query}:#{h.loaded_bytes}/#{h.total_bytes}")
  9.     Graphics.update
  10.         end
  11.   b.clear
  12.   b.draw_text(0,0, 640, 32, "#{h.query}:#{h.loaded_bytes}/#{h.total_bytes}")
  13.   Graphics.update
  14.         print(h.retrieve)
  15. }
  16. exit
复制代码

评分

参与人数 1星屑 +30 收起 理由
kuerlulu + 30 棒棒哒

查看全部评分

本人擅长XP,如果有脚本或者Ruby方面的问题欢迎发电邮到[email protected]咨询,本人很少检查电邮所以不一定会及时回复,本人不会直接出手解决问题只会提供一个方向,所以谢绝伸手党
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-5-8 01:19

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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