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