Multiserver (TCP)

    • VB.NET

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

      Wenn du private Nachrichten einbauen willst kannst du folgendermaßen vorgehen:

      Client sendet Nachricht an Server (z.B "Message:Hallo|To:User5") => Server empfängt Daten, ließt diese aus und leitet die Nachricht an User5 weiter, falls dieser in der Clientliste vorhanden ist.



      LG
      Aber es ist immer wieder das selbe das die einfach nur kb haben ihr Hirn einzuschalten oder sich als Neulinge dreckt an das schwerste Project der Welt wagen bei jeder kleinsten frage nach fragen anstelle mal selbst zu überlegen und am ende das Project e in die Tonne hauen da sie nicht damit klar kommen...

      Den Server in eine Form gepresst

      Super Tutorial!

      Der Server ist prima aber ich möchte Ihn gern aus der Konsolenumgebung raus holen und in eine Windows Forms laufen lassen. Ja, ich kann im Projekt Mappen Explorer auf Eigenschaften gehen und dort eine Forms Anwendung draus machen. Nun starte ich das ganze mit einer Form (Listbox) aber bekomme das Servermodul nicht zum laufen. Also laufen tut es ja schon (der Client funzt) aber wie bekomme ich nun die Writelineasugaben (Nickname hat sich angemeldet) in eine hübsche Listbox? Ich weiß nicht weiter und lese hier schon seit Stunden. Ich sag schonmal Danke

      Auf Verbindung warten und wiederaufnehmen

      Hi!
      Ich habe den Code so modifiziert, dass er am Anfang auf die Verbindung zum Server wartet (bis er an ist) und sich gegebenenfalls reconnected (falls Server abgestürzt ist...).
      Das auf den Server warten geht schon, die Verbindugn wiederaufzunehmen quittiert vb.net mit "Eine Ausnahme (erste Chance) des Typs "System.Net.Sockets.SocketException" ist in System.dll aufgetreten.", das kommt zwar auch beim auf verbindung warten, wird abr durhc eine connection abgelöst, bei reconnecten aber nicht, er spuckt die meldung dauerhaft in die konsole (ist mit catch try...)

      Hier der Code:

      VB.NET-Quellcode

      1. Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
      2. Dim connected As Boolean = False
      3. Do While connected = False
      4. Try
      5. client.Connect("127.0.0.1", 8000) ' hier die ip des servers eintragen.
      6. ' da dieser beim testen wohl lokal läuft, hier die loopback-ip 127.0.0.1.
      7. If client.Connected Then
      8. stream = client.GetStream
      9. streamw = New StreamWriter(stream)
      10. streamr = New StreamReader(stream)
      11. streamw.WriteLine(nick) ' das ist optional.
      12. streamw.Flush()
      13. t.Start()
      14. connected = True
      15. Else
      16. connected = False
      17. End If
      18. Catch ex As Exception
      19. connected = False
      20. End Try
      21. Loop
      22. End Sub
      23. Private Sub Listen()
      24. While client.Connected
      25. Try
      26. Me.Invoke(New DAddItem(AddressOf AddItem), streamr.ReadLine)
      27. Catch
      28. Dim connected As Boolean = False
      29. Do While connected = False
      30. Try
      31. client.Connect("127.0.0.1", 8000) ' hier die ip des servers eintragen.
      32. ' da dieser beim testen wohl lokal läuft, hier die loopback-ip 127.0.0.1.
      33. If client.Connected Then
      34. stream = client.GetStream
      35. streamw = New StreamWriter(stream)
      36. streamr = New StreamReader(stream)
      37. streamw.WriteLine(nick) ' das ist optional.
      38. streamw.Flush()
      39. t.Start()
      40. connected = True
      41. Else
      42. connected = False
      43. End If
      44. Catch ex As Exception
      45. connected = False
      46. End Try
      47. Loop
      48. End Try
      49. End While
      50. End Sub

      Manawyrm schrieb:

      Achte bitte darauf, Quellcode über den Quellcode Tab im Posteditor einzufügen,
      sonst wird er wie bei dir zerquetscht!

      Gruß,
      Tobias


      bearbeitet
      hast du auch ne lösung für das problem?
      Der Server ist prima aber ich möchte Ihn gern aus der Konsolenumgebung raus holen und in eine Windows Forms laufen lassen. Ja, ich kann im Projekt Mappen Explorer auf Eigenschaften gehen und dort eine Forms Anwendung draus machen. Nun starte ich das ganze mit einer Form (Listbox) aber bekomme das Servermodul nicht zum laufen. Also laufen tut es ja schon (der Client funzt) aber wie bekomme ich nun die Writelineasugaben (Nickname hat sich angemeldet) in eine hübsche Listbox? Ich weiß nicht weiter und lese hier schon seit Stunden. Ich sag schonmal Danke
      Nimm einfach bei streamreder den konsolenoutput und sende ihn statt an die konsole an die listbox...

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „M3gaFr3ak“ ()

      Hey,

      Ich habe mir mal den Code des Programms ein bisschen vorgenommen und verstehe den auch ganz gut.
      Nun habe ich das Problem, dass ich ungerne den Usern zeigen möchte, wie man kickt.
      Diese bekommen jetzt immer beim kick folgende Nachricht: "/kick XY".

      Dann probierts natürlich direkt jeder aus und kann kicken.
      Wie kann ich die Funktion absichern?

      Liebe Grüße :)
      Okay, das ist ne gute Idee...
      Ich wollte es anfangs irgendwie so machen:

      VB.NET-Quellcode

      1. If s.Contains("/kick") Then
      2. ListBox1.ClearSelected()
      3. End If

      Wollte aber nicht so recht :(
      Müsste das denn nicht trotzdem irgendwie so gehen?

      Also kann man bewusst Nachrichten unterdrücken?

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

      Wenn du den Code den du verwendest ganz gut verstehst, dann sollte dir doch klar sein, an welcher Stelle du ansetzen musst.
      Durch das Clearen der Items einer Listbox unterdrückst du sicher nicht das Senden von Daten.

      Der Client sendet Daten an den Server.
      Dieser hat eine Prozedur, in welcher der Server die Daten empfängt und dann an alle (anderen) Clients sendet.
      Ggf. solltest du versuchen, diese zu finden und dort anzusetzen.
      Das ist meine Signatur und sie wird wunderbar sein!
      Klar.

      Du hast ja im Quelltext die Funktion SendToAllClients (oder so ähnlich). Die nimmst du dir und benennst sie z.B in SendToClient und fügst ihr die Value Name an. Darin vergleichst du dann einfach die ListOf mit dem Namen und schickst es nur an den der übereinstimmt.

      Doppelte Usernamen müssen natürlich ausgefiltert werden. Klingt aber schwerer als es ist.
      Wird dass nicht trotzdem an alle geschickt ich wüsste jetzt nicht wie ich das machen soll
      Nur:
      erst in ne list box laden überprüfen ob der richtige Name drin steht ,....
      Problem: es wird ja trotzdem an alle geschickt also kein Problem das auszulesen

      wie kann ich das machen, dass es wirklich nur der bekommt, der es soll
      Ich habe das bei mir so gelöst:

      VB.NET-Quellcode

      1. Private Sub Sendtoperson(ByVal s As String, ByVal Nick As String)
      2. For Each Connection In list
      3. Try
      4. If Connection.nick = Nick Then
      5. Connection.streamw.WriteLine()
      6. Connection.streamw.Flush()
      7. End If
      8. Catch
      9. End Try
      10. Next
      11. End Sub


      Achja - kein C&P selber überlegen ;)
      Hi,
      Erst einmal danke für dieses gute Beispielpogramm.
      Allerdings habe ich damit ein kleines Problem.
      Bei mir klappt es zwar, sich selbst Nachrichten zu schicken, aber wenn ein anderer, z.B. Mein Freund das pogramm auch geöffnet hat, laufen beide Pogramme parallel und unabhängig von einander.
      Mein Freund sieht nicht was ich schreibe und andersrum.
      Ich verstehe allerdings nicht, warum das nicht klappt.
      Ich habe den Orginalcode ausprobiert und nichts verändert. Warum klappt das nicht?
      MfG Calvin
      Vorerst, wenn dein Freund sich außerhalb deines Netzwerkes befindet, solltest du die entsprechenden Ports freischalten. Da man ja jeden Tag eine neue IP-Adresse zugewiesen bekommt, kannst du dich am besten bei einem Host wie DynDns oder NO-IP registrieren. Dann kriegst du einen festen Hostnamen zugewiesen. Im Router kann man meist so eine dynamische DNS (ich denke das ist der richtige Ausdruck) automatisch aktualisieren lassen. Ansonsten musst du es immer manuell machen.