mboost-dp1

Chat/forum i asp.net C#


Gå til bund
Gravatar #1 - KC
4. feb. 2010 17:52
Jeg er stadig igang med mit spil og skal bruge noget chatfunktion.

Jeg vil have forskellige kanaler, f.eks. til open lobby, specific game lobby og ingame.

Hver sted skal der gemmes chat for x antal linjer.

Pt. har jeg en løsning med en stringList som startes i appCode og derefter udfyldes. Dette er kun til en channel, men metoden kan udvides.
For hvert chatindlæg testes længden af listen og hvis den er over threshold bliver den kortet ned indtil den igen er over threshold.

Jeg overvejer at smide chatten ind i en DB, pros/cons?

Jeg vil gerne have at chatten opdateres løbende, lidt ligesom forumindlæg på newz gør det. Jeg har forsøgt et updatepanel og en timer som trigger en update af chatlisten, men den refresher hele siden og fjerner fokus fra det man var igang med. Dette er selvsagt ikke optimalt hvis man f.eks. er igang med at skrive noget. Er der mig der bruger updatepanel forkert eller skal jeg have gang i noget andet funktionalitet?


        <asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<div id="ChatText" style="width: 640px; height: 240px; overflow: auto;">
<asp:BulletedList ID="BulletedList1" runat="server">
</asp:BulletedList>
</div>
<br />
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="BulletedList1" EventName="TextChanged" />
<asp:AsyncPostBackTrigger ControlID="Timer1" EventName="Tick" />
</Triggers>
</asp:UpdatePanel>


    private void _UpdateChatMessageList()
{
BulletedList1.DataSource = chatL.getMessages();
BulletedList1.DataBind();
}
Gravatar #2 - Windcape
4. feb. 2010 18:20
Du har fået at vide at det er mission hopelessness at udvikle kommunikation via. at A skriver til et medie, og B så læser på dette medie hver n sekund, ikke?

Fordi det er en utrolig dårlig løsning, som er sygt performanceskrævende.

Hvis du vil lave et spil, eller en chat, fix din egen server, og skrive en ordenlig client/server løsning.
Gravatar #3 - KC
4. feb. 2010 19:03
Jeg er opmærksom på performance forholdet, men kravet til at det skal køre i ren browser vejer tungere.

Hvordan gøres det i f.eks. icq2go og andre chats i browsere`?
Gravatar #4 - Windcape
4. feb. 2010 19:21
#3

De benytter en client/server løsning, hvor de har en explicit server kørende til formålet.

icq2go er en Java Applet som kobler op mod et allerede eksisterende netværk, det er ligesom at have en Java IRC client kørende.

Du bør opnå en forståelse for hvad client-server er før du fortsætter med dit projekt, det er dumt at kode noget uden at have den nødvendige grundlæggende baggrundsviden.


http://en.wikipedia.org/wiki/Client_server
Gravatar #5 - KC
4. feb. 2010 21:01
Allright, jeg har ikke mulighed for at sætte en dedikeret chatserver op.

Jeg har altså kun mulighed for at bruge webserveren og evt. dennes DB. Jeg kan altså ikke bruge en client/server løsning og skal få det bedste ud af det jeg har.

Ud af de to dårlige løsninger med enten en global stringlist eller en DB løsning, hvilken vil så være mindst værst?

Hvordan får jeg chatten til at opdatere løbende, som den gør i newz? - Bruger jeg mit updatepanel forkert? Skal jeg ud i noget javascript?

Hvis det strider mod din fornuft, at jeg kan lave dette chat-system, kan du måske se det som et forum med en lidt højere opdateringsfrekvens? (Eller bliver forums også styret client/server med en dedikeret server) :D

Tak for input so far.
Gravatar #6 - slemmebirk
4. feb. 2010 21:07
#5

Du kan evt. tage et kig på jQuery, det er utroligt nemt at arbejde med og der en masse turtorials der helt sikkert kan hjælpe dig på www.jquery.com
Gravatar #7 - arne_v
4. feb. 2010 21:16
#design

Hvor mangere brugere skal den chat understøtte?

Hvis den skal have rigtigt mange brugere så er der kun 2 gode løsninger:
1) ægte push - hvilket kræver noget på client der kan læse fra en socket - f.eks. en Java applet (men jeg vil tror at Flash og SilverLight også kan løse opgaven)
2) long poll med en server som ikke bruger en OS tråd per request der er under behandling (dem er der ikke mange af!)

Almindelig poll drukner serveren i requests.

Og long poll på en traditionel server drukner serveren i tråde.

Men hvis du kun skal undestøtte et begrænset antal bruge, så kan alt jo bruges.

En ganske almindelig timed refresh a la newz.dk kan så fint løse opgaven.

Jeg vil ikke poste JavaScript kode til det - jeg kunne blive sagsøgt for alvorlige personskader af de læsere som faldt ned af stolen af chok, når de så min JavaScript.

Gravatar #8 - KC
4. feb. 2010 21:52
#6
Tak, det ser brugbart ud.

#7
Det bliver et begrænset antal bruger, under 100. Det har hele tiden været med i overvejelserne sammen med at jeg vil undgå at brugeren skal bruge plugins som Flash eller Silverlight. Det skal gerne kunne køre på maskiner som er begrænset af f.eks. skole eller arbejds maskine restriktioner. Derfor mener jeg at jeg kan slippe afsted med en ren poll model.

Er der nogen holdning til om jeg skal bruge en global variabel eller bruge min DB til chatten?
Gravatar #9 - arne_v
4. feb. 2010 21:55
#8

Regnestykket er jo simpelt.

100 brugere x 1 request per sekund = 100 requests per sekund

Jeg er ikke sikker på at du bliver populær hos dit web hotel.

Gravatar #10 - arne_v
4. feb. 2010 21:56
#8

Med hensyn til hvor data skal gemmes, så er de to spørgsmål:
1) skal alle beskederne gemmes?
2) skal det kunne køre på cluster?

2 x nej => brug memory
Gravatar #11 - Windcape
4. feb. 2010 22:28
Forresten så har de fleste danske og udenlandske webhoteller har en politik der forbyder sådanne chats
Gravatar #12 - KC
4. feb. 2010 23:31
Jeg har surftown, umiddelbart ser det ud til at de kun begrænser trafikken, så må jeg se hvor meget det chat værk fylder.
Gravatar #13 - KC
5. feb. 2010 11:05
Når man ser bort fra at det er en dårlig løsning, hvilken af nedenstående vil så være bedst?

En table til alle chat channels.
Kolonner: Timestamp(PRI), Message, Sender, Channel

En table for hver channel.
Kolonner: Timestamp(PRI), Message, Sender

Enten får jeg en meget stor table, som skal gennemsøges for den relevante channel - kunne gøres med views, men vil det reelt optimere det, når der hele tiden kommer nye messages?

Ellers får jeg nogle flere tables, men som man ikke skal gennemsøge, da de altid vil være sorteret og blot skal returnere hele tablet.

Fordelen ved timestamp som primary key er at jeg kan slette gamle beskeder uden at skulle omsortere min table(antaget at den er sorteret efter primary key).

Den sidste løsning vil selvfølgelig medføre at jeg skal oprette og slette tables, er dette forbundet med stort overhead?
Gravatar #14 - meh
5. feb. 2010 11:23
Hvorfor i det hele taget smide det i en db.
Er der en grund til du vil lagre chatten ?

Du kunne vælge ikke at lave et stort nummer ud af det og holde de sidste x antal entries i en buffer og bruge den til at dele chat-updates ud med.
Gravatar #15 - KC
5. feb. 2010 12:00
Jeg ville gerne holde det hele, så det kan hentes igen efter et evt. crash. Desuden ville jeg muligvis gerne gemme chatten pr. spil, således at hvis et spil bliver afbrudt vil man også se chatten, når man genoptager det.

Skal jeg vælge en stor eller flere mindre tables? Er der stort overhead ved at oprette og nedbryde tables?
Gravatar #16 - Windcape
5. feb. 2010 12:11
Man opretter ikke tables on-the-fly !
Gravatar #17 - KC
5. feb. 2010 12:22
Windcape (16) skrev:
Man opretter ikke tables on-the-fly !


Tak, jeg lærer så meget :)

Er der en elegant løsning til at håndtere de forskellige channels?
Gravatar #18 - KC
5. feb. 2010 13:02
hmm, det kan godt være at jeg efterhånden er overbevist om, at en chat er en dårlig ide, når den skal implementeres med polling.

Vil en almindelig webserver blive ked af det med 5-10 requests pr. sekund? (5-10 bruger der alle poller på chatten)
Gravatar #19 - KC
5. feb. 2010 13:07
Kan jeg fra min webserver hos Surftown køre en javaserver, som pusher til javaapplets? - Så må jeg slække mit krav om ingen plugins og lave en valgfri chatplugin.
Gravatar #20 - Mamad (moveax1ret)
5. feb. 2010 13:57
nej
Gravatar #21 - arne_v
5. feb. 2010 14:02
#13

Det er næsten altid bedst med 1 stor tabel og et felt som angiver type end N små tabeller en for hver type (*).

Performance loeses ved fornuftig brug af indexes.

*) Der er faktisk undtagelser ved seriøst store databaser. Men det er næppe applicable her.
Gravatar #22 - KC
5. feb. 2010 14:04
moveax1ret (20) skrev:
nej


aargh, lol. Det går ikke så godt for min webudvikler debut :D

#21

Havde kigget lidt på indexes, men som Windscape bliver ved med at fastholde, så er det en dårlig ide og praksis at polle webserveren, så jeg tror jeg må vente med det chat og fokusere på selve spillet og lobbyen.
Gå til top

Opret dig som bruger i dag

Det er gratis, og du binder dig ikke til noget.

Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.

Opret Bruger Login