2012-07-12 41 views
1

我需要一個程序,可以根據我通過TCP發送給它的命令在屏幕上創建預定義的形狀。 我試圖聽一個端口,以便我可以使用它們。在等待一個命令(通過網絡)之前,我有創建一個正方形所需的命令(我計劃通過網絡命令更改它的屬性)Moai:通過套接字響應命令的圖形

問題是它不會創建任何圖形或打開窗口,因爲它應該是..

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 

它是由客戶端在控制等待命令=服務器:接受(),但它應該..是否有任何命令,迫使它打開或使其不開放圖形窗口

謝謝

回答

2

M OAI不會在單獨的線程中運行腳本。阻止呼叫(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) 
+0

謝謝泥這個協同程序代碼工作 – 2012-07-13 09:44:53

0

設置服務器套接字的超時時間,因爲accept是阻塞調用。

server:settimeout(1) 
+0

他同時循環將停止塊MOAI。 – Mud 2012-07-13 01:20:09

0

感謝泥......我發現,ü回答之前,所以下面的協同程序的工作原理

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 

這是非常有益的,雖然

+0

你在MOAI論壇上發現的帖子也是我的。 :) – Mud 2012-07-13 14:12:52