Scrivendone le specifiche ed implementandolo. Un protocollo ad esempio può essere del tipo:
- il server resta in ascolto su una determinata porta;
- il client si connette alla porta e invia un qualche messaggio di "saluto" convenzionale, eventualmente seguito dalla versione del client e attende la risposta del server;
- il server risponde in maniera analoga, magari dicendo anch'esso la sua versione;
- (opzionale) il client comunica che ha intenzione di inviare un file e attende una risposta;
- (opzionale) il server conferma che è in grado di effettuare l'operazione;
- il client comunica il nome del file che intende inviare e attende una risposta;
- il server conferma che ha ricevuto il nome;
- il client comunica le dimensioni del file e attende una risposta;
- il server conferma che ha ricevuto le dimensioni del file;
- il client invia tutto il file;
- il server quando è arrivato tutto il file comunica che ha ricevuto il file e chiude la connessione.
Supponendo di realizzare un protocollo "human readable", con ritorni a capo come separatori richiesta-risposta, un esempio di "conversazione" può essere questa (in rosso il client, in verde il server):
codice:
HELLO NomeClient 0.4.2.71
HELLO NomeServer 0.3.6.12
SENDFILE
OK
NomeFile.txt
OK
14
OK
Hello World![NUL] (qui come NUL intendo ovviamente il carattere 0, situato al termine di ogni file ASCII)
OK
.
Sarebbe anche buona cosa implementare un sistema di messaggi di errore:
codice:
asdasdasdas
ERROR 1 Invalid handshake
codice:
HELLO NomeClient 0.4.2.71
HELLO NomeServer 0.3.6.12
asdasdsad
ERROR 2 Invalid command
codice:
HELLO NomeClient 0.4.2.71
HELLO NomeServer 0.3.6.12
SENDFILE
OK
Noe?|*asde.tx\\t
ERROR 3 Invalid filename
codice:
HELLO NomeClient 0.4.2.71
HELLO NomeServer 0.3.6.12
SENDFILE
OK
NomeFile.txt
OK
asgaegasagae
ERROR 4 Invalid file size