// 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()
}
}