Multiserver (TCP)

    • VB.NET

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

      och ne, das is aber net ernsthaft deine frage...
      aber ich helfe gerne ;)

      google mal nach: "wie ist meine ip" usw...

      Dann Regelst du noch ein kleines Problem im Router, wo hier auch ein Thread ist ;)

      Das Connecten könnte dann so aussehen: 215.54.56.43 Port: 8767

      mfg

      gfc
      Zu meiner Frage, ein paar anderen threads davor...

      Wie werfe ich einen User vom Server raus?
      Also nicht mit /kick, sondern so, damit falls mal ein Typ mit eigenen Client vom Server aus disconnected wird?

      Also besser: Ich möchte die Verbindung eines Client beim Server schliessen/abbrechen.

      Frage: Wie mach ich das? oder: wie könnte ich das machen?

      mfg

      gfcwfzkm
      direkt beim start einen befehl abfragen wie z.b. "auth 1337", falls die erste nachricht nich diese ist, verbindung schließen

      VB.NET-Quellcode

      1. Private Sub ListenToConnection(ByVal con As Connection)
      2. If Not con.streamr.ReadLine Is "auth 1337" Then
      3. con.stream.close()
      4. End If
      5. Do
      6. Try
      7. Dim tmp As String = con.streamr.ReadLine ' warten, bis etwas empfangen wird...
      8. Console.WriteLine(con.nick & ": " & tmp)
      9. SendToAllClients(con.nick & ": " & tmp) ' an alle clients weitersenden.
      10. Catch ' die aktuelle überwachte verbindung hat sich wohl verabschiedet.
      11. list.Remove(con)
      12. Console.WriteLine(con.nick & " has exit.")
      13. Exit Do
      14. End Try
      15. Loop
      16. End Sub


      so müsste es funktionieren, wobei dies auch kein 100% schutz ist, über einen sniffer kann man das ganz einfach auslesen & simulieren/eingeben...
      Hallo,
      ich habe da mal eine frage,
      ist es möglich ein update zu realisieren mit diesem Server ?

      Ich habe bereits in mein Client eine abfrage der aktuellsten Version eingebaut und das funktioniert auch,
      aber nun würde ich mir noch wünschen,
      das wenn ich dann denn Button drücke zum updaten,
      das dann der client zum server sendet update starten ( soweit auch kein problem ) ,
      und der Server dann die Datei zum Client sendet.

      Ist das überhaupt machbar ?
      Natürlich ist das machbar.
      Du müsstest die Update-Datei stückchenweise als Byte-Array rüberschicken.
      Ein kleines Beispiel, wie das funktionieren könnte:

      VB.NET-Quellcode

      1. Dim Buffer(1023) As Byte ' Puffer für die einzelnen Stücke der Datei
      2. Dim BufferSize As Integer = Buffer.Length ' Größe des Puffers in einer Variable speichern; in unserem Fall 1024 (nicht 1023!)
      3. Dim FS As System.IO.FileStream = System.IO.File.Open("Datei", System.IO.FileMode.Open, System.IO.FileAccess.Read) ' Die Datei, die gesendet werden soll ("Datei" damit ersetzen), öffnen
      4. Dim NS As System.Net.Sockets.NetworkStream = DerTcpClient.GetStream() ' "DerTcpClient" ist das TcpClient-Objekt des Clients.
      5. Dim BytesRead As Integer ' Variable, die später die Anzahl der gelesenen Bytes angibt
      6. Do
      7. ' Lese 1024 Bytes (BufferSize) von der Datei.
      8. ' Die gelesenen Bytes werden in der oben deklarierten Variable Buffer gespeichert, zur späteren Verwendung.
      9. ' Die Read()-Methode gibt die Anzahl der Bytes zurück, die tatsächlich gelesen wurden. Dieser Wert wird in BytesRead gespeichert.
      10. BytesRead = FS.Read(Buffer, 0, BufferSize)
      11. If BytesRead <> 0 Then ' Wenn mehr als 0 Bytes, also nicht nichts, gelesen wurden...
      12. NS.Write(Buffer, 0, BytesRead) ' ... dann wird dieses Stückchen (Buffer) in den NetworkStream geschrieben...
      13. NS.Flush() ' ... und an den Client gesendet.
      14. End If
      15. Until BytesRead <> BufferSize ' Das soll mindestens einmal und so lange gemacht werden, bis weniger ausgelesen wurde als 1024 (BufferSize). Das würde bedeuten, die Datei ist zuende gelesen.
      16. FS.Dispose() ' FS wieder disposen (Datei schließen etc.)
      Hallo,

      ich habe ein Problem und zwar krieg ich das nicht gebacken einen gescheiten Zeilenumbruch einzubauen.
      Der Text, den die Nutzer schreiben, geht in der Listbox einfach weiter ohne eine Scrollbar oder so.
      Deshalb würde ich gern einen Zeilenumbruch einbauen. Hat jemand eine Idee? Google konnte mir auch nicht wirklich helfen.

      Und ich würde gern wissen auf was ich genau den Code umstellen muss? Hab mir den Source komplett angeschaut checke aber gar nichts:

      VB.NET-Quellcode

      1. Console.WriteLine(c.nick & " has joined.")
      2. ' falls alle anderen das auch lesen sollen können, an alle clients weiterleiten.


      Ich möchte die Nutzer dann dementsprechend in eine zweite Listbox (Userliste) eintragen (Das bekomme ich aber selbst hin).

      So ich hoffe man kann mir helfen.

      Mit freundlichen grüßen.
      Was ist die Frage? Ich denke mal wie man ne Userlist macht und wie man einen Zeilen umbruch bei ner Listbox macht oder?
      Wie addest du den Eintrag denn in die Listbox ich versteh nicht wie man da keinen Zeilenumbruch hat.

      Und zur Userlist:
      Du musst den Namen zu allen Clients senden und irgendwie einzigartig machen .Also wenn der Client z.b. Gangstersheep-joined-121422152151245251 erhält addet er Gangstersheep in seine Listbox.
      So hät ichs gemacht.
      Hallo Leute,
      ich möchte mich erstmal bedanken für die hilfe zwecks dem updater,
      habe das mit hilfe des codes von haiyyu hinbekommen.


      Ich habe aber nun ein ganz anderes Problem,
      hänge schon denn ganzen tag daran,
      aber ich komme mit denn delegaten einfach nicht zu rande.

      Ich habe das verbinden und das senden vom client in ein modul gepackt sowie auch das server_listen() ist in diesem Modul drin.

      Der Server liefert mir alles zurück wie ich das möchte und das wertet mir auch mein Client aus,
      das sehe ich daran das die Massagebox angezeigt wird.

      Ich möchte dann aber das er mir eine neue Form öffnet und die alte schließt,
      dies bekomme ich einfach nicht hin.

      Ich hoffe nun hier auf Hilfe eurer seits.

      Hier mein Ganzer Code aus dem Modul:

      VB.NET-Quellcode

      1. Imports System.Net.Sockets
      2. Imports System.IO
      3. Module verbindung_herstellen
      4. Private stream As NetworkStream
      5. Private streamw As StreamWriter
      6. Private streamr As StreamReader
      7. Private client As New TcpClient
      8. Private server_mail As New Threading.Thread(AddressOf server_listen)
      9. Dim IP As String = "**************"
      10. Dim Port As Integer = ************
      11. Public Function verbinden()
      12. Try
      13. client.Connect(IP, Port)
      14. If client.Connected Then
      15. stream = client.GetStream
      16. streamw = New StreamWriter(stream)
      17. streamr = New StreamReader(stream)
      18. client_send(HDWID)
      19. Register = streamr.ReadLine()
      20. server_mail.Start()
      21. Return ("yes")
      22. Else
      23. Return ("no")
      24. End If
      25. Catch
      26. Return ("no")
      27. client.Close()
      28. End Try
      29. End Function
      30. Sub client_send(ByVal text As String)
      31. streamw.WriteLine(text)
      32. streamw.Flush()
      33. End Sub
      34. Private Sub server_listen()
      35. While client.Connected
      36. Dim auswährten() As String = Split(streamr.ReadLine(), ";")
      37. If auswährten(0) = "server_send" Then
      38. MsgBox(auswährten(1))
      39. ElseIf auswährten(0) = "register_ok" Then
      40. MsgBox("Du hast dich erfolgreich mit dem Benutzernamen ( " & auswährten(1) & " ) Registriert." & vbCrLf & "Dein Account muss von ein Admin Aktiviert werden," & vbCrLf & "wir bitten um Verständnis.")
      41. ' hier soll er eine neue Form öffnen und die alte schließen
      42. ElseIf auswährten(0) = "userabfrage" Then
      43. MsgBox("Der Benutzername ( " & auswährten(1) & " ) Ist bereits vorhanden." & vbCrLf & "Bitte wähle einen anderen.")
      44. ElseIf auswährten(0) = "regabfrage2" Then
      45. MsgBox("Die Hardwähre ID ihres PC´s ( " & auswährten(1) & " ) Ist bereits vorhanden." & vbCrLf & "Bitte Loggen sie sich ein.")
      46. ElseIf auswährten(0) = "Registrier Fehler" Then
      47. MsgBox("Es Trat ein Fehler bei der Registration auf," & vbCrLf & "bitte Versuchen sie es Später erneut.")
      48. client_send("logout")
      49. ElseIf auswährten(0) = "logout_ok" Then
      50. client.Close()
      51. stream.Close()
      52. streamw.Close()
      53. streamr.Close()
      54. server_mail.Abort()
      55. server_mail.DisableComObjectEagerCleanup()
      56. Application.Exit()
      57. End If
      58. End While
      59. End Sub
      60. End Module


      Ich hoffe ihr könnt mir helfen bei meinem Problem.
      Nur mal so: ist nicht besonders empfehlenswert, Umlaute (Ä, Ö, Ü) in Variablen zu verwenden, so habe es zumindest ich gelernt, und es heißt auch nicht Auswährten, sondern Auswerten ^^

      Ich möchte dann aber das er mir eine neue Form öffnet und die alte schließt,
      dies bekomme ich einfach nicht hin.
      Kommt eine Fehlermeldung?
      Welches Form soll er schließen? Welches soll geöffnet werden?

      Btw., wenn ich mir deinen Code so ansehe, denke ich nicht, dass ein Multiserver das richtige Projekt für dich ist.
      Scheinst noch ziemlicher Anfänger zu sein (keine Rückgabetypen bei Funktionen, unnötiger Einsatz von Try-Catch, MsgBox anstatt MessageBox-Klasse etc.)
      @ Gredsoft

      danke ich werde deine tipps berücksichtiegen und werde es verbessern.

      @haiyyu

      Ich möchte das er mir die form reg schließt un dann die form Login öffnet.

      Also:

      VB.NET-Quellcode

      1. reg.Close()
      2. login.Show()


      Wie meinst du das mit ( keine Rückgabetypen bei Funktionen und unnötiger Einsatz von Try-Catch )

      Edit:

      Du meinst bestimmt das mit dem ( Try-Catch ) in der Funktion verbinden,
      ich habe das eben bearbeitet und hier mein neuer Code von der Verbindung:

      VB.NET-Quellcode

      1. #Region "verbinden"
      2. Public Function verbinden()
      3. client.Connect(IP, Port)
      4. If client.Connected Then
      5. stream = client.GetStream
      6. streamw = New StreamWriter(stream)
      7. streamr = New StreamReader(stream)
      8. client_send(HDWID)
      9. Register = streamr.ReadLine()
      10. server_mail.Start()
      11. Return ("yes")
      12. Else
      13. Return ("no")
      14. client.Close()
      15. End If
      16. End Function
      17. #End Region


      Falls ich damit falsch liege was du damit meinst ( unnötiger Einsatz von Try-Catch )
      dann sage es mir bitte,
      weil nur von Fehlern kann ich lernen und mich auch verbessern,
      das so was nicht mehr vorkommt.

      Bei der Funktion verbinden,
      gebe ich doch werte mit

      VB.NET-Quellcode

      1. Return ("yes")
      zurück oder liege ich dort jetzt falsch ?

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

      Hallo zusammen,

      erst einmal ein Dankeschön für diese prima Tutorial.

      Ich hab vor ein paar Wochen von einem Bekannten zwei kleine "Webserver" ähnlich wie die AVR-NET-IO von Pollin
      bekommen und hab damit ein bisschen herumgespielt. Da das Beispielprogramm das dabei war nicht sonderlich gut war hab
      ich nach einer Möglichkeit gesucht ein eigenes Anzeigeprogramm zu erstellen, erst auf der Basis von Telnet-befehlen,
      dann bin ich am Wocheneden auf dieses Tutorial gestoßen. Nach etlichen versuchen den richtigen Port zu finden hab ich
      den richtigen endlich gefunden und auf der Konsole des Server's kammen die Signale der beiden "Webserver" an und wurden
      auch an die Clients weitergesendet.

      Danach hab ich den Client so umgebaut das dieser mir die Werte die von den "Webservern" kammen in Label's angezeigt werden
      dies hat auch eine ganze Zeit funktioniert. Nach den Erhalt einiger Werte haben sich die beiden "Webserver" immer Aufgehängt.
      Ich glaube es liegt daran das die "Webserver" nicht nur Strings über TCP senden sondern darüber auch Befehle empfangen können.

      Meine Idee ist nun den Client's die die empfangen Werte anzeigen sollen die Nick-Namen "Anzeige1", "Anzeige2", usw... zu geben
      so das der MultiServer die eingehenden Nachrichten (Werte) nur an Client's schickt, die mit dem Nick-Namen "Anzeige" beginnen.
      Hierzu ist mir noch kein Lösungsansatz eingefallen. Vielleicht hat einer von euch eine Lösung für mich.

      Schon jetzt einmal ein Dankeschön an euch.

      MFG Nueax