【问题标题】:Lua socket.http loads fine from example script, but does not load from third party hostLua socket.http 从示例脚本加载正常,但不能从第三方主机加载
【发布时间】:2013-09-28 02:19:51
【问题描述】:

我正在开发一个由第三方程序托管的 Lua 脚本(一些 .exe 将在我的脚本中调用某个函数)。为了实现我需要的功能(对网络服务进行休息调用以检索某些信息),我想使用socket.http.request

我首先为我想要拨打的电话构建了一个示例脚本:

local io = require("io")
local http = require("socket.http")
local ltn12 = require("ltn12")

local data =  "some data")
local response = {}
socket.http.request({
    method = "POST",
    url = "http://localhost:8080/someServce/rest/commands/someCommand",
    headers = {
            ["Content-Type"] = "application/x-www-form-urlencoded",
            ["Content-Length"] = string.len(data)
        },
    source = ltn12.source.string(data),
    sink = ltn12.sink.table(response)
    })
print(table.concat(response))
print("Done")

这很好用。我得到了我期望的回应。 现在,当我尝试从第三方主机执行此操作时,我首先收到一个错误:

 module 'socket.http' not found:
    no field package.preload['socket.http']
    no file '.\socket\http.lua'
    no file 'D:\SomeFolder\lua\socket\http.lua'
    no file 'D:\SomeFolder\lua\socket\http\init.lua'
    no file 'D:\SomeFolder\socket\http.lua'
    no file 'D:\SomeFolder\socket\http\init.lua'
    no file 'C:\Program Files (x86)\Lua\5.1\lua\socket\http.luac'
    no file '.\socket\http.dll'
    no file 'D:\SomeFolder\socket\http.dll'
    no file 'D:\SomeFolder\loadall.dll'
    no file '.\socket.dll'
    no file 'D:\SomeFolder\socket.dll'
    no file 'D:\SomeFolder\loadall.dll'

我尝试将套接字文件夹从 LUA 文件夹复制到主机正在执行的文件夹 (D:\SomeFolder)。然后它找到了该模块,但由于另一个错误而无法加载它:

loop or previous error loading module 'socket.http'

我还尝试将 require 语句移到函数之外并使其全局化。这给了我另一个错误:

 module 'socket.core' not found:
    no field package.preload['socket.core']
    no file '.\socket\core.lua'
    no file 'D:\SomeFolder\lua\socket\core.lua'
    no file 'D:\SomeFolder\lua\socket\core\init.lua'
    no file 'D:\SomeFolder\socket\core.lua'
    no file 'D:\SomeFolder\socket\core\init.lua'
    no file 'C:\Program Files (x86)\Lua\5.1\lua\socket\core.luac'
    no file 'C:\Program Files (x86)\Lua\5.1\lua\socket\core.lua'
    no file '.\socket\core.dll'
    no file 'D:\SomeFolder\socket\core.dll'
    no file 'D:\SomeFolder\loadall.dll'
    no file '.\socket.dll'
    no file 'D:\SomeFolder\socket.dll'
    no file 'D:\SomeFolder\loadall.dll'

然后我尝试将 core.dll 从 socket 复制到 D:\SomeFolder 文件夹中,它给了我另一个错误:

error loading module 'socket.core' from file '.\socket\core.dll':
    %1 is not a valid Win32 application.

现在我被困住了。我想我一定是在做完全错误的事情,但是我找不到任何关于如何解决此类问题的正确描述。谁能帮帮我?

【问题讨论】:

  • 第三方主机运行的是什么操作系统?
  • @luastoned:目前一切都在 Windows 上运行。我正在自己的 Windows 7 系统上解决这个问题。

标签: lua luasocket


【解决方案1】:

事实证明,Lua 寻找的实际路径就是这里的问题。我们与第三方一起发现,如果我们将一组库放在D:\SomeFolder\ 中,现在一切正常。例如,D:\SomeFolder\ 中现在有一个 socket.lua,那里也有一个 socket 和一个 mime forlder。

经验法则似乎是应用程序绑定的 lua5.1.dll 的位置领先于您要加载的任何模块的位置。

【讨论】:

    【解决方案2】:

    您可能需要具有以下文件夹结构(相对于您的 D:\SomeFolder 文件夹):

    socket.lua
    socket/core.dll
    socket/http.lua
    socket/url.lua
    socket/<any other file from socket folder required by http.lua>
    

    我刚刚测试了这个配置,它对我有用。

    循环或上一个错误加载模块'socket.http'

    这通常是由于从socket/http.lua 文件本身加载socket.http 引起的。

    【讨论】:

      猜你喜欢
      • 2017-01-20
      • 1970-01-01
      • 2015-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-08
      相关资源
      最近更新 更多