赞 | 0 |
VIP | 2 |
好人卡 | 27 |
积分 | 1 |
经验 | 26327 |
最后登录 | 2019-10-13 |
在线时间 | 953 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 110
- 在线时间
- 953 小时
- 注册时间
- 2007-4-25
- 帖子
- 805
|
给个方向吧,实际应用时还需要处理很多东西:- wsa_startup = Win32API.new('ws2_32', 'WSAStartup', 'ip', 'i')
- wsa_cleanup = Win32API.new('ws2_32', 'WSACleanup', 'v', 'i')
- get_addr_info = Win32API.new('ws2_32', 'getaddrinfo', 'pppp', 'i')
- free_addr_info = Win32API.new('ws2_32', 'freeaddrinfo', 'l', 'v')
- socket = Win32API.new('ws2_32', 'socket', 'iii', 'l')
- closesocket = Win32API.new('ws2_32', 'closesocket', 'l', 'i')
- connect = Win32API.new('ws2_32', 'connect', 'lli', 'i')
- send = Win32API.new('ws2_32', 'send', 'lpii', 'i')
- recv = Win32API.new('ws2_32', 'recv', 'lpii', 'i')
- move_memory = Win32API.new('kernel32', 'RtlMoveMemory', 'pll', 'v')
- BUF_LEN = 16
- buf = "\000" * BUF_LEN
- praw_addr_info = "\000\000\000\000"
- raw_addr_info = "\000" * 32
- http_response = ''
- http_request = <<EOR
- GET http://rpg.blue/uc_server/data/avatar/000/05/63/75_avatar_middle.jpg HTTP/1.1
- Host: rpg.blue
- Connection: close
- EOR
- wsa_startup.call(0x0202, "\000" * 400)
- get_addr_info.call('rpg.blue', 'http', 0, praw_addr_info)
- raw_addr_info_addr = praw_addr_info.unpack('l')[0]
- move_memory.call(raw_addr_info, raw_addr_info_addr, 32)
- addr_info = raw_addr_info.unpack('iiiillll')
- sock = socket.call(addr_info[1], addr_info[2], addr_info[3])
- connect.call(sock, addr_info[6], addr_info[4])
- send.call(sock, http_request, http_request.length, 0)
- loop do
- byte_count = recv.call(sock, buf, BUF_LEN, 0)
- break if byte_count <= 0
- http_response += buf[0, byte_count]
- end
- free_addr_info.call(raw_addr_info_addr)
- closesocket.call(sock)
- wsa_cleanup.call
- response_headers = http_response.split(/\r\n/)
- image_data = response_headers[-1]
- open('1.jpg', 'wb') do |jpeg|
- jpeg << image_data
- end
复制代码 打开一个 Socket,发送 HTTP 请求,接收 HTTP 响应中的图像数据。实际应用时,需要处理 Winsock 函数可能导致的各种错误;BUF_LEN 是每次接收数据的缓冲区大小,可以调整到 1024 左右;http_request 是实际的 HTTP 请求行、报头以及可能的正文,这里给了一个很简单的 GET,根据需要可以添加其它报头。
最后的 image_data 接收到了完整的图像数据,这段代码通过 Kernel#open 函数保存到了当前目录的 1.jpg。你可以选择把游戏目录下的某个目录作为临时目录保存这个图像,或者通过 Windows API 的 GetTempPath 和 GetTempFileName 保存到系统临时目录,然后用 RGSS 的 Bitmap.new 去创建位图并显示,或者在内存中直接处理图像数据——由于数据是 jpg 格式,你还需要解码、解压为 RMXP 使用的 32 位位图格式,然后给拷贝到一个已有的 Bitmap 对象的位图数据缓冲区中(参见柳之一的 Bitmap Marshal)。 |
评分
-
查看全部评分
|