Avatar billede everclear Praktikant
05. juli 2006 - 17:33 Der er 21 kommentarer og
2 løsninger

.NET Chat

Sidder og skal have lavet en webbaseret chat, der skal kunne håndtere mange samtidige brugere. Jeg kan derfor ikke bare kalde min database hver gang en bruger klikker på "send"; da det jo vil generere urimeligt meget trafik for en server.

Jeg har været ved at snuse lidt til asynkrone databasekald og det kunne godt virke som en løsning. Er der nogen der har nogen erfaring med dette eller kan henvise mig til artikler m.v. der kan hjælpe mig med at få bygget en chat op?
Avatar billede -psycho- Nybegynder
05. juli 2006 - 19:01 #1
du kan nok næppe undgå meget trafik da alle klienterne er nød til at spørge serveren hele tiden om der er kommet nye/flere beskeder, der er ingen måde hvor på du kan få web serveren til at fortælle klientens browser at der er kommet nye beskeder.
Avatar billede everclear Praktikant
05. juli 2006 - 23:43 #2
I teorien kunne jeg jo benytte notification til den del af det; men det er ikke så meget det der er problemet. Jeg bliver jo nødt til at benytte noget "Fire and forget" arkitektur...
Avatar billede -psycho- Nybegynder
08. juli 2006 - 22:50 #3
Der er nu ikke nogen måde du kan komme uden om at kalde databasen hver gang en klient skriver noget du er jo nød til at adde det for at andre kan se det, og også hver gang en klient checker om der er blevet skrevet noget er du nød til at tilgå databasen.

Hvis det var mig der skulle lave det så ville jeg bruge AJAX og en webservice, da man så ikke behøver at refreshe siden hele tiden men hvor en AJAX function kalder en getnewmsg function i webservicen og derefter returner nye beskeder hvis der er nogen, og også kalde en newmsg function i servicen som til tilføjer beskeden til databasen på den møde bliver selve siden aldrig refresh..

Og hvis man absolut ikke vil have alt det database trafik kan man hvis man har adgang til serveren enten lave et lille program eller en service, og så lade webservicen køre med en socket connection til dette programmel som så holder styr på hvad der bliver skrevet osv
Avatar billede -psycho- Nybegynder
08. juli 2006 - 22:51 #4
istedet for at bruge en database.
Avatar billede everclear Praktikant
09. juli 2006 - 18:41 #5
OK. Hvor bør man begynde at overveje en "anden" løsning end bare at køre en Stored Procedure hver gang brugeren klikker "send"? Snakker vi 100+ brugere eller snakker vi flere eller hvordan ser det ud?
Til at starte med laver jeg bare en løsning med ATLAS og så noget SP og får det op at køre. Men på et eller andet tidspunkt, når der er trafik nok på chatten, så må DB'en vel give efter?
Avatar billede -psycho- Nybegynder
09. juli 2006 - 19:35 #6
Tja jeg ville nok overveje at finde en anden løsning allerede hvis der vil være 5 samtidige brugere. Fordi det vil genere voldsomt mange requests. 5 brugere som spørger om der er kommet nye beskeder hvert 5 sekund svare til 60 forespørgelser på serveren i minuttet, hvilket vil sige den skal tilgå db'en 60 gange i minuttet. Hvis du har 100 brugere så er det 1200 forspørgsler om der er kommet nye beskeder hvert minut...
Avatar billede everclear Praktikant
09. juli 2006 - 22:53 #7
Præcis....netop det der er mit problem. Havde lidt satset på, at nogle asynkrone databasekald kunne hjælpe mig med mit problem; men ville gerne høre om der var nogen, der har erfaring med større chats....
Avatar billede -psycho- Nybegynder
10. juli 2006 - 00:50 #8
Hvis du har adgang til serveren kunne du lave et chat server program enten som app eller windows service. Og så lave et flash object som bruger xmlsocket eller en java app.

Hvis du ikke har adgang til serveren/eller ikke vil lave ovenstående så vil løsningen nok være at finde et flash eller java app object til irc.
Avatar billede mulemule Nybegynder
12. juli 2006 - 12:18 #9
Hej everclear.

Man kan sagtens undgå at skrive og læse fra Databasen hele tiden. Man kan bare have beskederne liggende i Ram, i et .NET object. (men hvis man vil have log, skal man stadig skrive til DB eller i en fil).

Du er stadig enten nødt til at spørge hele tiden med http, eller lave det vha tcp/ip (dvs java eller flash).

Der er ret meget hejs med at lave et velfungerende chat system. Jeg tror ikke du vil kunne lave noget i løbet af kort tid, som du nogensinde vil blive tilfreds med.

Hvis du skal bruge systemet proffesionelt kan jeg måske hjælpe dig, i så fald skal du skrive en email adresse jeg kan skrive til.

Mvh
Avatar billede innercitydk Nybegynder
13. juli 2006 - 10:54 #10
Du kan som et alternativ f.eks gemme de 250 nyeste beskeder i en arrayliste som objekter med alle de oplysninger der er nødvendige (navn, tidspunkt, besked osv), og kun gemme når den når et forudbestemt max, f.eks de 250. Det ville aflaste serveren ret meget. For at de connectede brugere får fat i den samme arrayliste kan du lave arrayet som en seperat klasse med singleton pattern implementeret.
Avatar billede everclear Praktikant
13. juli 2006 - 21:48 #11
Det er nok noget mere i den stil jeg leder efter.....dette fungere lidt a la det Fire and Forget pattern jeg leder efter....Jeg er ikke super bekendt med den praktiske brug af Singleton pattern; men det er vel forholdsvis simpelt at få til at spille?
Avatar billede arne_v Ekspert
14. juli 2006 - 03:03 #12
jeg har skrevet lidt om singleton her http://www.eksperten.dk/artikler/37
Avatar billede innercitydk Nybegynder
25. juli 2006 - 09:31 #13
Jeg har ikke rigtig brugt singleton i en webapp før, men princippet må være det samme som en winform.

Constructoren i den klasse der skal tilgåes af andre gøres private så det kun er singleton koden der kan instantiere klassen. Herefter lavet en statisk variabel som kan tilgåes af alle. Det kan se således ud:

class Test
{
    private void Test()
    {
          //Kode der skal udføres ved instantiering, f.eks oprettelse af Arrayliste
    }
    private static Test instance;
    public static Test getInstance()
    {
          if(instance==null)
              instance=new Test();
          return instance;       
    }
}

Koden "if(instance==null)" kaldes lacy initialization. Det betyder at instansen af klassen først oprettes når den skal bruges. Hvis du fra en anden form/kodefil tilgår singleton klassen kan du blot skrive: Test instans=Test.getInstance();

Vh
Avatar billede mulemule Nybegynder
25. juli 2006 - 11:27 #14
Det skal være som nedenfor, for at være Thread Save. Ellers kan der i teorien pludselig være to instanser, hvis getInstance() bliver kaldt lige præcis samtidig :


Class Single

{
private static volatile Single _instance = null;

private Single() {}

public static Single Instance()
{
if (_instance == null)
{
    lock (typeof(Single))
    {
    if (_instance == null)
    {
    _instance = new Single();
    }
    }
    }
    return _instance;     
}
}
Avatar billede innercitydk Nybegynder
26. juli 2006 - 12:45 #15
God udvidelse :) Den ryger lige ned i gemmeren ;)
Avatar billede arne_v Ekspert
26. juli 2006 - 13:23 #16
double locking er ret "omdiskuteret"

læs evt. links i min artikel
Avatar billede innercitydk Nybegynder
27. juli 2006 - 00:45 #17
God artikel. Den kan anbefales.
Avatar billede everclear Praktikant
31. juli 2006 - 11:23 #18
Jeg kigger lige på din artikel arne og vender tilbage:-)
Avatar billede everclear Praktikant
31. juli 2006 - 14:32 #19
Jeg tror jeg har en ide om, hvordan det skal virke nu....ihvertfald indtil videre:-) Hvad siger i til at dele points arne v og innercitydk?
Avatar billede innercitydk Nybegynder
31. juli 2006 - 19:23 #20
Fint med mig :)
Avatar billede arne_v Ekspert
31. juli 2006 - 19:42 #21
ditto
Avatar billede everclear Praktikant
31. juli 2006 - 21:28 #22
Således:-) Og tak for hjælpen....
Avatar billede innercitydk Nybegynder
01. august 2006 - 11:12 #23
Var så lidt.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester