Toon posts:

[VB] Buitengewoon uitgebreide chatbox.

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb eerder een topic geopend hierover maar die werd gesloten, nu gaat het niet om de box zelf maar om fouten die ik krijg er in waarvan ik bij sommige niet weet hoe ik het op zou moeten lossen... 1 voorbeeld :


Als mensen iets typen in de box, en op enter drukken zou het dus naar de server gestuurd moeten worden en de server stuurd het door naar alle clients. Dit werkt opzich goed maar nu is er een probleempje als er van 2 clients, op precies het zelfde moment tekst binnen komt. Getest door 2 clients te starten en met beide, ook met 2 mensen dus, zo snel mogelijk op het toetsenboord rammen en op enter rammen. Dit komt natuurlijk niet vaak voor, maar als er 50man in die chatbox zitten heb je dus een veel grotere kans dat er tekst precies op het zelfde moment binnenkomt.

Ok.. hier een stukje uit de client, die tekst verstuurd naar de server :

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Private Sub txtType_KeyPress(KeyAscii As Integer)
If Len(txtType.Text) < 1 Then Exit Sub


'Routine als iemand op enterdrukt, dus text wil sturen
If KeyAscii = 13 And TextTime = 5 Then 'Als er op enter gedrukt word
    If Stil = True Then MsgBox "Je mag niet praten, alleen prive!", 64, "Silent": Exit Sub
    KeyAscii = 0 'dit moet anders krijg je zo een windowsgeluidje, PLING
        If Ws1.State = 7 Then 'Dus geconnect
            If chkPrive.Value = 1 Then
                Ws1.SendData "[PRIVTEXT%]" & txtName.Text & vbNullChar & txtPrive.Text & vbNullChar & txtType.Text
                
            Else
            
                If Mid$(txtType.Text, 1, 3) = LCase("/me") Then 'als het [ME=75923]is, dan action[/ME]
                        txtType.Text = Mid$(txtType.Text, 4, Len(txtType.Text)) 'Action of gewone text?
                        Ws1.SendData "[TEXTACTI%]" & "*" & txtName.Text & vbNullChar & " " & txtType.Text & vbCrLf
                Else
                        Ws1.SendData "[TEXTNORM%]" & "<" & txtName.Text & ">" & vbNullChar & txtType.Text & vbCrLf
                End If
            End If
        End If
    txtType.Text = ""
    TextTime = 0 'die timer word gebruikt om te zorgen dat ze niet snel kunnen
    TText.Enabled = True 'flooden wat errors veroorzaakt en verkeerde text in beeld brengt
End If


End Sub


Hier geld TEXTNORM% als parameter die voor de tekst word gezet en verstuurd word zodat de server weet dat het "normale" tekst is die naar alle clients moet, daarnaast hebben we ook nog TEXTPRIV% (prive) en TEXTACTI% (net zoals bij IRC "/me")

Die parameters die ervoor worden gezet, worden in de client(als die dit binnenkrijgt van de server waar het eerst heen word gestuurd) uit elkaar getrokken om de text goed in beeld te krijgen.

Hier een stukje daarvan :

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
ElseIf Mid$(inData, 1, 11) = "[TEXTNORM%]" Then
    inData = Mid$(inData, 12, Len(inData))
    X = InStr(1, inData, vbNullChar) 'kijk op welke positie vbnull zit
    NaamText = Mid$(inData, 1, X) 'pak nickname eraf
    inData = Mid$(inData, X + 1, Len(inData)) 'pak text

    txtChat.SelColor = 8388608 'zet kleur voor naam
    txtChat.SelText = NaamText 'plaats naam in box

    txtChat.SelColor = vbBlack 'Voor zwarte text

    Call AddChat(inData, NaamText) 'roep addchat

ElseIf Mid$(inData, 1, 11) = "[TEXTPRIV%]" Then 'Privetext
    inData = Mid$(inData, 12, Len(inData))
    txtChat.SelColor = 8388736
    AddChat inData, "" 'geen naam, daarom lege quotes
    Prive = True
End If


Dit staat dus in de client onder Winsock/DataArrival.
Zodra hij AddChat roept, word er gekeken naar eventuele smileys, de tabs worden goed gezet en als het prive is, worden de juiste instellingen daarvoor geladen, niet relevant dus voor mijn vraagstuk.


Hier volgt een stuk source van de server, m.b.t. TEXT (maakt niet uit wat... prive, action of normaal)

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
If Mid$(InData, 1, 5) = "[TEXT" Then 'als eerste karakters [TEXT zijn
'txtChat.SelText = Mid$(InData, 12, Len(InData)) 'voeg in eigen box toe

    For x = 0 To wsConn().UBound 'ga allen winsocks af en zend de sjit
        If wsConn(x).State = 7 Then
            wsConn(x).SendData InData: DoEvents
        End If
    Next x
End If

If Mid$(InData, 1, 11) = "[PRIVTEXT%]" Then 'prive praten
    InData = Mid$(InData, 12, Len(InData)) 'haal het voorstuk weg
    x = InStr(1, InData, vbNullChar) 'zoek naar vbnullchar
    DOOR = Mid$(InData, 1, x - 1) 'bepaal welke user stuurde
    
    'haal de eerste user + de vbnullchar van indata af :
    InData = Mid$(InData, x + 1, Len(InData))
    x = InStr(1, InData, vbNullChar) 'zoek wederom vbnullchar
    USR = Mid$(InData, 1, x - 1) 'bepaal naar wie ,-1 om vbnullchar weg te halen
    InData = Mid$(InData, x + 1, Len(InData))
    PraatPrive DOOR, USR, InData 'stuur de info naar de sub PraatPrive
    

End If


De documentatie lijkt me genoeg te zeggen.


Het probleem is dus.. als ik met 2 clients TE snel tekst stuur dat je de parameters ervoor gaat krijgen, dus gewoon zichtbaar in de chatbox, wat niet de bedoeling is..

TEXTNORM% komt er dan bijvoorbeeld in de chatbox te staan, maar de gebruiker moet dat uiteraard niet zien. Ik heb al zitten kloten met die timer op de client, maar het probleem blijft bestaan omdat er 3 verschillende mensen ook iets tegelijk kunnen sturen en op de server de fout zich dus voordoet.

Iemand een probleem hoe ik dit kan vertragen, zodat het wel goed op het beeld kom?

Als jullie meer info nodig hebben van andere subs, hoor ik het wel.
iig dank voor het lezen van me verhaal en voor eventuele reacties.

[ Voor 6% gewijzigd door Verwijderd op 03-03-2003 12:37 . Reden: Code-tags verkeerd ]


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

offtopic:
Dit is imho echt volstrekt onleesbaar.. Kan je om te beginnen [vb] vervangen door [ code] en [/vb] door [ /code], maar dan zonder de spaties


edit:

[ code = vb]kan ook. Je had alleen eerst hele andere tags. :)

[ Voor 20% gewijzigd door gorgi_19 op 03-03-2003 12:42 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Topicstarter
gorgi_19 schreef op 03 maart 2003 @ 12:38:
offtopic:
Dit is imho echt volstrekt onleesbaar.. Kan je om te beginnen [vb] vervangen door [ code] en [/vb] door [ /code], maar dan zonder de spaties
Dan lijkt het mij juist nog onleesbaarder :/

  • DukeMan
  • Registratie: Mei 2000
  • Niet online
wat je kan doen is elk commando eindigen met chr(0).

als er vervolgens iets verstuurd wordt/binnen komt kan je alle afzondelijke pakketten krijgen door de binnengekomen text te splitten op chr(0).

Verwijderd

Topicstarter
is chr(0) het zelfde als VbNullChar?
Dan gaat het al niet werken, want die word al gebruikt, als je de code hebt gelezen.

  • DukeMan
  • Registratie: Mei 2000
  • Niet online
chr(0) = idd vbNullChar
dan zou je een ander karakter kunnen pakken... bijv chr(255) ofzo... zou je zelf even moeten kijken

Verwijderd

Topicstarter
gorgi_19 schreef op 03 maart 2003 @ 12:38:
offtopic:
Dit is imho echt volstrekt onleesbaar.. Kan je om te beginnen [vb] vervangen door [ code] en [/vb] door [ /code], maar dan zonder de spaties


edit:

[ code = vb]kan ook. Je had alleen eerst hele andere tags. :)
offtopic:
Kijk waarom ik me bericht editte ;)


Ok, ik zal is kijken of ik daar een Chr() voor kan gebruiken... Dat ding barst van de fouten, debugging is fockt op :P

  • Mickman
  • Registratie: Juni 2001
  • Laatst online: 29-03 18:11
je zou iets kunnen proberen met het loggen van online gebruikers en deze doormiddel van 'mary go round' processing geven. Dmv timer ofzo.

  • slm
  • Registratie: Januari 2003
  • Laatst online: 25-06 12:45

slm

Misschien dat je even kan uitleggen of het nou bij de client fout gaat of bij de server.
Je hebt namelijk een aantal mogelijkheden:
1. clients kunnen gelijktijdige berichten niet aan
2. server kan gelijktijdige berichten niet aan
3. zowel client als server kan gelijktijdige berichten niet aan.

Ik denk dat je iig ervoor moet zorgen dat de berichten sequentieel worden afgehandeld en niet realtime. Plaats ontvangen berichten op de server in een buffer/queue en verzend elk bericht in de buffer zodra er idle time is.

In feite zou je dan bv 2 timers kunnen gebruiken. 1 voor het ontvangen van berichten en 1 voor het afhandelen ervan.

Hetzelfde voor de client. Plaats ontvangen berichten in een queue en verwerk ze 1 voor 1. Het kan namelijk zijn dat het parsen van een bericht langer duurt dan het ontvangen van het volgende bericht. De vraag is dan hoe je app daarop reageert en kennelijk is dat niet goed.

To study and not think is a waste. To think and not study is dangerous.


Verwijderd

Topicstarter
Mickman schreef op 03 maart 2003 @ 14:46:
je zou iets kunnen proberen met het loggen van online gebruikers en deze doormiddel van 'mary go round' processing geven. Dmv timer ofzo.
Mary go round met de bedoeling als "Token Ring"?
Pagina: 1