distribueret program - klient-server - hammerslag
Jeg har lavet et lille server - klient program - Bruuns Auktionshus. En klient kan via en GUI indtaste et bud. Samtidigt generes der et budtidspunkt som sendes til serveren. Det virker fint. Men når budtidspunktet skal sammenlignes med et tidstempel genereret med et sekunds mellemrum, sat af serveren inde i den anden while lykke i min HaandterKunde() metode sker der ligesom ikke noget.Det er meningen at hvis en kunde byder inden der er gået 10 sekunder skriver serveren "ingen højere" og det skal så være muligt for en ny kunde at byde. Det skal så være den nye tid der sammenlignes. Hvis der gået 10 sekunder uden der på ny er budt, skal serveren skrive til kunden/erne beskeden "første". Hvis der er gået yderligere 5 sekunder skal der skrives "anden" og hvis der er gået yderligere 3 sekunder skal der skrives "tredie, varen er solgt!".
Mit problem er blot at det er ligesom sammenligningen aldrig bliver foretaget, kommer ikke ind i if-sætningerne i den anden while lykke.
Autionshusvarer er et singleton objekt.
Er der nogen der kan fortælle mig hvad jeg gør galt?
using System;
using System.Collections;
using System.IO; //streamReader og streamWriter ligger her
using System.Threading;
using System.Net;
using System.Net.Sockets;
namespace Spm1_AuktionshusServer
{
//klasse med tråd-metoder
class AuktionshusServer
{
private Socket kunde; //assoc. til Socket kunde forbindelse
private AuktionshusMonitor monitor; //assoc. til Monitor
private Vare vare; //association til Vare objekt
//konstruktør som får socket til kunde med som parametre
public AuktionshusServer(Socket kunde, AuktionshusMonitor monitor, Vare vare)
{
this.kunde = kunde;
this.monitor = monitor;
this.vare = vare;
}
//Get-metoder
public Vare GetVare(){return vare;}
//trådmetode som modtager bud fra en klient og sender budet videre til alle de andre kunder
public void HaandterKunde()
{
double budFraKunde;
string serverBesked;
DateTime budTidspunkt;
string kundeIPadresse;
NetworkStream networkStream;
StreamReader streamReader;
StreamWriter streamWriter;
//opret networkstream objekt med forbindelse til socket kunde
//opret streamreader objekt med networkstream til kunde
//opret streamwriter objekt med networkstream til kunde
networkStream = new NetworkStream(this.kunde);
streamReader = new StreamReader(networkStream);
streamWriter = new StreamWriter(networkStream);
kundeIPadresse = ((IPEndPoint)this.kunde.RemoteEndPoint).Address.ToString();
//tilfoej streamwriter til monitor
monitor.AddStreamWriter(streamWriter);
//send velkomst til kunde
serverBesked = "\rVelkommen til Bruuns Auktionshus! \rVare på auktion er: "+this.GetVare().ToString()+"\rGiv bud";
monitor.BroadcastServerBeskedTilKunde(kundeIPadresse, serverBesked);
while(true) //sålænge der kommunikeres med kunde
{
try
{
//server læser besked fra kunde
budFraKunde = Convert.ToDouble(streamReader.ReadLine());
budTidspunkt = Convert.ToDateTime(streamReader.ReadLine());
monitor.BroadcastAuktionsBud(kundeIPadresse, budFraKunde, budTidspunkt);
}
catch(IOException)
{
break;
}
//sammenlign bud fra kunde med varen på auktions aktuelle hoejeste bud
if(budFraKunde <= Auktionsvarer.GetAuktionsvarer().VarePaaAuktion().GetHoejesteBud())
{
//broadcast serverbesked til de andre kunder
serverBesked = "Budet på "+budFraKunde+" kr. er for lavt! "+budTidspunkt+" Giv nyt bud";
monitor.BroadcastServerBeskedTilKunde(kundeIPadresse, serverBesked);
continue;
}
//budet skal kun sættes hvis det er højere end startbudet, så det gælder som den nye mindstepris
Auktionsvarer.GetAuktionsvarer().VarePaaAuktion().SetHoejesteBud(budFraKunde);
Auktionsvarer.GetAuktionsvarer().VarePaaAuktion().SetBudTidspunkt(budTidspunkt);
string hammerslag;
budTidspunkt = Auktionsvarer.GetAuktionsvarer().VarePaaAuktion().GetBudTidspunkt();
while(true)
{
DateTime tidstempel = DateTime.Now;
Thread.Sleep(1000);
Console.WriteLine("Budtidspunkt "+budTidspunkt.ToLongTimeString());
Console.WriteLine("servertid. "+tidstempel.ToLongTimeString());
if(budTidspunkt.Ticks > (tidstempel.Ticks - 10000))
{
serverBesked = "Ingen højere?";
//Console.WriteLine("Ingen højere?");
monitor.BroadcastServerBeskedTilKunde(kundeIPadresse, serverBesked);
break; //bryder ud af løkken, så et nyt budTidspunkt kan sammenlignes
}
//så er der gået 10 sekunder uden nogen har budt
else if(budTidspunkt.Ticks == (tidstempel.Ticks - 10000))
{
hammerslag = "første";
//Console.WriteLine("første");
monitor.BroadcastServerBeskedTilKunde(kundeIPadresse, hammerslag);
}
else if(budTidspunkt.Ticks == (tidstempel.Ticks - 15000))
{
hammerslag = "anden";
//Console.WriteLine("anden");
monitor.BroadcastServerBeskedTilKunde(kundeIPadresse, hammerslag);
}
else if(budTidspunkt.Ticks == (tidstempel.Ticks - 18000))
{
hammerslag = "tredie, varen er solgt!";
//Console.WriteLine("tredie, varen er solgt!");
monitor.BroadcastServerBeskedTilKunde(kundeIPadresse, hammerslag);
int vareNr = Auktionsvarer.GetAuktionsvarer().VarePaaAuktion().GetVareNr();
Auktionsvarer.GetAuktionsvarer().RemoveEnVare(vareNr);
break;
}
}//end indre while løkke
}//end ydre while løkke
//fjern streamwriter fra monitor
monitor.RemoveStreamWriter(streamWriter);
Console.WriteLine("Forbindelse til kunde lukkes ned...\n");
streamWriter.Close();
streamReader.Close();
networkStream.Close();
}
}//end class AuktionshusServer
class AuktionshusServerMain
{
private const int PORT = 9050;
//Main-tråd til server
STAThread]
static void Main(string[] args)
{
IPEndPoint port;
Thread kundeTraad; //tråd som kommunikerer med kunde
AuktionshusServer auktionshusServer; //serverklasse som indeholder trådmetode
ThreadStart traadMetode;
Socket kundeSocket;
AuktionshusMonitor monitor; //monitor til synk. af broadcast
int kundeNr = 1;
port = new IPEndPoint(IPAddress.Any, PORT);
Socket lytter = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
lytter.Bind(port);
lytter.Listen(10);
monitor = new AuktionshusMonitor();
while(true) //uendelig lykke for server
{
Console.WriteLine("Venter på en kunde...");
kundeSocket = lytter.Accept(); //venter på at kunde skal tilkoble sig
Console.WriteLine("Kunde koblet på...");
Auktionsvarer.GetAuktionsvarer().OpretVare(101,"Antikt krivepult fra 1805",5000);
Auktionsvarer.GetAuktionsvarer().OpretVare(102,"Van Gogh bille, Valmuen",20000);
Auktionsvarer.GetAuktionsvarer().OpretVare(103,"Chartol fra det 17. årh.", 15000);
Auktionsvarer.GetAuktionsvarer().OpretVare(104,"Caroline Matildes Kaffestel",4500);
Auktionsvarer.GetAuktionsvarer().OpretVare(105,"Kirkestol fra Sct. Peders Kirke", 6000);
Vare varePaaAuktion = Auktionsvarer.GetAuktionsvarer().VarePaaAuktion();
//klargøring af start af tråd, som kommunikerer med kunde
auktionshusServer = new AuktionshusServer(kundeSocket, monitor, varePaaAuktion);
traadMetode = new ThreadStart(auktionshusServer.HaandterKunde);
kundeTraad = new Thread(traadMetode);
kundeTraad.Name = kundeNr.ToString();
kundeTraad.Start();
kundeNr++;
}//end while
}//end Main
}//end class AuktionshusServerMain
}//end namespace
