Multi-Chat (winsock) und Userlist!

momoxp

Erfahrenes Mitglied
Hi Leute!
1. Prob
Also ich habe ein Chat-Programm mit VB programmiert.
Es funktioniert alles wunderbar nur habe ich es bisher nicht hinbekommen, dass alle User (Clienten) in einer Liste angezeigt werden, die nun zum Server connectet haben. (Wie bei IRC ^^)
Diese sollen beim Server und beiden Clienten angezeigt werden. Ich weiß auch nicht wie ich einen Nickname an den Clienten binden soll... also das der Server weiß welcher nick zu welchen clienten gehört und die dann in der Liste anzeigt...
Sobald ein User aus dem chat rausgeht, soll dieser auch aus der Liste entfernt werden.

2. Prob
Haben 2 PCs am Router angeschlossen.. und es kann jeweils nur einer zum chat connecten... wahrscheinlich liegt das an den ports.. aber wie kann man dieses Problem lösen ?

Ich hoffe mal das das verständlich war ^^.. entschuldige mich für evtl reschtschreibfehler ;)

EDIT : Ihr ist das Programm : Download
Hab die Datei neu hochgeladen.. nun sollte man die datei auch entpacken können ^^
 
Zuletzt bearbeitet:
1. Die Clients, die zum Server verbinden, müssen dem Server halt gleich den Nicknamen schicken, nachdem verbunden wurde. Den musst du dir merken.
Wie ist dein Chat denn aufgebaut? Benutzt du das TCP oder UDP-Protokoll? Wenn ein Client zum Server verbindet, wird dann beim Server ein neues Winsock-Steuerelement für diesen Client erstellt oder regelst du alles über ein einziges Steuerelement?

2. Was für ein Fehler kommt denn, wenn der zweite Client zum Server verbinden will? Ist der Server im Internet oder im LAN?
 
ich hab nur ein winsock steuerelement ^^ wenn du das meinst
TCP... wo is da der unterschied wenn ich UDP nehme ?=
ich hab 1 winsock steuerelement und hab da den index auf 0 gestellt

intMax = 0
Winsock1(0).LocalPort = 1111
Winsock1(0).Listen
das is dafür das er auf conections wartet ^^

und hier der onconnectionrequest

If Index = 0 Then
intMax = intMax + 1
Load Winsock1(intMax) 'Erstellt neues Winsock-Control
Winsock1(intMax).LocalPort = 1001
Winsock1(intMax).accept requestID
End If

und wie den nick mitschicken?
einfach
winsock1.senddata nickname.text ?
aber woher weiß denn der server das das der nickname ist.. und zu welchen clienten das gehört ?

2. also der server is für mich auch über netzwerk ip zu erreichen... und für alle andren übers internet...
aber wenn ich vom zweiten pc aus auch verbinden will dann wird keine verbindung hergestellt... also er schreibt auch nix...
und wenn man dann ne nachricht abschicken will kommt halt nen fehler von "ungüliter verbindungszustand oder so"
 
Zuletzt bearbeitet:
ich hab nur ein winsock steuerelement
Das war mir klar, ich wollte wissen, ob du das hier machst:
Code:
Load Winsock1(intMax) 'Erstellt neues Winsock-Control
was du ja machst.
Ok, das Senden des Nicknamen meine ich schon so ähnlich wie das hier:
Code:
winsock1.senddata nickname.text
Du musst dir halt bestimmte Codes ausdenken, die die Nachricht dann immer identifiziert. Du kannst zum Beispiel zum Senden einer normalen Chat-Nachricht sowas senden:
Code:
winsock1.Senddata "0001" & "Hallo"
Und für den Nicknamen dann sowas:
Code:
winsock1.Senddata "0002" & "MeinNickname"
Dann prüfst du einfach beim Server die ersten 4 Zeichen, ob es nun 0001 oder 0002 oder was anderes ist. Somit wird erkannt, was der Client für eine Information sendet. Du könntest statt Zahlen auch einfach Buchstaben als Identifikationszeichen mitsenden, ist dir überlassen.
Und aus "Winsock1(Index).RemoteHostIP" kannst du dann ja die IP-Adresse auslesen, zu dem der Nickname gehört. Somit weißt du, welcher Client welchen Nicknamen hat.
 
hmm...sowas ähnliches hab ich grade versucht...
ich hab beim clienten beim onconnect folgendes geschrieben:
winsock1.senddata "NICKNAME" & "" & Nickname.text

Dann hab ich beim server versucht das auszulesen (dataarrival oder so)
Dim datasplit() As String
datasplit = Split(data)
if Left$(data, 8) = "NICKNAME" then list1.additem datasplit(1)

Nur addet er den nickname dann 2mal.. und ich hab schon versucht das abzufangen.. klappte aber nicht...

Und wie die localhostip vom nickname?
versteh ich nicht...
außerdem wie soll er denn wissen wenn der client wieder disconnectet welcher nickname in der liste er nun entfernen soll ?
 
Keiner der mir weiterhelfen kann? :(

ich versteh nich wieso das hier nich funktioniert

If Right$(data, 13) = "eingeloggt!" Then List1.AddItem datasplit(0)

1. datasplit(0) ist immer der nickname wenn "eingeloggt" stimmt
2. ich hab schon folgendes getestet :
chat.text = Right$(data, 13) <--und das ergibt "eingeloggt!"
wieso fügt er das dann nicht hinzu
hab ich was falsch gemacht?

hier der wichtige teil aus Winsock1_DataArrival vom SERVER
Dim data As String
Dim i As Integer
Dim datasplit() As String
Winsock1(Index).GetData data 'Empfangenen Text in einen String schreiben
For i = 0 To intMax


datasplit = Split(data)
If Right$(data, 13) = "eingeloggt!" Then List1.AddItem datasplit(0)
 
Zuletzt bearbeitet:
hi,

ich hab mal ne frage:

so wie du Split() verwendest, woher weiß split wann splitten? Ich dachte da müssen irgendwelche trennzeichen mitgesendet werden.

so z.b.

Code:
data = var1 & ";;" & var2 ";;" & var3 ...
datasplit() = Split(data, ";;")

a propos hab auch mal versucht einen chat zu proggen ging ganz gut bin dann auch bei server authentifzierung steckengeblieben

auf jeden fall hab ich datasplit als Variant definiert anstatt als String wie bei dir, ehrlich gesagt weiß ich nicht ob das einen unterschied macht.

ahja und respect die homepages die du gestaltet hast sehen echt cool aus.
 
Zuletzt bearbeitet von einem Moderator:
motoys hat gesagt.:
hi,

ich hab mal ne frage:

so wie du Split() verwendest, woher weiß split wann splitten? Ich dachte da müssen irgendwelche trennzeichen mitgesendet werden.

so z.b.

Code:
data = var1 & ";;" & var2 ";;" & var3 ...
datasplit() = Split(data, ";;")
]

wenn man kein trennzeichen definiert dann "splittet" er den string immer da wo ein leerzeichen ist ^^
motoys hat gesagt.:
ahja und respect die homepages die du gestaltet hast sehen echt cool aus.
Danke :)
 
Liegt der Fehler nicht hier:
winsock1.senddata "NICKNAME" & "" & Nickname.text
schließlich sendest du kein Trennzeichen/Leerzeichen, wegen dem ""

Edit: siehe Post vom 08.08.2004 um 22:40 Uhr!
 
ja doch... ich hab ein leerzeichen mitgesendet... hab mich da jetzt nur vertippt

ich hab versucht das so zu lösen wie du gesagt hast... also mit den codes...
Code:
Dim data As String
Dim i As Integer
Dim NK() As String
Dim datasplit() As String
Dim x As Integer


Winsock(Index).GetData data

For i = 0 To intMax

datasplit = Split(data)
If Left$(data, 6) = "CodeNK" Then
datasplit(0) = "CodeNK"
Userlist.AddItem datasplit(1)
End If

If Winsock(i).State = 7 Then
If Not Left$(datasplit(0), 6) = "CodeNK" Then
Winsock(i).SendData data
Chat.Text = Chat.Text + data + vbNewLine
Else: If Left$(data, 6) = "CodeNK" Then Winsock(i).SendData datasplit(1) & " ist dem Chat beigetreten."
End If
End If


Next
nun fügt er den nickname wieder 2 mal hinzu oO
außerdem weiß ich dann nicht, wie ich den nickname wieder rausbekomme wenn der client disconnectet....

und wie ordne ich einem nickname einen clienten zu :(
ich will kick integrieren.. und da soll halt immer nur ein bestimmter client gekickt werden : /
 
Zurück