gamnit :: RemoteServer :: defaultinit
# Connection to a remote server
class RemoteServer
# `RemoteServerConfig` used to initiate connection to the server
var config: RemoteServerConfig
# Communication socket with the server
var socket: nullable TCPStream = null
# Is this connection connected?
fun connected: Bool
do
var socket = socket
return socket != null and socket.connected
end
# `MsgPackSerializer` used to send data to this client through `socket`
var writer: MsgPackSerializer is noinit
# `MsgPackDeserializer` used to receive data from this client through `socket`
var reader: MsgPackDeserializer is noinit
# Attempt connection with the remote server
fun connect: Bool
do
print "Connecting to {config.address}:{config.port}..."
var socket = new TCPStream.connect(config.address.to_s, config.port)
self.socket = socket
if not socket.connected then
print "Connection failed: {socket.last_error or else "Internal error"}"
return false
end
# Setup serialization
writer = new MsgPackSerializer(socket)
writer.cache = new AsyncCache(false)
reader = new MsgPackDeserializer(socket)
writer.link reader
return true
end
# Attempt handshake with server
#
# Validates compatibility between `handshake_app_name` and `handshake_app_version`.
#
# On error, close `socket`.
fun handshake: Bool
do
# The client goes first so that the server doesn't show its hand
var socket = socket
assert socket != null
# App name
var app_name = sys.handshake_app_name
socket.serialize_msgpack app_name
var server_app = socket.deserialize_msgpack("String")
if server_app != app_name then
print_error "Handshake Error: server app name is '{server_app or else "<invalid>"}'"
socket.close
return false
end
# App version
socket.serialize_msgpack sys.handshake_app_version
var server_version = socket.deserialize_msgpack("String")
if server_version != sys.handshake_app_version then
print_error "Handshake Error: server version is different '{server_version or else "<invalid>"}'"
socket.close
return false
end
return true
end
end
lib/gamnit/network/client.nit:55,1--132,3