|
// retoor <retoor@molodetz.nl>
|
|
import "net" for Server, Socket
|
|
import "scheduler" for Scheduler
|
|
|
|
class ChatServer {
|
|
construct new(port) {
|
|
_port = port
|
|
_clients = []
|
|
_server = Server.bind("0.0.0.0", port)
|
|
System.print("Chat Server listening on port %(_port)")
|
|
}
|
|
|
|
run() {
|
|
while (true) {
|
|
var socket = _server.accept()
|
|
handleNewClient(socket)
|
|
}
|
|
}
|
|
|
|
handleNewClient(socket) {
|
|
_clients.add(socket)
|
|
var id = _clients.count
|
|
System.print("Client %(id) connected. Total: %(_clients.count)")
|
|
|
|
Fiber.new {
|
|
broadcast("Client %(id) joined the chat!\n", socket)
|
|
|
|
while (true) {
|
|
var message = socket.read()
|
|
if (message == null || message == "") break
|
|
|
|
System.print("Client %(id): %(message.trim())")
|
|
broadcast("Client %(id): %(message)", socket)
|
|
}
|
|
|
|
System.print("Client %(id) disconnected.")
|
|
_clients.remove(socket)
|
|
socket.close()
|
|
broadcast("Client %(id) left the chat.\n", null)
|
|
}.call()
|
|
}
|
|
|
|
broadcast(message, sender) {
|
|
for (client in _clients) {
|
|
if (client != sender) {
|
|
// We use a separate fiber for each write to prevent one slow
|
|
// client from blocking the broadcast to others
|
|
Fiber.new {
|
|
client.write(message)
|
|
}.call()
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
var server = ChatServer.new(7070)
|
|
server.run()
|