#!/usr/bin/python3
# coding=utf-8

import easysocket
import rpc
import sys  # Juste utilisé pour sys.argv


# Gestion de la ligne de commande.
# ##################################################################

# Le nom du serveur et le port sont fournis dans la ligne de commande.
if len (sys.argv) != 3:
      print ('Two mandatory parameters: SERVERHOST SERVERPORT')
      sys.exit(2)
server_host = sys.argv [1]
server_port = int (sys.argv [2])


# Ouverture d'un socket.
# ##################################################################

# Ouvrir un socket vers le serveur.
socket = easysocket.make_client_socket (server_host, server_port)


# Importation des fonctions distantes.
# ##################################################################

# Il faut juste importer les procédures distantes, et les nommer ...
plus = rpc.rp (socket, 'plus')
fact = rpc.rp (socket, 'fact')
server_hostname = rpc.rp (socket, 'hostname')
foobar = rpc.rp (socket, 'foobar')

# ... et c'est fait !  Maintenant je peux simplement appeler les fonctions
# distantes comme si elles étaient des fonctions locales: je passe des
# paramètres, j'obtiens des résultats.  La communication avec le serveur devient
# invisible.


# Utilisation.
# ##################################################################

# J'appelle les fonctions distantes.
print ('The sum of 10 and 32 is', plus (10, 32))
print ('The factorial of 10 is', fact (10))
print ('The server name is', server_hostname ())

# Si j'ai réalisé la tâche optionnelle 3.5 je peut même provoquer une
# exception distante, et la traiter ici.
print ('I will cause an error on the server...')
try:
      foobar ()
except Exception as e:
      print ('..foobar failed on the server: exception', e, 'of type', type (e))

# Et si j'ai tout bien fait, même après une exception soulevée dans un appel
# distant je peux faire des autres RPCs.
print ('Still going on')
print ('The sum of 110 and 132 is', plus (110, 132))
