Skip to content
Permalink
Branch: master
Find file Copy path
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
55 lines (49 sloc) 2.27 KB
import os, threadpool, asyncdispatch, asyncnet
import protocol
proc connect(socket: AsyncSocket, serverAddr: string) {.async.} =
## Connects the specified AsyncSocket to the specified address.
## Then receives messages from the server continuously.
echo("Connecting to ", serverAddr)
# Pause the execution of this procedure until the socket connects to
# the specified server.
await socket.connect(serverAddr, 7687.Port)
echo("Connected!")
while true:
# Pause the execution of this procedure until a new message is received
# from the server.
let line = await socket.recvLine()
# Parse the received message using ``parseMessage`` defined in the
# protocol module.
let parsed = parseMessage(line)
# Display the message to the user.
echo(parsed.username, " said ", parsed.message)
echo("Chat application started")
# Ensure that the correct amount of command line arguments was specified.
if paramCount() < 2:
# Terminate the client early with an error message if there was not
# enough command line arguments specified by the user.
quit("Please specify the server address, e.g. ./client localhost username")
# Retrieve the first command line argument.
let serverAddr = paramStr(1)
# Retrieve the second command line argument.
let username = paramStr(2)
# Initialise a new asynchronous socket.
var socket = newAsyncSocket()
# Execute the ``connect`` procedure in the background asynchronously.
asyncCheck connect(socket, serverAddr) # Note: see https://bit.ly/2IBIyB2.
# Execute the ``readInput`` procedure in the background in a new thread.
var messageFlowVar = spawn stdin.readLine()
while true:
# Check if the ``readInput`` procedure returned a new line of input.
if messageFlowVar.isReady():
# If a new line of input was returned, we can safely retrieve it
# without blocking.
# The ``createMessage`` is then used to create a message based on the
# line of input. The message is then sent in the background asynchronously.
asyncCheck socket.send(createMessage(username, ^messageFlowVar))
# Execute the ``readInput`` procedure again, in the background in a
# new thread.
messageFlowVar = spawn stdin.readLine()
# Execute the asyncdispatch event loop, to continue the execution of
# asynchronous procedures.
asyncdispatch.poll()
You can’t perform that action at this time.