Multiserver (TCP)

    • VB.NET

    Es gibt 854 Antworten in diesem Thema. Der letzte Beitrag () ist von ClonkAndre.

      nein also laut quellcode wird ja die anmelde form vorgegeben aber wie kann ich diese selber erstellen?
      projekt -> neues element hinzufügen -> form -> irgendeinen namen geben -> enter drücken -> z.b. textbox auf die form ziehen -> startform = die form mit der textbox, den inhalt der textbox kriegst du dann mit form.textbox1.text raus...

      Gruß, Gugi :thumbup:
      Mal eine Anfängerfrage in Hinblick auf einen LANmodus:
      Ist die fest hinterlegte IP hier nötig, oder wäre es möglich den Clienten einfach einen Broadcast in seinen Adressraum schicken zu lassen, auf den der Server dann reagiert?
      (rein zum Verständnis, mir ist klar dass der Beispielcode auf Internetfunktionalität getrimmt wurde)

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Tranceport“ ()

      Ich hab da auch mal eine Frage. Also nicht zum Code den habe ich verstanden aber ist es den möglich einen Text (Befehl) an einen bestimmten Client zu schicken wenn man weiß welche IP-Adresse der PC hat auf dem der Client läuft oder muss ich den CLient auch nochmal Extra als Server-Application machen. ?
      Danke für die schnelle Antwort. Hab nun ein wenig getüfftelt und bin darauf gekommen:

      VB.NET-Quellcode

      1. Private Sub SendToClient(ByVal s As String, ByVal Client_ As System.Net.IPAddress)
      2. Dim c As New Connection
      3. Dim client2 As TcpClient
      4. Try
      5. c.stream = client2.Connect(Client_, 8000)
      6. Catch ex As Exception
      7. End Try
      8. End Sub


      Nur ist jetzt der Fehler: "Der Ausdruck ergibt keinen Wert." Was habe ich den falsch gemacht ?
      Hallo,

      dein Ansatz ist nicht korrekt. Du musst die Daten an den Server senden, zusammen mit der Information, an welchen Client das ganze soll, z.B. in Form der IP. Nur an diesen schickt der Server dann weiter. Theoretisch wäre natürlich auch eine TCP-Direktverbindung zwischen den beiden möglich, aber dann müsste wieder eine Seite als Server agieren.

      Gruß
      OK Ich soll einen Befehl vom Server an den Server senden und von dort dann an den Jeweiligen Client senden
      Nein. Client -> Server -> Client.
      Wie kann ich den an einen bestimmten Client senden ?
      Siehe Beispiel. Alle Clients sind in der List(Of Connection) aufgelistet.

      Die Verbindung zum Server steht ja im Beispiel. Einfach Daten + Client senden, den Server letzteres auswerten und ersteres an diesen weitersenden lassen - fertig.

      VB.NET-Quellcode

      1. Try
      2. Dim tmp As String = con.streamr.ReadLine ' warten, bis etwas empfangen wird...
      3. Console.WriteLine(con.nick & ": " & tmp)
      4. If tmp > ... Then
      5. Else
      6. SendToAllClients(con.nick & ": " & tmp) ' an alle clients weitersenden.
      7. EndIf
      8. Catch


      Ich möchte jetzt, dass die nachricht nicht an alle Clients weitergeschickt wird, wenn die Nachricht größer als 10 Stellen ist. Aber wie kann ich das hier umsetzen?
      Hallo,

      bin neu hier.

      Ich habe den Server aus verschiedenen Gründen in eine Form gepackt und das funktioniert auch alles ganz gut.

      Ein Problem hab ich aber noch: Wenn sich ein Client abmeldet dann werden noch mehrere Nachrichten in Form von Nickname : kein Text an den Server und die anderen Clients gesendet. Wie kann ich das unterbinden? Ich möchte halt einfach, das nach dem Abmelden eines Clients nur die Meldung kommt Nickname : hat den Chat Verlassen.

      Oder geht das mit der Try..Catch Fehlerbehandlung in der ListenToConnection Sub nicht anders?

      Bin für jeden Tip dankbar

      Gruß Markus
      Willkommen im Forum ;)

      So wie der Code aussieht wird hier nichts gesendet, wenn du nicht auf den Button1 Klickst, bzw. das Client-Programm startest und connectest...

      wie sieht denn der Code deines Client-Programmes aus?
      Ich wollte auch mal ne total überflüssige Signatur:
      ---Leer---
      Hallo,

      ich meine beim abmelden bzw. beim beenden mit dem X oben rechts.

      das ist meine ListenToConnection Sub:

      VB.NET-Quellcode

      1. Private Sub ListenToConnection(ByVal con As Connection)
      2. Do
      3. Try
      4. Dim tmp As String = con.streamr.ReadLine ' warten, bis etwas empfangen wird...
      5. Dim usermessage As String = Now & " : " & con.nick & ": " & tmp
      6. Dim usermes(1) As Object
      7. usermes(0) = RichTextBox1
      8. usermes(1) = usermessage.ToString
      9. Me.Invoke(New WriteTextUser(AddressOf UserText), usermes)
      10. For Each c As Connection In list ' an alle clients weitersenden.
      11. Try
      12. c.streamw.WriteLine(con.nick & ": " & tmp)
      13. c.streamw.Flush()
      14. Catch
      15. End Try
      16. Next
      17. Catch
      18. ' die aktuelle überwachte verbindung hat sich wohl verabschiedet.
      19. Dim userexit As String = Now & " : " & con.nick & " hat den Chat verlassen."
      20. Dim userex(1) As Object
      21. userex(0) = RichTextBox1
      22. userex(1) = userexit.ToString
      23. Me.Invoke(New WriteTextDelegate(AddressOf WriteText), userex)
      24. list.Remove(con)
      25. Exit Do
      26. End Try
      27. Loop
      28. End Sub


      Das funktioniert soweit super, blos wenn ich den Client beende, dann wiederholt er mehrmals den Try bis er dann entgültig in den Catch geht.

      Also meine Frage ist nun: Kann man das beim Beenden umgehen, so dass er sofort in den Catch geht, oder muss ich da Grundlegend was ändern?

      Hier noch meine ConnectionClose()

      VB.NET-Quellcode

      1. Public Sub CloseConnection()
      2. ActiveConnection = False
      3. streamw.Close()
      4. streamr.Close()
      5. stream.Close()
      6. client.Close()
      7. End Sub


      Und hier noch das FormClosing vom Client

      VB.NET-Quellcode

      1. Private Sub Form1_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
      2. e.Cancel = False
      3. If Verbindungsverlust = False Then 'Auswerten, ob Verbindung unterbrochenworden ist oder nicht
      4. If client.Connected Then
      5. If MessageBox.Show("Wollen Sie den Chat wirklich beenden?", "Beenden", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) = DialogResult.Cancel Then
      6. e.Cancel = True
      7. Else
      8. CloseConnection()
      9. End If
      10. Else
      11. ActiveConnection = False
      12. client.Close()
      13. Application.Exit()
      14. End If
      15. Else
      16. ActiveConnection = False
      17. client.Close()
      18. Application.Exit()
      19. End If
      20. End Sub


      Vielleicht hab ich ja irgentwo nen Denkfehler drin.

      Danke schon mal

      Gruß Markus
      also in dem Catch kannst du natürlich nichts mehr senden, da dies ja aufgerufen wird, wenn keine Verbindung mehr besteht, du könntest das ganze somit im FormClosing-Event senden...

      aber wo der "leere" Text gesendet wird kann ich nirgends entdecken(könnte wohl beim Server sein)...

      (wenn ein Client mehr oder weniger Fehlerhaft beendet wird, musst du dies auf der Serverseite feststellen und an die anderen weitersenden...)
      Ich wollte auch mal ne total überflüssige Signatur:
      ---Leer---