Moai: графика, которая реагирует на команды через сокеты
Мне нужна программа, которая может создавать предопределенные фигуры на экране в соответствии с командами, которые я посылаю ей через TCP. Я пытаюсь слушать порт и чтобы я мог их использовать. Перед ожиданием команды (по сети) у меня есть команды, необходимые для создания квадрата (я планирую изменить его атрибуты с помощью сетевых команд)
Проблема в том, что он не создает графику и не открывает окно, как должно быть..
require "socket"
require "mime"
require "ltn12"
host = "localhost"
port = "8080"
server, error = socket.bind(host, port)
if not server then print("server: " .. tostring(error)) os.exit() end
screen=MOAISim.openWindow ( "test", 640, 640 )
viewport = MOAIViewport.new (screen)
viewport:setSize ( 640, 640 )
viewport:setScale ( 640, 640 )
layer = MOAILayer2D.new ()
layer:setViewport ( viewport )
MOAISim.pushRenderPass ( layer )
function fillSquare (x,y,radius,red,green,blue)
a = red/255
b = green/255
c = blue/255
MOAIGfxDevice.setPenColor ( a, b, c) -- green
MOAIGfxDevice.setPenWidth ( 2 )
MOAIDraw.fillCircle ( x, y, radius, 4 ) -- x,y,r,steps
end
function onDraw ( )
fillSquare(0,64,64, 0,0,255)
end
scriptDeck = MOAIScriptDeck.new ()
scriptDeck:setRect ( -64, -64, 64, 64 )
scriptDeck:setDrawCallback ( onDraw)
prop = MOAIProp2D.new ()
prop:setDeck ( scriptDeck )
layer:insertProp ( prop )
while 1 do
print("server: waiting for client command...")
control = server:accept()
command, error = control:receive()
print(command,error)
error = control:send("hi from Moai\n")
end
Это ожидание команды от клиента в control = server:accept(), но оно не открывает графическое окно, как должно.. Есть ли какая-либо команда, чтобы заставить его открыться или визуализировать
Спасибо
3 ответа
MOAI не запускает ваши скрипты в отдельном потоке. Блокирующий вызов (server:accept
) или вечный цикл (while true do
) заблокирует ваше приложение MOAI, и оно будет зависать, когда оно навсегда останется в вашем сценарии.
Таким образом, вы должны сделать две вещи:
- Используйте неблокирующие звонки. В этом случае вам нужно установить тайм-аут вашего сервера на 0. Это делает
server:accept
Вернись немедленно. Проверьте возвращаемое значение, чтобы увидеть, есть ли у вас соединение. - Поместите ваш цикл while в сопрограмму и получайте один раз за итерацию.
Вам нужно будет обрабатывать клиента таким же образом, используя неблокирующие вызовы в цикле сопрограммы.
function clientProc(client)
print('client connected:', client)
client:settimeout(0) -- make client socket reads non-blocking
while true do
local command, err = client:receive('*l')
if command then
print('received command:', command)
err = client:send("hi from Moai\n")
elseif err == 'closed' then
print('client disconnected:', client)
break
elseif err ~= 'timeout' then
print('error: ', err)
break
end
coroutine.yield()
end
client:close()
end
function serverProc()
print("server: waiting for client connections...")
server:settimeout(0) -- make server:accept call non-blocking
while true do
local client = server:accept()
if client then
MOAICoroutine.new():run(clientProc, client)
end
coroutine.yield()
end
end
MOAICoroutine.new():run(serverProc)
Установите время ожидания для сокета сервера, так как accept является блокирующим вызовом.
server:settimeout(1)
Спасибо, Грязь... Я обнаружил, что прежде чем ты ответил, так что следующие сопрограммы работает
function threadFunc()
local action
while 1 do
stat, control = server:accept()
--print(control,stat)
while 1 do
if stat then
command, error = stat:receive()
print("Comm: ", command, error)
if command then
stat:close()
print("server: closing connection...")
break
else
break
end
--[[
error = stat:send("hi")
if error then
stat:close()
print("server: closing connection...",error)
break
end ]] --
else
break
end
end
coroutine.yield()
end
end
Это было очень полезно, хотя