Server Socket in C#
Torniamo a parlare di C#; l'argomento riaguarda le Socket, e nello specifico la parte server.
Della parte cliente ne parlerò in altro articolo....
La classe che andremo a creare avrà due metodi: una per la connessione e una per lo spegnimento del server.
Il server sarà in ascolto su una porta specifica (cercate di non usare le porte più comuni tipo la 80 o la 21) ed useremo il protocollo TCP (questo dipende anche dall'uso che ne dovete fare).
La classe è questa qua:
class Server
{
private Socket listener;public void socketServer()
{
int MAXBUFFER = 1024;
Console.WriteLine("SOCKET STARTED");
listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
listener.Bind(new IPEndPoint(IPAddress.Any, 20248));
listener.Listen(10);
while (true)
{
Console.WriteLine("WAITING CONNECTION");
Socket socket = listener.Accept();
string receivedMessage = string.Empty;
while(true)
{
byte[] receivedBytes = new byte[MAXBUFFER];
int numBytes = socket.Receive(receivedBytes);
receivedMessage += Encoding.ASCII.GetString(receivedBytes, 0, numBytes);
if (receivedMessage.IndexOf("\n") > -1)
{
break;
}
}
Console.WriteLine("MESSAGE FROM CLIENT: {0}", receivedMessage);
string replyMessage = "MESSAGE RECEIVED";
byte[] replyBytes = Encoding.ASCII.GetBytes(replyMessage);
socket.Send(replyBytes);
socket.Shutdown(SocketShutdown.Both);
socket.Close();
}
}public void shutdownServer()
{
listener.Shutdown(SocketShutdown.Both);
listener.Close();
}
}
Quando istanziamo la Socket listener, gli diamo alcuni parametri:
- AddressFamily imposta la famiglia di indirizzi
- SocketType il tipo di socket
- ProtocolType il tipo di protocollo
Alla riga sotto impostiamo gli indirizzi dal quale accettare connessioni (in questo caso tutti) e la porta di ascolto (20248).
Con il metodo Listen la mettiamo in attesa di connessioni.
Avviamo un primo ciclo infinito, nel quale associamo un altro oggetto Socket al primo e lo mettiamo in stato di accettazione di connessione.
Nel secondo ciclo riceviamo i byte dal cliente che si connette (se il client invia byte ovviamente).
Riceviamo in byte con il metodo Receive e ne facciamo l'Encoding indicando il charset da usare (ACII in questo caso) e lo trasformiamo in stringa.
Usciamo dal ciclo, stampiamo il messaggio e ne inviamo uno al client facendo l'operazione inversa e usando il metodo Send.
Infine chiudiamo la seconda Socket e la prima si rimette in attesa.
In pratica la prima Socket si occupa di accettare le connessioni e di tenere in vita il server; la seconda (collegata alla prima) riceve il messaggio e invia la risposta.
Il secondo metodo invece si occupa di chiudere la Socket principale e di spegnere il server; non è un metodo che parte in automatico, ma deve essere richiamato da parte del client.
c# c# socket addressfamily protocoltype s
Commentami!