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, и оно будет зависать, когда оно навсегда останется в вашем сценарии.

Таким образом, вы должны сделать две вещи:

  1. Используйте неблокирующие звонки. В этом случае вам нужно установить тайм-аут вашего сервера на 0. Это делает server:accept Вернись немедленно. Проверьте возвращаемое значение, чтобы увидеть, есть ли у вас соединение.
  2. Поместите ваш цикл 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

Это было очень полезно, хотя

Другие вопросы по тегам