Skip to content

Instantly share code, notes, and snippets.

@dom96
Created June 4, 2015 18:15

Revisions

  1. dom96 revised this gist Jun 4, 2015. 2 changed files with 42 additions and 41 deletions.
    38 changes: 16 additions & 22 deletions server.nim
    Original file line number Diff line number Diff line change
    @@ -1,35 +1,29 @@
    import os, threadpool, asyncnet, asyncdispatch

    import os, asyncnet, asyncdispatch
    type
    CBOnClientMessage* = proc(message: string)

    var
    onClientMessage {.threadVar.} : CBOnClientMessage # want to shared this
    sockServer: AsyncSocket # want to share this also

    proc handleClient(sockClient: AsyncSocket) {.async.} =

    proc handleClient(sockClient: AsyncSocket, cb: CBOnClientMessage) {.async.} =
    while true:
    let line = await sockClient.recvLine()
    if "" == line:
    break
    await sockClient.send("TOKEN")
    onClientMessage(line)
    cb(line)
    echo(line)
    sockClient.close()

    proc startServerTask(port: int, cb: CBOnClientMessage) {.thread.} =
    var sockServer = newAsyncSocket()

    proc startServerTask*(sockServer: AsyncSocket, port: int, cb: CBOnClientMessage) {.async.} =
    echo("Server starting")

    sockServer.bindAddr(port.Port)
    sockServer.listen()

    while true:
    let sockClient = waitFor(sockServer.accept())
    asyncCheck handleClient(sockClient)
    echo("Waiting for client")
    let sockClient = await sockServer.accept()
    asyncCheck handleClient(sockClient, cb)
    sockServer.close()

    proc stopServer*(sockServer: AsyncSocket) =
    sockServer.close()

    proc startServer*(port: int, cb: CBOnClientMessage) =
    onClientMessage = cb
    spawn startServerTask(port, cb)

    proc stopServer*() =
    sockServer.close()
    45 changes: 26 additions & 19 deletions servergui.nim
    Original file line number Diff line number Diff line change
    @@ -1,38 +1,40 @@
    import asyncdispatch
    import threadpool
    import asyncnet
    import iup
    import server

    const SERVER_PORT = 1987

    var sockServer = newAsyncSocket()

    proc updateChatBox(message: string) =
    var textChatBox = getHandle("textChatBox")
    setAttribute(textChatBox, "VALUE", message)
    # echo(message)

    proc updateStatusBarMessage(message: string) =
    var labelStatusBar = getHandle("labelStatusBar")
    setAttribute(labelStatusBar, "TITLE", message)

    proc onButtonStart(handle: PIhandle) :cint {.cdecl.} =
    var buttonStart = getHandle("buttonStart")
    var buttonStop = getHandle("buttonStop")
    setAttribute(buttonStart, "ACTIVE", "NO")
    setAttribute(buttonStop, "ACTIVE", "YES")
    startServer(SERVER_PORT, updateChatBox)
    asyncCheck startServerTask(sockServer, SERVER_PORT, updateChatBox)
    return IUP_DEFAULT

    proc onButtonStop(handle: PIhandle) :cint {.cdecl.} =
    var buttonStart = getHandle("buttonStart")
    var buttonStop = getHandle("buttonStop")
    setAttribute(buttonStart, "ACTIVE", "YES")
    setAttribute(buttonStop, "ACTIVE", "NO")
    stopServerAsync()
    stopServer(sockServer)
    return IUP_DEFAULT

    proc startGUI() =
    discard iup.open(nil, nil)

    var buttonStart = button("start", "onButtonStart")
    var buttonStop = button("stop", "onButtonStop")
    discard setCallback(buttonStart, "ACTION", onButtonStart)
    @@ -41,10 +43,10 @@ proc startGUI() =
    discard setHandle("buttonStop", buttonStop)
    setAttribute(buttonStart, "ACTIVE", "YES")
    setAttribute(buttonStop, "ACTIVE", "NO")

    var textChatBox = text("")
    var labelStatusBar = label("nothing...")

    setAttribute(textChatBox, "MULTILINE", "YES")
    setAttribute(textChatBox, "EXPAND", "YES")
    setAttribute(textChatBox, "APPENDNEWLINE", "YES")
    @@ -54,28 +56,33 @@ proc startGUI() =
    setAttribute(textChatBox, "BGCOLOR", "0 0 0")
    setAttribute(textChatBox, "FGCOLOR", "255 255 255")
    setAttribute(labelStatusBar, "EXPAND", "HORIZONTAL")

    discard setHandle("textChatBox", textChatBox)
    discard setHandle("labelStatusBar", labelStatusBar)

    var hboxTop = hbox(nil)
    discard insert(hboxTop, nil, buttonStop)
    discard insert(hboxTop, nil, buttonStart)

    var vboxMainView = vbox(nil)
    discard insert(vboxMainView, nil, labelStatusBar)
    discard insert(vboxMainView, nil, textChatBox)
    discard insert(vboxMainView, nil, hboxTop)


    var dialogMainWindow = dialog(vboxMainView)
    setAttribute(dialogMainWindow, "TITLE", "server")
    setAttribute(dialogMainWindow, "BORDER", "YES")
    setAttribute(dialogMainWindow, "RESIZE", "NO")
    setAttribute(dialogMainWindow, "SIZE", "QUARTERxQUARTER")

    discard showXY(dialogMainWindow, IUP_CENTER, IUP_CENTER)
    discard mainLoop()
    while true:
    discard loopStep()
    try:
    asyncdispatch.poll(1)
    except ValueError:
    discard
    close()

    startGUI()
    startGUI()
  2. @sepisoad sepisoad revised this gist Jun 4, 2015. 1 changed file with 35 additions and 0 deletions.
    35 changes: 35 additions & 0 deletions server.nim
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,35 @@
    import os, threadpool, asyncnet, asyncdispatch

    type
    CBOnClientMessage* = proc(message: string)

    var
    onClientMessage {.threadVar.} : CBOnClientMessage # want to shared this
    sockServer: AsyncSocket # want to share this also

    proc handleClient(sockClient: AsyncSocket) {.async.} =
    while true:
    let line = await sockClient.recvLine()
    if "" == line:
    break
    await sockClient.send("TOKEN")
    onClientMessage(line)
    echo(line)
    sockClient.close()

    proc startServerTask(port: int, cb: CBOnClientMessage) {.thread.} =
    var sockServer = newAsyncSocket()
    sockServer.bindAddr(port.Port)
    sockServer.listen()

    while true:
    let sockClient = waitFor(sockServer.accept())
    asyncCheck handleClient(sockClient)
    sockServer.close()

    proc startServer*(port: int, cb: CBOnClientMessage) =
    onClientMessage = cb
    spawn startServerTask(port, cb)

    proc stopServer*() =
    sockServer.close()
  3. @sepisoad sepisoad created this gist Jun 4, 2015.
    81 changes: 81 additions & 0 deletions servergui.nim
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,81 @@
    import asyncdispatch
    import threadpool
    import iup
    import server

    const SERVER_PORT = 1987

    proc updateChatBox(message: string) =
    var textChatBox = getHandle("textChatBox")
    setAttribute(textChatBox, "VALUE", message)
    # echo(message)

    proc updateStatusBarMessage(message: string) =
    var labelStatusBar = getHandle("labelStatusBar")
    setAttribute(labelStatusBar, "TITLE", message)

    proc onButtonStart(handle: PIhandle) :cint {.cdecl.} =
    var buttonStart = getHandle("buttonStart")
    var buttonStop = getHandle("buttonStop")
    setAttribute(buttonStart, "ACTIVE", "NO")
    setAttribute(buttonStop, "ACTIVE", "YES")
    startServer(SERVER_PORT, updateChatBox)
    return IUP_DEFAULT

    proc onButtonStop(handle: PIhandle) :cint {.cdecl.} =
    var buttonStart = getHandle("buttonStart")
    var buttonStop = getHandle("buttonStop")
    setAttribute(buttonStart, "ACTIVE", "YES")
    setAttribute(buttonStop, "ACTIVE", "NO")
    stopServerAsync()
    return IUP_DEFAULT

    proc startGUI() =
    discard iup.open(nil, nil)

    var buttonStart = button("start", "onButtonStart")
    var buttonStop = button("stop", "onButtonStop")
    discard setCallback(buttonStart, "ACTION", onButtonStart)
    discard setCallback(buttonStop, "ACTION", onButtonStop)
    discard setHandle("buttonStart", buttonStart)
    discard setHandle("buttonStop", buttonStop)
    setAttribute(buttonStart, "ACTIVE", "YES")
    setAttribute(buttonStop, "ACTIVE", "NO")

    var textChatBox = text("")
    var labelStatusBar = label("nothing...")

    setAttribute(textChatBox, "MULTILINE", "YES")
    setAttribute(textChatBox, "EXPAND", "YES")
    setAttribute(textChatBox, "APPENDNEWLINE", "YES")
    setAttribute(textChatBox, "SCROLLBAR", "YES")
    setAttribute(textChatBox, "AUTOHIDE", "YES")
    setAttribute(textChatBox, "READONLY", "YES")
    setAttribute(textChatBox, "BGCOLOR", "0 0 0")
    setAttribute(textChatBox, "FGCOLOR", "255 255 255")
    setAttribute(labelStatusBar, "EXPAND", "HORIZONTAL")

    discard setHandle("textChatBox", textChatBox)
    discard setHandle("labelStatusBar", labelStatusBar)

    var hboxTop = hbox(nil)
    discard insert(hboxTop, nil, buttonStop)
    discard insert(hboxTop, nil, buttonStart)

    var vboxMainView = vbox(nil)
    discard insert(vboxMainView, nil, labelStatusBar)
    discard insert(vboxMainView, nil, textChatBox)
    discard insert(vboxMainView, nil, hboxTop)


    var dialogMainWindow = dialog(vboxMainView)
    setAttribute(dialogMainWindow, "TITLE", "server")
    setAttribute(dialogMainWindow, "BORDER", "YES")
    setAttribute(dialogMainWindow, "RESIZE", "NO")
    setAttribute(dialogMainWindow, "SIZE", "QUARTERxQUARTER")

    discard showXY(dialogMainWindow, IUP_CENTER, IUP_CENTER)
    discard mainLoop()
    close()

    startGUI()