Skip to content

Commit

Permalink
First commit (Ch3 chat app).
Browse files Browse the repository at this point in the history
  • Loading branch information
dom96 committed Apr 28, 2016
0 parents commit e5d359b
Show file tree
Hide file tree
Showing 3 changed files with 68 additions and 0 deletions.
28 changes: 28 additions & 0 deletions Chapter3/ChatApp/src/client.nim
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import os, threadpool, asyncnet, asyncdispatch, protocol

proc connect(socket: AsyncSocket, serverAddr: string) {.async.} =
echo("Connecting to ", serverAddr)
await socket.connect(serverAddr, 7687.Port)
echo("Connected!")
while true:
let line = await socket.recvLine()
let parsed = parseMessage(line)
echo(parsed.username, " said ", parsed.message)

echo("Chat application started")

if paramCount() == 0:
quit("Please specify the server address")

let serverAddr = paramStr(1)
var socket = newAsyncSocket()

asyncCheck connect(socket, serverAddr)
var messageFlowVar = spawn stdin.readLine()
while true:
if messageFlowVar.isReady():
let message = createMessage("Anonymous", ^messageFlowVar)
asyncCheck socket.send(message)
messageFlowVar = spawn stdin.readLine()

asyncdispatch.poll()
39 changes: 39 additions & 0 deletions Chapter3/ChatApp/src/protocol.nim
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import json
type
Message* = object
username*: string
message*: string

proc parseMessage*(data: string): Message =
let dataJson = parseJson(data)
result.username = dataJson["username"].getStr()
result.message = dataJson["message"].getStr()

proc createMessage*(username, message: string): string =
result = $(%{
"username": %username,
"message": %message
}) & "\c\l"

when isMainModule:
block:
let data = """{"username": "John", "message": "Hi!"}"""
let parsed = parseMessage(data)
doAssert parsed.username == "John"
doAssert parsed.message == "Hi!"

block:
let data = """foobar"""
try:
let parsed = parseMessage(data)
doAssert false
except JsonParsingError:
doAssert true
except:
doAssert false

block:
let expected = """{"username":"dom","message":"hello"}""" & "\c\l"
doAssert createMessage("dom", "hello") == expected

echo("All tests passed!")
1 change: 1 addition & 0 deletions Chapter3/ChatApp/src/server.nim
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
import asyncdispatch, asyncnettype Client = ref object socket: AsyncSocket netAddr: string id: int connected: bool Server = ref object socket: AsyncSocket clients: seq[Client]proc newServer(): Server = Server(socket: newAsyncSocket(), clients: @[])proc `$`(client: Client): string = $client.id & "(" & client.netAddr & ")"proc processMessages(server: Server, client: Client) {.async.} = while true: let line = await client.socket.recvLine() if line.len == 0: echo(client, " disconnected!") client.connected = false client.socket.close() return echo(client, " sent: ", line)proc loop(server: Server, port = 7687) {.async.} = server.socket.bindAddr(port.Port) server.socket.listen() while true: let (netAddr, clientSocket) = await server.socket.acceptAddr() echo("Accepted connection from ", netAddr) let client = Client( socket: clientSocket, netAddr: netAddr, id: server.clients.len, connected: true ) server.clients.add(client) asyncCheck processMessages(server, client)var server = newServer()waitFor loop(server)
Expand Down

0 comments on commit e5d359b

Please sign in to comment.