Multiserver (TCP)

    • VB.NET

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

      Hi,

      sry, dass ich das thema nochmal ausgrabe... ich habe mir den chatserver & client mal rauskopiert - und vevor jetzt jemand wieder rumnölt: "wieder so n C&P noob" nein ich bin kein C&P noob, denn ich verstehe den code auf bis auf 2 oder 3 kleinigkeiten, die mir aber (noch) keine schwierigkeiten bereiten. ich hänge momentan an einer ganz anderen ecke fest:

      und zwar habe ich versucht, den client so umzuschreiben bzw. eine funktion einzubauen, dass der client bei verbindungsverlust nach einigen sekunden neu verbindet, bzw. wenn das fehlschlägt, dass er es so lange weiterprobiert, bis es klappt.

      das funzt aber nur teilweise... und ich wäre super froh, wenn ihr mir dabei helfen könntet. ich habe dafür einen eigenen beitrag geschrieben... falls es keinen stress gibt, dass diese beiträge jetzt parallel das gleiche thema behandeln, könnt ihr auch gerne hier antworten... ansonsten bitte hier

      ich hoffe, dass ihr mir helfen könnt^^

      KnifeHunter
      aka. EsTari
      [line] [/line]
      groß/kleinschreibung ist nur was für leute, die den text anders nicht lesen können :D
      Hoi,

      ich möchte, das der Client sehen kann, ob das "Server-Programm" online ist, nicht aber der Computer.
      Also soll er nicht den PC anpingen, sondern quasi das Programm.
      Damit ich eine feste Server-Liste einbauen kann.

      Nun meine Frage...

      Wie mach ich das blos?

      mfg
      Du brauchst mindestens einen Server mit einer festen IP, welcher dir die Liste der eigentlichen Server übergibt. Dann musst du dich mit diesen verbinden und z.B. einen Befehl senden ala "\info", wenn dann z.B. "info: blabla server v1.2.3" rauskommt, dann ist es auch das richtige Server Programm und du kannst es als Online übergeben...

      Ob ein Broadcast übers Internet funktioniert weiß ich nicht, glaub aber wohl kaum^^
      Ich wollte auch mal ne total überflüssige Signatur:
      ---Leer---
      hallo,
      frage1:ist es möglich den "server" auf einen kostenlosen hoster zu laden?
      frage2:wie kann ich statt dem user namen 2 textboxen machen (passwort/username) die online abgelesen werden(wegen registrierung)?


      mfg robin
      Hallo,

      ich setz den Skript als Dienst ein und hab das Problem das er sich immer wieder beendet.

      Was kann ich tun ?

      Hier die Logeinträge:

      Fehler:
      Anwendung: SVS-Server.exe
      Frameworkversion: v4.0.30319
      Beschreibung: Der Prozess wurde aufgrund einer unbehandelten Ausnahme beendet.
      Ausnahmeinformationen: System.ArgumentOutOfRangeException
      Stapel:
      bei System.ThrowHelper.ThrowArgumentOutOfRangeException()
      bei System.Collections.Generic.List`1[[SVS_Server.SVSServer+Connection, SVS-Server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]].RemoveAt(Int32)
      bei System.Collections.Generic.List`1[[SVS_Server.SVSServer+Connection, SVS-Server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]].Remove(Connection)
      bei SVS_Server.SVSServer.ListenToConnection(System.Object)
      bei System.Threading.ThreadHelper.ThreadStart_Context(System.Object)
      bei System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
      bei System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
      bei System.Threading.ThreadHelper.ThreadStart(System.Object)

      Nächster:
      Fehler:

      Name der fehlerhaften Anwendung: SVS-Server.exe, Version: 1.0.0.0, Zeitstempel: 0x4dba713b
      Name des fehlerhaften Moduls: KERNELBASE.dll, Version: 6.1.7601.17514, Zeitstempel: 0x4ce7bafa
      Ausnahmecode: 0xe0434352
      Fehleroffset: 0x0000b727
      ID des fehlerhaften Prozesses: 0x13a0
      Startzeit der fehlerhaften Anwendung: 0x01cc064734f5e54b
      Pfad der fehlerhaften Anwendung: C:\VB2010\SVS-Server\SVS-Server\bin\Debug\SVS-Server.exe
      Pfad des fehlerhaften Moduls: C:\Windows\syswow64\KERNELBASE.dll
      Berichtskennung: 7bb89281-723a-11e0-b3d7-00262d626ac6

      Nächster:
      Information:
      Fehlerbucket , Typ 0
      Ereignisname: CLR20r3
      Antwort: Nicht verfügbar
      CAB-Datei-ID: 0

      Problemsignatur:
      P1: svs-server.exe
      P2: 1.0.0.0
      P3: 4dba713b
      P4: mscorlib
      P5: 4.0.0.0
      P6: 4d53693b
      P7: 210
      P8: 18
      P9: System.ArgumentOutOfRange
      P10:

      Angefügte Dateien:

      Diese Dateien befinden sich möglicherweise hier:
      C:\ProgramData\Microsoft\Windows\WER\ReportQueue\AppCrash_svs-server.exe_3233b44a376c163561735ca124c3e3511b7d2ec_155f6366

      Analysesymbol:
      Es wird erneut nach einer Lösung gesucht: 0
      Berichts-ID: 7bb89281-723a-11e0-b3d7-00262d626ac6
      Berichtstatus: 4

      Nächster:
      Information:
      Fehlerbucket , Typ 0
      Ereignisname: CLR20r3
      Antwort: Nicht verfügbar
      CAB-Datei-ID: 0

      Problemsignatur:
      P1: svs-server.exe
      P2: 1.0.0.0
      P3: 4dba713b
      P4: mscorlib
      P5: 4.0.0.0
      P6: 4d53693b
      P7: 210
      P8: 18
      P9: System.ArgumentOutOfRange
      P10:

      Angefügte Dateien:

      Diese Dateien befinden sich möglicherweise hier:
      C:\ProgramData\Microsoft\Windows\WER\ReportQueue\AppCrash_svs-server.exe_3233b44a376c163561735ca124c3e3511b7d2ec_155f6366

      Analysesymbol:
      Es wird erneut nach einer Lösung gesucht: 0
      Berichts-ID: 7bb89281-723a-11e0-b3d7-00262d626ac6
      Berichtstatus: 0
      NACHRICHT GELÖSCHT
      "Der Zugriff auf einen Socket war aufgrund der Zugriffsrechte des Sockets unzulässig."

      edit:
      Port geändert, jetzt geht es.

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

      Wie schafft man es das wenn der Client die Verbindung verliert sie wieder aufbauen kann? Bei mir will das nicht klappen wenn ich beim Sub Listen in den Catch auf connect verlinke das ist der main bei mir. Wie muss ich es machen?

      Danke
      ähm was? Einfach neu Connecten? kannst ja auch ne Methode Reconnect machen...
      Außerdem musst du glaub ich beim TCPClient eine neue Instanz erzeugen...
      Ich wollte auch mal ne total überflüssige Signatur:
      ---Leer---
      Soll ich den Text oben nochmal kopieren? Dann wärs nochmal erklärt :P

      z.b. So:

      VB.NET-Quellcode

      1. Sub Reconnect()
      2. Dim endPoint As IPEndPoint = DirectCast(client.Client.RemoteEndPoint,IPEndPoint)
      3. If client.Connected Then'Schließt falls nötig den alten Client
      4. client.GetStream().Close() 'Für den Fall, dass du bereits ein Stream-Objekt hast natürlich dieses verwenden...
      5. client.Close()
      6. End If
      7. client.Dispose()
      8. client = New TCPClient()'Erzeugt die oben genannte Neue Instanz
      9. client.Connect(endPoint)
      10. End Sub

      Natürlich komplett aus dem Kopf geschrieben wie immer...
      Ich wollte auch mal ne total überflüssige Signatur:
      ---Leer---
      okey, das prinzip habe ich verstanden so ählich habe ich es auch gemacht aber bei dem endpoint wusste ich nicht mehr weiter. Danke jedenfalls. Aber das Problem ist ja wo soll ich das aufrufen? Es kommt immer eine Meldung ich debugge nochmal und poste die Meldung.
      Hallo, ich nochmal.
      Ich habe folgenden Code:

      VB.NET-Quellcode

      1. ' Client-Verbindung (Button-Click-Action)
      2. streamw.WriteLine("Login:" & TextBox_uname.Text & ":" & TextBox_pw.Text)
      3. streamw.Flush()
      4. ' Server-Verbindung
      5. c.nick = c.streamr.ReadLine ' Streamreader
      6. If (c.nick.Contains("Login")) Then ' When "Login" enthalten ist
      7. Dim splitted As String() = c.nick.Split(":")
      8. Console.WriteLine("Request contains 'Login'") ' Nachricht, Testweise
      9. Dim myAdapter As New MySqlDataAdapter
      10. Dim SQLAbfrage As String = "SELECT * FROM benutzer WHERE Benutzername='" + splitted(1) + "' AND Passwort='" & MD5StringHash(splitted(2)) & "'"
      11. Dim myCommand As New MySqlCommand
      12. myCommand.Connection = conn
      13. myCommand.CommandText = SQLAbfrage
      14. Console.WriteLine(myCommand.CommandText) ' Testweise
      15. '...


      Mein Problem ist, dass der Reader die Nachricht zwar in der Konsole wiedergibt (Login:Test:test), aber die Nachricht "Request contains 'Login'" nicht in der Konsole steht und dementsprechend auch keine MySQL-Abfrage durchgeführt wird.

      Woran könnte das denn liegen?

      Mit freundl. Grüßen
      Padarom
      Da wo der Fehler immer kommt baust du einen Try-Catch Block drumherum und im Catch-Block rufst du dann Reconnect auf...
      bzw. oft lässt sich das auch bereits vorher beheben...
      If client.Connected z.B. bei der Endlosschleife zum auslesen verwenden(Try-Catch wird trotzallem noch benötigt, falls du das Pech hast, dass Connected bereits zurückgegeben wurde und der Client genau in diesem Moment geschlossen worden ist(Problem bei Multithreading...xD))

      Edit:
      @Padarom:
      "Login" müsste dann auch im Benutzernamen stehen, denn nur dieser wird mit dem ersten mal ReadLine ausgelesen, ansonsten müsstest du das ganze anders gestalten...z.B. in der nächsten Zeile auslesen...
      Ich wollte auch mal ne total überflüssige Signatur:
      ---Leer---
      Ok, das prob ist ich rufe Reconnect beim Try Catch block von listen auf. Wo soll ich ihn den aufrufen?

      edit: Bin ich blöd: So sollte es doch eig. gehen oder?

      VB.NET-Quellcode

      1. Sub connect()
      2. Try
      3. client.Connect("127.0.0.1", 8000)
      4. If client.Connected Then
      5. stream = client.GetStream
      6. streamw = New StreamWriter(stream)
      7. streamr = New StreamReader(stream)
      8. streamw.WriteLine(EncryptStr(nick))
      9. streamw.Flush()
      10. t.Start()
      11. Else
      12. connect()
      13. End If
      14. Catch ex As Exception
      15. connect()
      16. End Try
      17. End Sub

      geht aber nicht. Zumindest wenn der Client connected war wieder disconnected dann baut er nichts mehr auf