GLU Gaming Art & Dev
Would you like to react to this message? Create an account in a few clicks or log in to continue.

Netwerk socket tutorials door Rick van Rooijen

Go down

Netwerk socket tutorials door Rick van Rooijen Empty Netwerk socket tutorials door Rick van Rooijen

Post by rickvrooijen Thu 20 Dec 2012 - 23:47

In deze tutorial ga ik het een en ander uitleggen over het werken met sockets: Verbinding maken, met clients communiceren en ze bijhouden op de server.

Als je begint met het maken van een server moet er als eerste een socket aangemaakt worden. Een socket is een object wat gaat luisteren naar binnenkomende data en data gaat versturen. De socket moet worden gebonden aan een ip adres en een poort waar hij luistert naar data.

Code:
socketNaam = new TcpListener(IPAddress, poort);
socketNaam.Start();

Als de socket aan is gemaakt moet hij luisteren naar binnenkomende connecties.
Om dit voor elkaar te krijgen kan er een functie gehangen worden aan de socket die word uitgevoerd als er een binnenkomende connectie is.

Code:
socketNaam.BeginAcceptTcpClient(MethodeNaam, socketNaam);

Dit kan elke methode zijn die je wilt zolang hij maar een parameter van het type
Code:
IAsyncResult
opvraagt.

Code:
private void HandleAsyncConnection(IAsyncResult res)
{
    Msg("Iemand maakt verbinding met onze socket...");
}

Zodra deze methode word uitgevoerd weet de server dat er een client connectie wil maken met de server.
Als je dit hebt zijn er echter weer een paar nieuwe problemen bijgekomen, ten eerste: Als de methode is uitgevoerd luistert de socket niet meer naar nieuwe verbindingen. Omdat een server met 1 persoon niet echt heel spannend is gaan we dit probleem als eerste op te lossen.

Om dit voor elkaar te krijgen is het nodig een methode uit te voeren in de
Code:
HandleAsyncConnection
die de socket weer opnieuw laat luisteren naar een nieuwe connectie.

Code:
private void HandleAsyncConnection(IAsyncResult res)
{
    Msg("We have someone connecting to us...");
    StartAccept(); //Luister weer naar een nieuwe connectie
}

De methode doet precies hetzelfde als wat we bij het aanmaken van de socket al deden maar word nu aangeroepen als de server klaar is met het verwerken van een binnenkomende connectie.

Code:
public void StartAccept()
{
    thisSocket.BeginAcceptTcpClient(HandleAsyncConnection, thisSocket);
    Msg("Socket luistert weer naar een nieuwe connectie...");
}

Op deze manier kan de server oneindig connecties opvangen.
Het volgende probleem is dat de server data moet kunnen versturen naar clients die verbinding hebben gemaakt met de server.

Om dit te kunnen doen moet de speler opgeslagen worden in een lijst waar de server later nog bij kan.Om dit te doen bestaat er het type TcpClient In dit object zit alle functionaliteit om te kunnen communiceren met de client.
Om de TcpClient te krijgen van een client die verbinding maakt bestaat de methode
Code:
EndAcceptTcpClient(IAsyncResult);
De
Code:
IAsyncResult
hebben we in de functie
Code:
HandleAsyncConnection(IAsyncResult res)
zitten dus vanuit hier kan de client opgeslagen worden in een lijst met alle clients.

Netwerk socket tutorials door Rick van Rooijen Socket

Nu de clients verbinding kunnen krijgen met de server en de server ze aan kan spreken moeten we daadwerkelijk data kunnen versturen.
De data versturen op een efficiënte manier is één van de belangrijkste elementen van een netwerk applicatie.

Standaard types zoals een strings kunnen makkelijk omgezet worden in een byte array.

De methode
Code:
Encoding.UTF8.GetBytes(string);
zet de string om in een byte array als de server deze nu opslaat in een in byte array kan hij hem versturen naar de verbonden clients.

In de TcpClient die opgeslagen is op de server zit een NetworkStream waar data naartoe geschreven en uit gelezen kan worden.

Code:
byte[]bytes = Encoding.UTF8.GetBytes("dit is een string");
NetworkStream.Write(bytes, 0, bytes.Length);
NetworkStream.Flush();

Nu de server data kan versturen moet hij ook nog data kunnen ontvangen.
Data ontvangen gaat op bijna dezelfde manier, met de methode
Code:
NetworkStream.DataAvailable()
kan er bekeken worden of er vanaf de andere kant van de connectie iets is verstuurd en nog niet is binnen gehaald.

Alles wat je binnen haalt via de NetworkStream is een byte array. Wat bij grotere projecten een probleem is is dat de server nooit weet van tevoren wat hij binnen krijgt ( Dit behandel ik in een andere tutorial ), maar voor nu houd ik het simpel. Omdat de server hier altijd een string binnen

Netwerk socket tutorials door Rick van Rooijen Send%20data

krijgt kan hij de byte array zonder problemen omzetten naar een string.
De client kan op bijna dezelfde manier gemaakt worden, het enige verschil is dat je op de client geen rekening hoeft te houden met clients die verbinding willen maken. Je maakt verbinding met de server via een socket.

Code:
clientSocket = new System.Net.Sockets.TcpClient();
clientSocket.Connect("127.0.0.1", port);

Nu er verbinding is is het enige wat verder nog nodig is de NetworkStream van de server opvragen.

Code:
NetworkStream = clientSocket.GetStream();

En nu kan ik op precies dezelfde manier als bij de server data versturen en opvragen.

Door:
Rick van Rooijen
GLU 4GA2
rickvrooijen
rickvrooijen

Aantal berichten : 13
Registratiedatum : 2012-11-15
Leeftijd : 30
Woonplaats : Maarssen

http://www.rickvanrooijen.nl

Back to top Go down

Back to top

- Similar topics

 
Permissions in this forum:
You cannot reply to topics in this forum