Multiserver (TCP)

    • VB.NET
      Das ist ein sehr gutes Tuturial und es hat mir schon sehr geholfe, aber ich vestehe nicht was das me.invoke im Client zu tuen hat und wenn ich es einfach per streamreader.readline versuche, erhalte ich einen Error.... kann mir da wer weiterhelfen? :D
      Das Me.Invoke trägt dazu bei, dass der Thread, wo die ganze Zeit streamreader.ReadLine() ausgeführt wird, Zugriff auf die Controls hat. Denn wenn man keinen Thread erstellen würde, würde das Programm die ganze Zeit eingefroren sein.
      KEINE FRAGEN ÜBER VB PER PN - DIESE WERDEN IGNORIERT UND LANDEN IM PAPIERKORB

      Myrax schrieb:

      Das Me.Invoke trägt dazu bei, dass der Thread, wo die ganze Zeit streamreader.ReadLine() ausgeführt wird, Zugriff auf die Controls hat. Denn wenn man keinen Thread erstellen würde, würde das Programm die ganze Zeit eingefroren sein.

      Und wie kann ich den vom Server gesendeten String in eine Variable einlesen lassen? Ich will nicht eine zweite Listbox erstellen in der immer in der ersten Zeile der empfangene Text steht, welcher in eine Variable eingelesen wird und dann geleert wird. (Naja im Notfall schon...)

      Myrax schrieb:

      Jaja, das kann ich nachvollziehen.nicht.

      Sorry :)

      Myrax schrieb:

      was für einen?

      Ich bekomme jetzt komischerweise keine Fehlermeldung mehr, sondern der server stürtzt komplett ab.

      hier der entsprechende Code-Ausschnitt

      Aus dem Client:

      VB.NET-Quellcode

      1. Private Sub addtext2(ByVal s As String)
      2. tmpsplitbykomma = Split(s, ",")
      3. For i As Integer = 0 To tmpsplitbykomma.Count - 1
      4. ListBox2.Items.Add(tmpsplitbykomma(i))
      5. Next
      6. End Sub
      7. Private Sub Listen()
      8. While client.Connected
      9. tmp = streamr.ReadLine
      10. If tmp.Count = 13 Then
      11. If tmpsplitbykomma(0) = 1 Then
      12. RadioButton1.Checked = True
      13. End If
      14. If tmpsplitbykomma(1) = 1 Then
      15. RadioButton2.Checked = True
      16. End If
      17. If tmpsplitbykomma(2) = 1 Then
      18. RadioButton3.Checked = True
      19. End If
      20. If tmpsplitbykomma(3) = 1 Then
      21. RadioButton4.Checked = True
      22. End If
      23. If tmpsplitbykomma(4) = 1 Then
      24. RadioButton5.Checked = True
      25. End If
      26. If tmpsplitbykomma(5) = 1 Then
      27. RadioButton6.Checked = True
      28. End If
      29. If tmpsplitbykomma(6) = 1 Then
      30. RadioButton7.Checked = True
      31. End If
      32. End If
      33. Application.Exit()
      34. Try
      35. streamw.WriteLine("Der Benutzer " & nick & " hat einen Fehler erhalten!")
      36. streamw.Flush()
      37. Catch ex2 As Exception
      38. Application.Exit()
      39. End Try
      40. End While
      41. End Sub


      und vom Server:

      VB.NET-Quellcode

      1. Dim tmp As String = con.streamr.ReadLine
      2. splitted = Split(tmp, " ")
      3. If splitted(0) <> "/who" And splitted(0) <> "/time" And splitted(0) <> "/close" And splitted(0) <> "/text" And splitted(0) <> "/jointo" Then
      4. If tmp <> "" And tmp <> " " Then
      5. Console.WriteLine(str & ":" & tmp)
      6. SendToAllClients(str & ":" & tmp)
      7. End If
      8. End If
      9. If splitted(0) = "/jointo" Then
      10. Console.WriteLine(splitted(1) & " ist Raum " & splitted(2) & " gejoint!")
      11. streamwloginlog.WriteLine("(" & Now.TimeOfDay.ToString & ")" & ":Der Benutzer " & splitted(1) & " hat sich in Raum" & splitted(2) & " Eingeloggt!")
      12. streamwloginlog.Dispose()
      13. newnick = splitted(1)
      14. str = newnick
      15. nick = nick & ";" & splitted(1)
      16. namelang = str.Count
      17. Dim zähler() As String = Split(nick, ";")
      18. überzähler = zähler.Count - 1
      19. SendToAllClients(splitted(1) & " ist gejoint!")
      20. End If
      21. If splitted(0) = "/who" Then
      22. Console.WriteLine("Der Benutzer " & splitted(1) & " Fragt nach Befehl " & splitted(0))
      23. Console.WriteLine("Online sind " & überzähler & " Personen." & "(" & nick & ")")
      24. SendToAllClients("Online sind " & überzähler & " Personen." & "(" & nick & ")")
      25. End If
      26. If splitted(0) = "/time" Then
      27. Console.WriteLine("Der Benutzer " & splitted(1) & " Fragt nach Befehl " & splitted(0))
      28. con.streamw.WriteLine("Es ist " & Now.TimeOfDay.Hours.ToString & " Uhr und " & Now.TimeOfDay.Minutes.ToString & " Minuten.")
      29. Console.WriteLine("Es ist " & Now.TimeOfDay.Hours.ToString & " Uhr und " & Now.TimeOfDay.Minutes.ToString & " Minuten.")
      30. SendToAllClients("Es ist " & Now.TimeOfDay.Hours.ToString & " Uhr und " & Now.TimeOfDay.Minutes.ToString & " Minuten spät.")
      31. End If
      32. If splitted(0) = "/online" Then
      33. Console.WriteLine(Pangria & "," & beowulf & "," & Dacator & "," & gamer & "," & admins & "," & öffentlich & "," & support)
      34. SendToAllClients(Pangria & "," & beowulf & "," & Dacator & "," & gamer & "," & admins & "," & öffentlich & "," & support)
      35. End If
      36. tmp = ""
      37. For l As Integer = 0 To splitted.Count - 1
      38. splitted(l) = ""
      39. Next
      Entferne mal in Zeile 40++ das Try-Catch-Zeugs und gucke, welcher Error dir ausgegeben wird. Das hilft der Fehlersuche - denn dadurch wird der Fehler einfach nur unterdrückt und mehr nicht.
      Außerdem würde ich anstatt hier zu fragen ein neues Thema aufmachen, denn das hat ja nur indirekt was mit dem Server zu tun und der Fehler kommt höchstwarscheinlich von deinem Code.
      KEINE FRAGEN ÜBER VB PER PN - DIESE WERDEN IGNORIERT UND LANDEN IM PAPIERKORB

      vielen dank für den code!! ich glaube ich hab jetzt annäherungsweise wenigstens mal das mit TCP kapiert, aber seltsamerweise bekomme ich im Client bei der zeile "streamw.WriteLine(TextBox1.Text)2 eine NullReferenceExeption, also kann er sich nicht zu dem Server verbinden, (wobei ich mich auch frage, warum er dann nicht in "Catch ex As Exception
      MessageBox.Show("Verbindung zum Server nicht möglich!")" geht)

      der gleiche fehler kommt auch, wenn ich den server gar nicht laufen lasse! woran kann das liegen? und woher weiß ich welche IDs offen sind beim Router?? gibt es welche die standardmäßig immer offen sind??
      wobei ich ja eig die loopback-Ip verwende! liegt es dann beim server an dem "IPAdresse.Any"??? muss ich da eine bestimtme IP eintragen? aber da bringt er einen Fehler bei der LoopbackIP...wäre nett wenn mir jemand helfen könnte
      Gruß Vitox
      @Vorposter:
      1. Warum willst du das machen?
      2. Ja musst noch sicherlich was ändern, wie z.B. dass du da nicht so einfach einen UserListe haben kannst, da der Client ja die Verbindung immer wieder aufbaut, die bleibt nicht bestehen...
      Ich wollte auch mal ne total überflüssige Signatur:
      ---Leer---
      PictureBoxen im Server? Naja, wenn dein Server-Programm eine WindowsFormsApp ist, dann schon ^^.

      Man kann Webcam-bilder senden, jedoch würde ich nach einer passenden Libary suchen. Selbst coden wäre zu kompliziert. Google mal TCPCam oder so, halt die richtigen stichwörter ;)

      mfg
      Im Grunde schickst du einfach nur eine Datei. In deinem Fall wiederholt in einem bestimmten Intervall, je nachdem, wie gut die Verbindung ist und wie flüssig das Ganze auf der anderen Seite aussehen soll.
      Von dem her sollte es kein so großes Problem sein, Beispiele für Dateitransfer wurden hier schon gepostet.
      Ne Methode z.B. wäre es einmal mit Base64 zu "kodieren" und dann mit GZip komprimieren.
      Der nette AliveDevil hat hier mal was dazu gepostet: [VB.NET] GZip Komprimierung und Dekomprimierung mit Base64
      KEINE FRAGEN ÜBER VB PER PN - DIESE WERDEN IGNORIERT UND LANDEN IM PAPIERKORB

      welche IP gibt man an wenn man das etwas abwandelt und dann als chat mit einem Kumpel benutzen will? Also statt der "127.0.0.1", der Loopback-IP. Port hab ich auch schon freigegeben...
      okay danke, das hat jetzt bedingt funktioniert. Aber der Server erkennt nur wenn der Client sich verbunden hat und wenn die Verbindung sich wieder schließt...
      Ich habe da mal eine Sicherheitsfrage die mir Heute so mal so eingefallen ist.
      Da ich etwas mit den Script gespielt habe und ich mir ein Windows ISS Server als versuch Server aufgesetzt habe der natürlich nicht im Netz ist, viel mir folgende Frage ein die ich mir selber nicht beantworten konnte.

      Wo würde ich den Multiserver am Sichersten starten wenn mein versuch Server wie ein Webserver am Netz wäre ?
      Lieber dort wo die Webseiten liegen oder von mir aus auch auf dem Desktop ?

      Bis jetzt habe ich den Multiserver einfach auf den Desktop gepackt und den Port freigegeben fertig.
      Nur macht es Unterschiede in der Sicherheit ?

      Nicht das ich jetzt einen eigenen Server betreiben will aber die Frage Interessiert mich.

      Gruß Mario
      Anglers Fangbuch: 95%



      wieso funktioniert es nicht, wenn ich diese ip nehme:

      VB.NET-Quellcode

      1. Dim wc As New System.Net.WebClient
      2. Dim MeineIP As String = wc.DownloadString(New System.Uri("http://ip.mcandy007.de/")) 'Hier kriege ich einfach meine online IP...

      Das ist die Website, IP müsste auch stimmen...
      und dann bei dem client die variable MeineIP nehme:

      VB.NET-Quellcode

      1. client.Connect(ip, 2209) ' hier die ip des servers eintragen.
      2. ' da dieser beim testen wohl lokal läuft, hier die loopback-ip 127.0.0.1.

      eben statt der loopback-ip, damit es online läuft. Port freigegeben habe ich auch schon.
      Falls ich nicht etwas offentsichtliches falsch gemacht habe, werde ich nochmal versuchen mein Problem auszuführen...