Multiserver (TCP)

    • VB.NET

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

      Verbindungsaufbau langsam

      Hallo,

      ich habe eine Frage zum Verbindungsaufbau der Clienten.

      Und zwar ist es bei mir so, dass ab dem dritten oder vierten Clienten der Verbindungsaufbau sehr lange dauert (ca.10-20sekunden). Die ersten beiden Clienten melden sich sofort an.
      Wenn die Verbindung mal steht, geht alles reibungslos und augenblicklich.
      Woran könnte das evtl. liegen? Der code (Verbindungsaufbau) ist 1zu1 von der ersten Seite dieses Treads übernommen.

      Die Umgebung ist wie Folgt: Ein Hauptserver und mehrere Laptops als Clienten in einem lokalen Netzwerk.

      Danke schon mal für eure Antworten

      Gruß Markus
      mal ne plöde frage:

      wie kann ich abrufen, wann und on die konsole per klick auf das x geschlossen wird?

      VB.NET-Quellcode

      1. Sub Main()
      2. ...
      3. While True ' wir warten auf eine neue verbindung...
      4. ...
      5. End While
      6. ... ' kp wann false is und was genau true ist ...
      7. End Sub


      bitte um aufklärung 8o
      MfG Cyfer
      ---
      Dim Louis.Cyfer As Coder.Object
      Do While Louis.Cyfer.ReadyState <> Louis.Cyfer.ReadyState.Complete
      Application.DoEvents()
      Loop
      ' Der Beste Code ist immer noch der eigene
      ---
      Hallo ich habe versucht in den Client meine IP einzufügen ,damit ich ihn anderen Leuten schicken kann und mit ihnen chatten kann. habe port 8000 freigegeben.
      Wenn ich jetzt debugge kommt beim client ( server ist natürlich gestartet) :


      Quellcode

      1. Eine Ausnahme (erste Chance) des Typs "System.IO.IOException" ist in System.dll aufgetreten.
      2. Eine Ausnahme (erste Chance) des Typs "System.Net.Sockets.SocketException" ist in System.dll aufgetreten.
      3. Eine Ausnahme (erste Chance) des Typs "System.Net.Sockets.SocketException" ist in System.dll aufgetreten.
      4. Eine Ausnahme (erste Chance) des Typs "System.Net.Sockets.SocketException" ist in System.dll aufgetreten.
      5. Eine Ausnahme (erste Chance) des Typs "System.Net.Sockets.SocketException" ist in System.dll aufgetreten.
      6. Eine Ausnahme (erste Chance) des Typs "System.ArgumentNullException" ist in System.Windows.Forms.dll aufgetreten.
      7. Eine Ausnahme (erste Chance) des Typs "System.Net.Sockets.SocketException" ist in System.dll aufgetreten.
      8. Eine Ausnahme (erste Chance) des Typs "System.Net.Sockets.SocketException" ist in System.dll aufgetreten.


      dann connecte ich erfolgreich zum server, beim server steht auch dass ich connected bin, aber wenn ich nun etwas schreibe erscheint es weder beim server noch bei dem Client und nach ca. 20 sekunden wird die verbindung getrennt.
      Hey,

      Ich habe den Server mit Mono auf einem Linux vServer am laufen.

      Doch immer wenn jemand Disconnected, Wird die Verbindung nicht getrennt.
      Wenn ich dies aber Local oder über Hamachi teste, funktioniert alles einfandfrei.

      Ich Hoffe auf Hilfe.

      MFG
      Mythen
      musst vllt vom sewrver aus dc-en und unter umständen den thread richtig beenden lassen (beiderseits)
      MfG Cyfer
      ---
      Dim Louis.Cyfer As Coder.Object
      Do While Louis.Cyfer.ReadyState <> Louis.Cyfer.ReadyState.Complete
      Application.DoEvents()
      Loop
      ' Der Beste Code ist immer noch der eigene
      ---
      Hi

      Ich habe einefrage an euch. Mein Problehm ist das ich nur die neuste Nachricht eines Users angezeigt haben will.

      Meine Nachrichten Sehen so aus :
      UserName/Nachricht

      Jetzt möchte ich aber Alle Nachrichten die User1/ Enthalten löschen! Egal welche Nachricht er geschrieben hatt.
      Zum Schluss soll nur seine Letzt Nachricht Stehen!

      ![EDIT]! Habe es hinbekommen!

      VB.NET-Quellcode

      1. Private Sub AddItem(ByVal s As String)
      2. ' Strings Erstellen
      3. Dim S1, S2, S3 As String
      4. ' Teile Ankommenden String S in Name strTeile1(0) und Nachricht strTeile1(1)
      5. strTeile1 = s.Split("/")
      6. '
      7. For i As Integer = ListBox1.Items.Count - 1 To 0 Step -1
      8. 'Teile den String I In Name strTeile(0) und Nachricht strTeile(1)
      9. S3 = ListBox1.Items(i).ToString
      10. strTeile = S3.Split("/")
      11. ' Baue String Für Suche. Aus Dem Namen strTeile1(0) und der Nachricht strTeile(1).
      12. ' Um Diese Später zu Löschen!
      13. S1 = strTeile1(0) & "/" & strTeile(1)
      14. ' Löscht den Eintrag der den Obengebauten String enthält.
      15. If ListBox1.Items(i).ToString.Contains(S1) Then
      16. ListBox1.Items.RemoveAt(i)
      17. End If
      18. Next
      19. 'Fügt die Neue Nachricht Hinzu.
      20. ListBox1.Items.Add(s)
      21. End Sub

      Ich Weis nicht gerade der beste Code aber es klappt!

      MFG

      Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „VirusWare“ ()

      Ist es auch möglich das irgendwie in einer Forms anwendung einzubauen,
      habe mir vorgestellt das es unten auf der Hauptform läuft, und dan auf Nebenformen
      einstellungsmöglichkeiten usw. hat.

      Edit:

      Zum beispiel wie hier: klick

      Edit 2:

      Ich habe mir schon die Finger wund Gegoogelt unf schon selbst sehr viel rumgebastelt.
      Komme aber trotzdem nur zu den obrigen Ergebnis.
      Keiner kann weiterhelfen?

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „blacky25“ ()

      haiyyu schrieb:

      Root- oder V-Server mieten und den Server da laufen lassen.

      Warum mieten, bei united hoster habe ich mir einen test server für solche dinge geholt, nach zwei tagen mus man dan halt verlängern oder neuen holen ^^
      ich muss das thema auch mal ausgraben,

      ich komme mit dem clientseitigen trennen nicht fit.
      ich möchte das ganze über einen button lösen und die application nicht vollständig beenden.

      stattdessen will ich per button verbinden und trennen können.
      jedoch beim zweiten verbindungsaufbau wird der catch ausgelöst im connect event.

      VB.NET-Quellcode

      1. Public Sub CloseChatConnection()
      2. globalusers.Items.Clear()
      3. chat_rtb.Clear()
      4. streamw.WriteLine("Disconnected")
      5. streamw.Flush()
      6. client.Close()
      7. stream.Close()
      8. streamr.Close()
      9. streamw.Close()
      10. login_button.text = "Login"
      11. End Sub


      VB.NET-Quellcode

      1. Sub chatverbindung(ByVal nick)
      2. Try
      3. client.Connect("127.0.0.1", 8000) ' hier die ip des servers eintragen.
      4. ' da dieser beim testen wohl lokal läuft, hier die loopback-ip 127.0.0.1.
      5. If client.Connected Then
      6. stream = client.GetStream
      7. streamw = New StreamWriter(stream)
      8. streamr = New StreamReader(stream)
      9. streamw.WriteLine(nick) ' das ist optional.
      10. streamw.Flush()
      11. t.Start()
      12. login_button.Text = "Logout"
      13. Else
      14. MessageBox.Show("Verbindung zum Server nicht möglich!")
      15. End If
      16. Catch ex As Exception
      17. MessageBox.Show("Verbindung zum Server nicht möglich!")
      18. End Try
      19. End Sub



      Hier das Button Event zum Verbinden und Trennen.

      VB.NET-Quellcode

      1. Private Sub KryptonButton2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles login_button.Click
      2. If login_button.Text = "Login" Then
      3. If GetAccountStatus(nameinput.Text, pwinput.Text) = True Then
      4. loginstatus_label.Text = "logged in."
      5. chatverbindung(nameinput.Text)
      6. End If
      7. Else
      8. CloseChatConnection()
      9. End If
      10. End Sub


      Wie gesagt, erstes mal Verbinden und Trennen geht. Sobald ich dann nochma verbinden will gibts nur noch "Verbindung zum Server nicht möglich"
      :(
      ja hab ich eben auch rausgefunden das die deklarationen vor den events schon falsch ist :) danke

      so geht es nun bei mir

      VB.NET-Quellcode

      1. Dim client As System.Net.Sockets.TcpClient = Nothing
      2. Dim t As Threading.Thread = Nothing
      3. Sub chatverbindung(ByVal nick)
      4. t = New Threading.Thread(AddressOf Listen)
      5. client = New TcpClient
      6. client.Connect("127.0.0.1", 8000) ' hier die ip des servers eintragen.
      7. ' da dieser beim testen wohl lokal läuft, hier die loopback-ip 127.0.0.1.
      8. If client.Connected Then
      9. stream = client.GetStream
      10. streamw = New StreamWriter(stream)
      11. streamr = New StreamReader(stream)
      12. streamw.WriteLine(nick) ' das ist optional.
      13. streamw.Flush()
      14. t.Start()
      15. login_button.Text = "Logout"
      16. MessageBox.Show("Verbindung hergestellt")
      17. Else
      18. MessageBox.Show("Verbindung zum Server nicht möglich!")
      19. End If
      20. End Sub
      Ich wollte mals hierzu was fragen.
      Also ich habe mir jetzt mit dem Source hier was schönes gemacht, so.
      Nun meine frage, wie kann ich ein Object versenden und als richtiges Object wieder Empfangen.
      Also als Object möchte ich einen String() mit mehreren Einträgen haben.
      Hi Forum,

      ich bin ein Neuer und will hier *nicht* singen ;) Stattdessen hab ich auch mal eine Frage..

      Mein Problem ist ein etwas anderes. Statt 'chat-like', wo viele Clienten zu einem Server verbinden, verbindet ein Client zu vielen Servern! Es geht dabei nicht um torrent oder andere Tauschsysteme, sondern um das Einsammeln von RFID-TagCodes. Die seriellen RFID-Scanner sind via com2lan Converter im Netzwerk zu finden.

      Ich habe nun ein paar verschiedene Sachen probiert, die teilweise auch funktioniert haben, aber dann zu lahm oder zu gefraessig waren. Nun wollte ich mal diesen Ansatz hier probieren und komme beim Listener nicht weiter. Ich denke, das kann nur eine Kleinigkeit sein, die ich uebersehe...
      Habt ihr vielelicht eine Idee woran es liegt, dass der Listener keinen Schimmer von den Verbindungsdaten hat? (Und somit aussteigt)
      .oO( btw macht mich die Code-Formatierung in diesem Editor wahnsinnig.. Soll das so, oder kann ich das etwa auch nicht?? *g )



      VB.NET-Quellcode

      1. ' TCP/IP
      2. Private client As TcpClient = Nothing
      3. Private t As Thread
      4. Private list As New List(Of Connection)
      5. Private c As Connection
      6. Private Structure Connection
      7. Dim stream As NetworkStream
      8. Dim streamw As StreamWriter
      9. Dim streamr As StreamReader
      10. Dim host As String
      11. End Structure
      12. Private Sub DoConnect()
      13. For i As Integer = 0 To arrIPs.Count - 1
      14. ' Threaded connection with new server-IP
      15. client = New TcpClient
      16. c = New Connection
      17. c.host = arrIPs(i)
      18. t = New Threading.Thread(AddressOf Listen)
      19. Try
      20. If client.Connected Then
      21. client.Close()
      22. Thread.Sleep(100)
      23. End If
      24. client.Connect(c.host, 1235)
      25. If client.Connected Then
      26. c.stream = client.GetStream
      27. c.streamw = New StreamWriter(c.stream)
      28. c.streamr = New StreamReader(c.stream)
      29. list.Add(c)
      30. t.Start()
      31. Thread.Sleep(100)
      32. display.Add(timestamp() & "INFO: " & c.host & " - Verbindung zum Server aufgebaut!") : screen(display)
      33. Else
      34. display.Add(timestamp() & "ERROR: " & c.host & " - Verbindung zum Server nicht möglich!") : screen(display)
      35. End If
      36. Catch ex As Exception
      37. display.Add(timestamp() & "FATAL: " & c.host & " - Verbindung zum Server nicht möglich! Error:" & vbCrLf & ex.ToString) : screen(display)
      38. End Try
      39. Application.DoEvents()
      40. Next
      41. End Sub
      42. Private Sub Listen(ByVal con As Connection) ' <<-- Leider hat con keine Verbindungsdaten vom aufrufenden Thread mit bekommen
      43. Do
      44. Try
      45. Dim tmp As String = con.streamr.ReadLine ' warten, bis etwas empfangen wird...
      46. display.Add(timestamp() & con.host & ": " & tmp) : screen(display)
      47. 'SendToAllClients(con.nick & ": " & tmp) ' an alle clients weitersenden.
      48. Catch ' die aktuelle überwachte verbindung hat sich wohl verabschiedet.
      49. list.Remove(con)
      50. display.Add(timestamp() & con.host & " has exit.") : screen(display)
      51. Exit Do
      52. End Try
      53. Loop
      54. End Sub
      Hey,

      sorry, wenn ich den Thread nochmal ausgrabe, aber ich muss dich echt loben (@ Threadersteller)...
      Der Code funktioniert einwandfrei, ich habe ihn nach Copy & Paste (*hust hust :D*) noch mal ein bisschen verändert, und er funktioniert PRIMA!!!


      Grüße

      Gredsoft (Ehemals PhThMaster99)