您的位置:首页 > 编程语言 > Lua

lua中配置luasocket,并且做成一个socket服务器,主要用于(D'Fusion Studio)中

2012-08-10 14:20 316 查看
首先,去luasocket官方网站下载,http://files.luaforge.net/releases/luasocket/luasocket/luasocket-2.0.2,我下载的版本是luasocket-2.0.2-lua-5.1.2-Win32-vc8.zip,能够很好的支持lua5.1.

如图所示:

在你的工程中需要加入lua文件夹,mime文件夹,socket文件夹,我的开发工具主要是D'Fusion Studio,主要用来做增强现实的。我把它们放到我的工程的lib文件夹中。

直接就是我做的一个监听服务器,上代码如下,这样我们在来慢慢说需要注意的地方:

local scriptPath = getScriptDirectory()
LOG(scriptPath)

local lua_cpath1 = scriptPath.."lib\\?.dll"  --路径设置是一定要是这样设置,否则会出现错误,要不在查找“socket.core"出现错误
local lua_path1 = scriptPath.."lib\\lua\\?.lua;"..scriptPath.."lib\\lua\\socket\\?.lua"
--LOG(package.cpath)
--LOG("\n\n")
--LOG(package.path)
package.path = package.path ..";"..lua_path1
package.cpath = package.cpath ..";"..lua_cpath1

local socket = require('socket')
LOG("Socket Version: "..socket._VERSION)
local port = 8885

local server = assert(socket.bind("192.168.110.82",port))

local i,p = server:getsockname()
server:settimeout(0)--设置超时时间为0,这样就可以为非阻塞
assert(i, p)
LOG("Waiting connection from talker on " .. i .. ":" .. p .. "...")

local client = {}
local clientCount = 0
repeat
--LOG("START")
--server:settimeout(0)
local c = server:accept()
coroutine.yield()
--coroutine.yield()

if c then
local clientStr = c:getpeername()
LOG("Connected. Here is the stuff:"..clientStr)
clientCount = clientCount+1
client[clientCount] = c
LOG("clientCount:"..clientCount)
end

--coroutine.yield()
--coroutine.yield()

for n,user in pairs(client) do
--LOG("n = "..n)
user:settimeout(0)--需要这一个
local l, e = user:receive()
if l then
LOG(l)--打印l发送过来的值  e为错误信息
local recStr = "Receiveing:"..l
text:setText(recStr)
if e then
LOG("value = "..e )
end
end

end

until coroutine.yield()

需要注意的地方:

1、环境变量配置。我在这直接更改的lua的运行环境变量。

local lua_cpath1 = scriptPath.."lib\\?.dll" --路径设置是一定要是这样设置,否则会出现错误,要不在查找“socket.core"出现错误
local lua_path1 = scriptPath.."lib\\lua\\?.lua;"..scriptPath.."lib\\lua\\socket\\?.lua"
package.path = package.path ..";"..lua_path1
package.cpath = package.cpath ..";"..lua_cpath1

要特别注意配置dll路径的时候,必须要配置成scriptPath.."lib\\?.dll" ,"<scriptPath>\lib\"中放着luasocket的3个文件夹,只有这样配置才能运行成功,因为在socket.lua文件中有一个require(“socket.core"),当调用它时,它就会自动的到<scriptPath>\lib\socket\core.dll中查找相关的函数。如果对这部分不懂的话,查找相关require的用法。
2、server:settimeout(0)与user:settimeout(0),设置这一部分之后,程序就会成为非阻塞的。
3、最为重要的,当客户端像此服务器发送消息的时候,发送的文本必须以'\n'结束,否则服务器这边将收不到消息。这部分我当时不知道调试了很久才调试成功的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐