Quiz Multi Threaded Client Server over TCP

Status
Niet open voor verdere reacties.

@rne

Nieuwe gebruiker
Lid geworden
27 jun 2005
Berichten
3
Beste,

ik ben bezig aan een quizmaster project.

Server:
- Controleert spelinhoud: houdt vragen bij, stuurt vragen naar Clients, houd score's bij, ...

Clients (meerdere)
- Connecteren met server, geven commando als ze willen 'mee-quizen', tonen vraag op scherm, stuurt antwoord naar server (bijna dummy GUI)

Nu zit ik in de knoop met de mogelijke manieren van werken:

Inleidend:
Start een nieuwe thread die wacht op spelers
[JS]
private void Form1_Load(object sender, EventArgs e)
{
listenThread = new Thread(new ThreadStart(WachtOpSpelers));
}[/JS]

1. Thread per Client

Mijn eerste manier van werken is het opstarten van een nieuwe thread telkens er een verbinding wordt gemaakt.
(Dus per speler die connectie maakt)

[JS]
private void WachtOpSpelers()
{
try { tcpVerbinding.Start(); }
catch { MessageBox.Show("IP en Poort al bezet", "Socket Fout!", MessageBoxButtons.OK, MessageBoxIcon.Error); }

while (true)
{
//Wacht op client connectie
TcpClient nieuweSpeler = tcpVerbinding.AcceptTcpClient();
Thread spelerThread = new Thread(new ParameterizedThreadStart(spelerCommunicatie));
spelerThread.Start(nieuweSpeler);
}
}[/JS]

+ Voordelen hiervan is dat elke client ongehinderd kan communiceren met de thread van de server. Dus clients moeten niet wachten als server met andere client communiceert.

Probleem: Hoe maak je dan van al die aparte threads, één quiz spel? Die exact dezelfde vragen stelt aan elke client? Want als er meerdere clients verbinden, zijn er dus meerdere threads actief. Dus alles wat je programmeert in de thread bestuurd één client asynchroon van de andere! Er zullen per Client andere vragen worden gesteld op verschillende tijdstippen!

De bedoeling is dat er per Client kan worden gecommuniceerd, maar het spel wel vanuit 1 centrale code wordt bestuurd (de Main thread?) zijn daar ergens voorbeelden van? Nog niet echt iets concreet gevonden!

Daarvoor had ik oplossing 2

2. Clients niet in aparte threads
[JS]
private void WachtOpSpelers()
{
try { tcpVerbinding.Start(); }
catch { MessageBox.Show("IP en Poort al bezet", "Socket Fout!", MessageBoxButtons.OK, MessageBoxIcon.Error); }

List<TcpClient> nieuweSpelers = new List<TcpClient>();

while (!MaxAantalSpelers)
{
//Wacht op client connectie
nieuweSpeler.Add( tcpVerbinding.AcceptTcpClient() );
}
}[/JS]

probleem nu is dat het mogelijk is dat er 2 clients tegelijk sturen,

Daarnaast is er nog een groter probleem met volgende code:
[JS]
byte[] klaarStart = new byte[4096];
int telKlaar = 0;
try { telKlaar = SpelerStream.Read(klaarStart, 0, 4096); }
catch { MessageBox.Show("Socket Error", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); }
if (telKlaar != 0)
{
string sStart = zetStreamNaarTekst(klaarStart);
//enz ....
}[/JS]

Dit is code die Wacht op het ontvangen van Data van een client. Het probleem is nu dat elke client een eigen SpelerStream heeft, dus dat de server eigenlijk enkel op 1 client kan wachten.

Dit is dus geen goede oplossign voor mijn eerste probleem, hoe pas ik dit best aan?

Alvast bedankt
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan