1

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()でクライアントからのコマンドを待機していますが、グラフィックウィンドウを適切に開いていません。強制的に開いたりレンダリングしたりするコマンドはありますか?

ありがとうございました

4

3 に答える 3

2

MOAIは、スクリプトを別のスレッドで実行しません。呼び出しをブロックする(server:accept)または無限ループ(while true do)を実行すると、MOAIアプリがブロックされ、スクリプトに永久に存在する間、アプリがフリーズしたように見えます。

したがって、2つのことを行う必要があります。

  1. ノンブロッキングコールを使用します。この場合、サーバーのタイムアウトを0に設定する必要があります。これにより、server:acceptすぐに戻ります。戻り値をチェックして、接続が確立されているかどうかを確認します。
  2. whileループをコルーチンに入れ、反復ごとに1回生成します。

コルーチンループで非ブロッキング呼び出しを使用して、クライアントを同じ方法で処理する必要があります。

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)
于 2012-07-12T17:37:19.830 に答える
0

acceptはブロッキング呼び出しであるため、サーバーソケットのタイムアウトを設定します。

server:settimeout(1)
于 2012-07-12T22:52:46.357 に答える
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

それは非常に役に立ちました

于 2012-07-13T09:47:54.187 に答える