[VB6]Waarom wil 3 clients niet lukken?

Pagina: 1
Acties:

  • ddkiller0900
  • Registratie: Juli 2001
  • Laatst online: 22-08 19:34
zie hieronder de code

DE CLIENT:
Private Sub cmdConnect_Click()
Client.Connect txtHost.Text, Val(txtPort.Text)
End Sub

Private Sub Client_DataArrival(ByVal bytesTotal As Long)
Client.GetData a$
Messages.AddItem a$

End Sub

Private Sub cmdSend_Click()
Client.SendData txtNickname.Text + ":" + txtMessage.Text
txtMessage.Text = ""
End Sub


DE SERVER:

Private Sub cmdSend_Click()
Messages.AddItem txtNickname.Text + ":" + txtMessage.Text
For b = 1 To connectie
Server(b).SendData txtNickname + ":" + txtMessage.Text
Next b
txtMessage.Text = ""

End Sub

Private Sub cmdStart_Click()
Server(Index).Bind port
Server(Index).Listen
End Sub

Private Sub Server_ConnectionRequest(Index As Integer, ByVal requestID As Long)
connectie = connectie + 1
Load Server(connectie)

Server(connectie).Accept requestID
End Sub

Private Sub Server_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Server(Index).GetData a$



For b = 1 To connectie

Server(b).SendData a$
Next b

Log.AddItem a$
Messages.AddItem a$


End Sub


Dit was dus een stukje code van mijn "chat programmaatje"
Nou wil hij dus berichten sturen als ik 1 server en 1 client heb, maar als ik 1 server en 2 clients heb dan stuurt ie ineens geen berichten naar Client 1, enkel naar Client 2 :?
Ik snap er niks van, mijn code klopt toch eh?
Heb ook al gezocht met google.

voor een voorbeeldje kijk hier http://users.skynet.be/bk316472/chat.jpg

  • Sponge
  • Registratie: Januari 2002
  • Laatst online: 28-08 17:06

Sponge

Serious Game Developer

Ik verwacht dat index 0 van de Server control op listen staat dus zou het sowieso:
code:
1
2
3
4
5
6
7
8
Private Sub Server_ConnectionRequest(Index As Integer, ByVal requestID As Long)
If Index = 0 Then
 connectie = connectie + 1
 Load Server(connectie)

 Server(connectie).Accept requestID
End If
End Sub

Moeten worden.

Ten tweede; is de variabele 'connectie' public?

  • ddkiller0900
  • Registratie: Juli 2001
  • Laatst online: 22-08 19:34
connectie is public ja

  • ddkiller0900
  • Registratie: Juli 2001
  • Laatst online: 22-08 19:34
volgens mij heb ik de fout gevonden
Als je een bericht moet sturen vanuit de server naar alle andere clients dan moet jet de volgende code gebruiken

For b = 1 To connectie
Server(b).SendData txtNickname + ":" + txtMessage.Text
DoEvents
Next b


Die DoEvents is van groot belang.Want nu heb ik em getest en nu doet ie het perfect

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Op vrijdag 05 juli 2002 22:52 schreef ddkiller0900 het volgende:
connectie is public ja
Heb jij je OO techniek bij een pakje boter gekregen :+

[edit]Ik heb totaal geen kaas gegeten van VB, maar volgens mij kan dit maar één reden hebben: Threads

Je bent waarschijnlijk bezig met een oneindige lus, waardoor die zut maar door blijft gaan en andere dingen geen kans geeft om ook wat uit te voeren.
Door middel van je DoEvents geeft je alle andere instructies, die zitten te wachten, een kans om ook hun taak uit te voeren. Zonder DoEvents zal je thread door blijven gaan en anderen geen kans geven

  • ddkiller0900
  • Registratie: Juli 2001
  • Laatst online: 22-08 19:34
toevallig niet nee, maar ik had em public staan omdat ie misschien in andere forms nog nodig zou kunnen zijn.

Heb nog 1 vraagje

Als er iemand disconnect dan zal de server proberen dat bericht naar die persoon te sturen, wat zal opleveren dat die verbinding niet meer bestaat en het programma crasht.

nu heb ik volgende code ongeveer:

For SocketCheck = 1 To connectie 'Step 1
If Server(SocketCheck).State <> sckClosed Then
Server(SocketCheck).SendData a$
DoEvents
End If
Next SocketCheck

dit wil het dus niet doen :?
Normaal klopt die regel code toch, of niet?

Verwijderd

Op vrijdag 05 juli 2002 23:04 schreef ddkiller0900 het volgende:
If Server(SocketCheck).State <> sckClosed Then

Normaal klopt die regel code toch, of niet?
.State = sckConnected zou alleen moeten werken (in ieder geval bij TCP verbindingen...) voor het versturen van data.

  • whoami
  • Registratie: December 2000
  • Laatst online: 20:22
Op vrijdag 05 juli 2002 23:00 schreef Glimi het volgende:

Heb jij je OO techniek bij een pakje boter gekregen :+
OO en VB gaan niet samen. :+
Zie ook:
[topic=532596/1/25]
[edit]Ik heb totaal geen kaas gegeten van VB, maar volgens mij kan dit maar één reden hebben: Threads
Threads en VB gaan ook niet hand in hand.

Tot zover deze off-topic bijdrage :)
Op vrijdag 05 juli 2002 23:00 schreef ddkiller0900 het volgende:


Die DoEvents is van groot belang.Want nu heb ik em getest en nu doet ie het perfect
Weet je waarvoor die DoEvents staat?
Ik vermoed dat je het hebt kunnen oplossen maar dat je geen enkel idee hebt wat die DoEvents betekent.
Als programmeur is het toch belangrijk dat je weet waarom je een statement of functie gebruikt, en wat de betekenis daarvan is.

https://fgheysels.github.io/


  • DukeMan
  • Registratie: Mei 2000
  • Niet online
Weet je waarvoor die DoEvents staat?
Met doevents geef je de besturing even terug aan windows, zodat deze weer even alles op orde kan zetten. Daaran krijgt je proggie de besturing terug.
Erg logisch als je dit leest, dat je probleem met verzenden over is, aangezien je nu windows de kans geeft de data te verzenden!!

  • Sponge
  • Registratie: Januari 2002
  • Laatst online: 28-08 17:06

Sponge

Serious Game Developer

Toch raad ik aan om mijn code verbetering toch even door te voeren. Weliswaar zouden er geen connectie binnen moeten komen op de andere controls, behalve 0, maar als je per ongeluk ergens iets gaat "listenen" dan gaat het echt fout met de code :)

  • whoami
  • Registratie: December 2000
  • Laatst online: 20:22
Op zaterdag 06 juli 2002 11:08 schreef 41.6C.6D.61.72 het volgende:
Toch raad ik aan om mijn code verbetering toch even door te voeren. Weliswaar zouden er geen connectie binnen moeten komen op de andere controls, behalve 0, maar als je per ongeluk ergens iets gaat "listenen" dan gaat het echt fout met de code :)
defensief programmeren. :Y)

https://fgheysels.github.io/


  • ddkiller0900
  • Registratie: Juli 2001
  • Laatst online: 22-08 19:34
Heb jouw code geïmplementeerd.
Nu zit ik dus met nog een soort probleem. Alle users worden dus aangemeld bij de server in een aparte list zodat ik kan kijken wie online is en welk ip ze hebben :7
Maar als ze offline gaat, dan moet de client een commando versturen zodat het bij de server automatisch uit de lijst wordt verwijderd, of zou ik het beter kunnen maken dat wanneer bij de winsock control een verbinding wordt verbroken, dat hij opzoekt welke verbinding dat is en dan die uit de lijst gooien?

Sorry voor moeilijke zinnen, ben nog niet zo lang wakker >:)

  • Sponge
  • Registratie: Januari 2002
  • Laatst online: 28-08 17:06

Sponge

Serious Game Developer

code:
1
2
3
Private Sub Winsock1_Close(Index As Integer)
    Debug.Print "Client", Index, " is  disconnected"
End Sub

Als de client vertrekt moet je NOOIT op een bericht van een client wachten... als de client verdwijnt door een reset zal de server het nooit weten.

Je zou eventueel ook het "PING? PONG!" principe van een IRC server kunnen proberen (server send iets, binnen xx seconden antwoord, anders "officieel" disconnected, aka "Ping timeout")

  • ddkiller0900
  • Registratie: Juli 2001
  • Laatst online: 22-08 19:34
heb het al veranderd :)

was nog 1 ding wat ik moest weten, en ik kom der echt niet uit hoewel het heel simpel is.

Als iemand inlogt dan verschijnt hij in een listbox.
Nou moet die ook weer verdwijnen uit die listbox als hij disconnect.
Nou zit ik dus met dat probleem, als dat werkt, kan ik mijn "chat" als klaar beschouwen (hoewel ik nog bezig met leuke opties :))

  • Sponge
  • Registratie: Januari 2002
  • Laatst online: 28-08 17:06

Sponge

Serious Game Developer

Hmm, ik weet niet hoe het er verder uitziet, maar als je wilt kun je itemdata gebruiken om nog iets extras op te slaan in een listbox. Dus als je nou zoiets als dit doet (uit m'n hoofd, fouten onder voorbehoud :)):
code:
1
2
List1.Additem Ontvangenaam
List1.ItemData(List1.NewIndex) = Index '//Index van winsock control

en dan
code:
1
2
3
4
5
6
7
8
9
10
Sub winsock_close(index as integer, bla ,bal)
Dim I as Long

For I = 0  to list1.listcount -1
 if list1.itemdata(i) = Index Then '//Index is gelijk?
   list1.removeitem I '//weg met de naam!
   exit for
 end if
Next I
end sub

Zoiets? :)

Ik ben trouwens nog een korte tijd online, en daarna moet je het even zonder me doen ;)

  • ddkiller0900
  • Registratie: Juli 2001
  • Laatst online: 22-08 19:34
zeg, hoeveel ken jij eigenlijk van vb? Je code klopte nl. perfect :P
Pagina: 1