Skip to content

Instantly share code, notes, and snippets.

@cilquirm
Last active August 19, 2025 16:29
Show Gist options
  • Save cilquirm/52ea875b6144ff3a7fbdb63558202bb4 to your computer and use it in GitHub Desktop.
Save cilquirm/52ea875b6144ff3a7fbdb63558202bb4 to your computer and use it in GitHub Desktop.
Simple Echo Server
use Abort.abort
import java.io.InputStreamReader
import java.io.PrintWriter
import java.io.BufferedReader
import java.net.Socket
import java.net.ServerSocket
// The main entry point.
def main(): Unit \ {Net, IO, Abort} =
let port = 8080;
let serverSocket = new ServerSocket(port);
region socketHandler {
mainLoop(serverSocket, socketHandler)
}
def mainLoop(serverSocket: ServerSocket, reg: Region[r]) : Unit \ {Net, IO, r, Abort} =
let socket = serverSocket.accept();
spawn handleSocket(socket) @ reg;
mainLoop(serverSocket, reg)
def handleSocket(socket: Socket): Unit \ {Net, IO, Abort} =
let reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
let writer = new PrintWriter(socket.getOutputStream());
processLine(reader, writer)
def processLine(reader: BufferedReader, writer: PrintWriter): Unit \ {Net, IO, Abort} =
match Object.toOption(reader.readLine()) {
case Some(line) => {
if (line.equals("bye")) {
writer.write(line);
processLine(reader, writer)
} else {
abort("see ya")
}
}
case None => processLine(reader, writer)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment