// socket_example.wren import "socket" for Socket, SocketInstance foreign class Host { foreign static signalDone() } // Helper class for time-related functions. class Time { static sleep(ms) { var start = System.clock while ((System.clock - start) * 1000 < ms) { Fiber.yield() } } } var mainFiber = Fiber.new { var serverFiber = Fiber.new { System.print("Server: Starting up...") var result = SocketInstance.new() var err = result[0] var serverSock = result[1] if (err) { System.print("Server Error creating socket: %(err)") return } result = serverSock.bind("127.0.0.1", 8080) err = result[0] var success = result[1] if (err) { System.print("Server Error binding: %(err)") return } System.print("Server: Bound to 127.0.0.1:8080") result = serverSock.listen(5) err = result[0] success = result[1] if (err) { System.print("Server Error listening: %(err)") return } System.print("Server: Listening for connections...") while (true) { result = serverSock.accept() err = result[0] var clientSockFd = result[1] if (err) { System.print("Server Error accepting: %(err)") continue } var clientSock = SocketInstance.new(clientSockFd) System.print("Server: Accepted connection.") Fiber.new { while(true){ var result = clientSock.read(1024) var err = result[0] var data = result[1] if (err) { System.print("Server Error reading: %(err)") return } System.print("Server received: %(data)") var response = "Hello from server!" err = clientSock.write(response) if (err) { System.print("Server Error writing: %(err)") } System.print("Server sent response.") } }.call() } } var clientFiber = Fiber.new { // Give the server a moment to start up. Time.sleep(100) System.print("Client: Connecting...") var result = SocketInstance.connect("127.0.0.1", 8080) var err = result[0] var clientSock = result[1] if (err) { System.print("Client Error connecting: %(err)") Host.signalDone() return } System.print("Client: Connected.") var message = "Hello from client!" err = clientSock.write(message) if (err) { System.print("Client Error writing: %(err)") Host.signalDone() return } System.print("Client: Sent message.") result = clientSock.read(1024) err = result[0] var response = result[1] if (err) { System.print("Client Error reading: %(err)") Host.signalDone() return } System.print("Client received: %(response)") // All done. Host.signalDone() } serverFiber.call() clientFiber.call() // Keep the main fiber alive until Host.signalDone() is called. while(true) { Fiber.yield() } }