lunedì 7 agosto 2017

Sockets

Ci ho messo molto per fare questo post perchè i socket in livecode non sono spiegati molto bene.
Prima di tutto cerchiamo di capire cosa siano e perchè sono così importanti.
Un socket è una via di comunicazione riservata tra due computer. Al contrario di una pagina web, che tutti possono vederla perchè è pubblica e basta sapere l'indirizzo del server per leggerla, il socket è una strada riservata tra due computer.
In linea generate il funzionamento è il seguente:
  1. il server apre una porta sul proprio indirizzo IP, questa porta sarà la comunicazione per chi vuole parlare con lui
  2. uno o più client si mettono in comunicazione col server su quella porta. Per ogni client il server genera un numero di riconoscimento univoco, così riesce a stabilire con chi parlare e cosa dirgli
Attraverso i  socket potreste crearvi il vostro servizio di messaggistica tipo whatsapp o molto altro.
Nel dettaglio lo schema di funzionamento è il seguente, per capirlo bene leggetevi il codice dopo lo schema:
Vediamo il codice.
Il server sarà fatto così:
Basterà cliccare su attivo per aprire la porta 12345, il codice del pulsante Attivo è:

on mouseUp
   if the hilite of me then
      accept connections on port 12345 with message "clientConnected"
   else
      close socket "12345"
   end if
end mouseUp

on clientConnected tSocket   
   put the seconds & " connesso col socket: " & tsocket & return after field "log"
   read from socket tSocket until "§" with message "messageReceived"
end clientConnected

on messageReceived tSocket, pMsg
   put the seconds & space & tsocket & ": " & char 1 to -2 of pMsg & return after field "log"
   write ("Ricevuto messaggio " & char 1 to -2 of pMsg & "§" ) to socket tSocket
   read from socket tSocket until "§" with message "messageReceived"
end messageReceived


Semplice, vero?
Il  codice apre la porta e mette in ascolto il messaggio ClientConnected, se qualche computer si collega il messaggio si attiva per eventuali comandi alla connessione. Il messaggio ClientConnected si attiva per ogni client che si connette.
Subito dopo ClientConnected si attiva messageReceived quando il client ci dice qualcosa. messageReceived richiama sempre se stesso per essere sempre in ascolto di nuovi messaggi.
Come separatore di nuovi messaggi ho scelto il carattere §, ma può essere qualunque altra cosa che il client trasmetta.
Per il client facciamo qualcosa di leggermente più complesso:
Ecco il codice del pulsante Attivo:

local pSocket

-- Disconnect the client from the broadcast server.
command broadcastClientStop
   close socket pSocket
end broadcastClientStop

-- Sent once the client has connected to the broadcaset server.
-- Store the socket for futurure reference and begin reading data
-- from the server.
on broadcastClientConnected tSocket
   put tSocket into pSocket
   read from socket pSocket until "§" with message "broadcaseClientMessageReceived"
end broadcastClientConnected

-- Sent when a message has been received from the server. Output the
-- message and continue reading data from the server.
on broadcaseClientMessageReceived tSocket, pMsg
   put the seconds & ": " & char 1 to -2 of pMsg & return after field "log"
   read from socket tSocket until "§" with message "broadcaseClientMessageReceived" #so we continue to listen
end broadcaseClientMessageReceived

-- Sent when there is an error opening the socket. Log the error.
-- and close the socket.
on socketError tSocket, pError
   close socket tSocket
   put pError & return after field "log"
end socketError

on sendmessage
   write (the text of field "mex") & "§" to socket pSocket
end sendmessage

on mouseUp
   if the hilite of me then
      put the text of field "IPserver" into temp      
      open socket to (temp & ":12345") with message "broadcastClientConnected"
   else
      close socket pSocket
   end if
end mouseUp


Qui abbiamo anche da memorizzare il codice del socket che utilizziamo e indicare al cliente quale è l'indirizzo del server.
Server e client si parlano, per ogni messaggio che arriva al server, il server risponde al client. In questo modo potete fare di tutto, messaggistica, controllo remoto e qualunque cosa vi venga in mente.
Come nel caso del server abbiamo un messaggio che si attiva quando si stabilisce la connessioni (broadcastClientConnected) e un messaggio in ripetizione continua per ascoltare il server (broadcatClientMessagereceived).
Per scrivere ad un socket basta usare write, ricordatevi sempre di indicare un carattere di fine messaggio o una lunghezza fissa predeterminata di caratteri da leggere con il comando read.
Potete scaricare i file da qui: https://mega.nz/#!dN5HWaoY!Wtbb7heTZVAyM3D8O9ddwOp_n7aRHgYyreQKZZTaH_g
Se avete dubbi chiedete nei commenti.