Multiserver (TCP)

    • VB.NET

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

      Ton übertragen?

      Meinst du man kann es schaffen sowas wie ein skype gespräch zu proggen?
      Ich dahcte an diesen ansatz: 10sec aufnehmen in parralelen threat uploaden und währendessen nahtlos die nächsten 19 sec ton aufnhemne .. meinst du das geht?
      Hi, schönes Tut.

      Meine Frage ist: Wie würde man nachher noch z. B. den Benutzernamen ändern? Hab da noch andere Werte in die Struktur "Connection" gepackt (Benutzername, Benutzerlevel, in welchen Chaträumen ist der Nutzer, usw.) und die würde ich wenn möglich gerne on-the-fly ändern können.

      Ich hab einfach zum Test den Benutzernamen einer Connection umbenannt während der Laufzeit, aber wenn ich das hier mache

      VB.NET-Quellcode

      1. For Each user as Connection in list
      2. Console.WriteLine(user.userName)
      3. Next

      dann werden nur die alten Benutzernamen gezeigt, die gesetzt wurden, als die Connections zur Liste hinzugefügt wurden.

      Mag nun etwas verwirrend klingen, steh gerade etwas auf'm Schlauch.
      @ Netto Hikari: Hier bietet sich die Verwendung eine Klasse mit entsprechenden Properties an, da du bei Änderung eines Wertes in der Structure diese komplett mit dem neuen Wert komplett neu instanzieren müsstest.
      @ AsdAsd1337: Was soll ich zu so einer Frage sagen? Programmieren? Diese Frage hat nichts mit TCP zu tun.
      Hallo

      @AsdAsd1337: ich glaube eher du bist neu im allgemeinen Programmieren?! Wage dich am besten erstmal an was leichteres, was du selber hinbekommst, ohne es abzugucken ;)

      Mfg jvbsl
      Ich wollte auch mal ne total überflüssige Signatur:
      ---Leer---
      hey hey ^^
      bin neu hier im forum und habe hier gleich mal dieses klasse tutorial von kevin getestet
      vielen dank dafür, habe alles verstanden und funktioniert alles auch klasse

      habe jetzt aber bei einer erweiterung probleme :(
      und zwar wollte ich dass der server den empfangenen text nicht an alle clients weitersendet
      also habe ich in der sub ListenToConnection den aufruf der sub SendToAllClients rausgenommen
      jetzt habe ich aber das problem, dass beim beenden eines clients dieser anscheinend nicht aus der liste entfernt wird
      also keine exception ausgelöst wird und der thread dann in der endlosschleife hängen bleibt und ständig mit system.console.writeline leere zeilen ausgibt
      ich glaube clientseitig habe ich alle streams, sockets usw. korrekt geschlossen
      deshalb sollte meiner meinung nach beim server doch eine exception ausgelöst werden, da der stream ja nicht mehr lesbar ist und die endlosschleife beenden
      bin echt ratlos...

      hier mal noch meine codes
      Spoiler anzeigen

      Client:

      VB.NET-Quellcode

      1. Imports System.Net.Sockets
      2. Imports System.Net
      3. Imports System.IO
      4. Public Class Form1
      5. Private client As New TcpClient
      6. Private stream As NetworkStream
      7. Private streamw As StreamWriter
      8. Private streamr As StreamReader
      9. Private t As New Threading.Thread(AddressOf Listen)
      10. Private Delegate Sub DAddItem(ByVal s As String)
      11. Private Sub AddItem(ByVal s As String)
      12. ListBox1.Items.Add(s)
      13. End Sub
      14. Private Sub Form1_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
      15. Try
      16. client.Connect("127.0.0.1", 1234)
      17. If client.Connected Then
      18. stream = New NetworkStream(client.Client)
      19. stream = client.GetStream
      20. streamw = New StreamWriter(stream)
      21. streamr = New StreamReader(stream)
      22. t.Start()
      23. Else
      24. t.Abort()
      25. client.Close()
      26. stream.Close()
      27. streamw.Close()
      28. streamr.Close()
      29. t.Abort()
      30. MessageBox.Show("Verbindung zum Server nicht möglich!")
      31. Application.Exit()
      32. End If
      33. Catch ex As Exception
      34. t.Abort()
      35. client.Close()
      36. stream.Close()
      37. streamw.Close()
      38. streamr.Close()
      39. t.Abort()
      40. MessageBox.Show("Verbindung zum Server nicht möglich!")
      41. Application.Exit()
      42. End Try
      43. End Sub
      44. Private Sub Listen()
      45. While client.Connected
      46. Try
      47. Me.Invoke(New DAddItem(AddressOf AddItem), streamr.ReadLine)
      48. Catch
      49. t.Abort()
      50. client.Close()
      51. stream.Close()
      52. streamw.Close()
      53. streamr.Close()
      54. t.Abort()
      55. MessageBox.Show("Verbindung zum Server nicht möglich!")
      56. Application.Exit()
      57. End Try
      58. End While
      59. End Sub
      60. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
      61. streamw.WriteLine(TextBox1.Text)
      62. streamw.Flush()
      63. TextBox1.Clear()
      64. End Sub
      65. Private Sub Form1_leave(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.FormClosed
      66. t.Abort()
      67. client.Close()
      68. stream.Close()
      69. streamw.Close()
      70. streamr.Close()
      71. Application.Exit()
      72. End Sub
      73. End Class

      Server:

      VB.NET-Quellcode

      1. Imports System.Net.Sockets
      2. Imports System.IO
      3. Imports System.Net
      4. Imports System.Threading
      5. Module Module1
      6. Private server As TcpListener
      7. Private client As New TcpClient
      8. Private ipendpoint As IPEndPoint = New IPEndPoint(IPAddress.Any, 1234)
      9. Private list As New List(Of ClientConnection)
      10. Private Structure ClientConnection
      11. Dim stream As NetworkStream
      12. Dim streamw As StreamWriter
      13. Dim streamr As StreamReader
      14. Dim IP As String
      15. End Structure
      16. Sub Main()
      17. Console.WriteLine("Der Server läuft!")
      18. server = New TcpListener(ipendpoint)
      19. server.Start()
      20. Dim t1 As New Threading.Thread(AddressOf SendClient)
      21. t1.Start()
      22. While True
      23. client = server.AcceptTcpClient
      24. Dim con As New ClientConnection
      25. con.stream = client.GetStream
      26. con.streamr = New StreamReader(con.stream)
      27. con.streamw = New StreamWriter(con.stream)
      28. Dim tcpip As IPAddress = CType(client.Client.RemoteEndPoint, IPEndPoint).Address
      29. con.IP = tcpip.ToString() & "/" & list.Count
      30. list.Add(con)
      31. Console.WriteLine(con.IP & " has joined.")
      32. Dim t As New Threading.Thread(AddressOf ListenToConnection)
      33. t.Start(con)
      34. End While
      35. End Sub
      36. Private Sub ListenToConnection(ByVal con As ClientConnection)
      37. Dim str As String = Nothing
      38. Do
      39. Try
      40. str = con.streamr.ReadLine()
      41. System.Console.WriteLine(con.IP & ": " & str)
      42. 'SendToAllClients(con.IP & ": " & str)
      43. Catch ex As Exception
      44. list.Remove(con)
      45. Console.WriteLine(con.IP & " has exit.")
      46. Exit Do
      47. End Try
      48. Loop
      49. End Sub
      50. Private Sub SendClient(ByVal con As ClientConnection)
      51. Dim send As String
      52. While True
      53. send = System.Console.ReadLine()
      54. SendToSingleClient(send)
      55. 'SendToAllClients(send)
      56. End While
      57. End Sub
      58. Private Sub SendToAllClients(ByVal s As String)
      59. For Each c As ClientConnection In list
      60. Try
      61. c.streamw.WriteLine(s)
      62. c.streamw.Flush()
      63. Catch ex As IOException
      64. End Try
      65. Next
      66. End Sub
      67. Private Sub SendToSingleClient(ByVal s As String)
      68. Dim tmp As ClientConnection = New ClientConnection
      69. tmp = list.Find(AddressOf FindClient)
      70. tmp.streamw.WriteLine(s)
      71. tmp.streamw.Flush()
      72. End Sub
      73. Private Function FindClient(ByVal Client As ClientConnection) As Boolean
      74. System.Console.WriteLine("Client eingeben: ")
      75. Dim adr As String = System.Console.ReadLine()
      76. If adr = Client.IP Then
      77. Return True
      78. Else
      79. Return False
      80. End If
      81. adr = Nothing
      82. End Function
      83. End Module



      bin über jede hilfe dankbar

      grüße
      massgrave

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

      Hallo leuete,

      Erstmal gutes Tut und vielen dank... nun habe ich ein Problem:

      Ich nutzte diesen Code:
      Spoiler anzeigen

      VB.NET-Quellcode

      1. Imports System.Net.Sockets
      2. Imports System.IO
      3. Public Class Form1
      4. Private stream As NetworkStream
      5. Private streamw As StreamWriter
      6. Private streamr As StreamReader
      7. Private client As New TcpClient
      8. Private t As New Threading.Thread(AddressOf Listen)
      9. Private Delegate Sub DAddItem(ByVal s As String)
      10. Private Sub AddItem(ByVal s As String)
      11. ListBox1.Items.Add(s)
      12. End Sub
      13. 'Programmende
      14. Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
      15. Me.Close()
      16. End Sub
      17. 'Änderungsfenster
      18. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
      19. form3.show()
      20. End Sub
      21. 'Logindaten Form
      22. Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
      23. form2.Show()
      24. End Sub
      25. 'Server starten
      26. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
      27. txtServername.Text = txtServername.Text.Replace("\", "\\")
      28. txtServername.Text = txtServername.Text.Replace("/", "\/")
      29. txtServername.Text = txtServername.Text.Replace(" ", "\s")
      30. txtServername.Text = txtServername.Text.Replace("|", "\p")
      31. txtServerMsg.Text = txtServerMsg.Text.Replace("\", "\\")
      32. txtServerMsg.Text = txtServerMsg.Text.Replace("/", "\/")
      33. txtServerMsg.Text = txtServerMsg.Text.Replace(" ", "\s")
      34. txtServerMsg.Text = txtServerMsg.Text.Replace("|", "\p")
      35. Try
      36. client.Connect(form2.TextBox1.Text, form2.TextBox2.Text)
      37. If client.Connected Then
      38. stream = client.GetStream
      39. streamw = New StreamWriter(stream)
      40. streamr = New StreamReader(stream)
      41. streamw.WriteLine("login " & form2.TextBox3.Text & " " & form2.TextBox4.Text)
      42. streamw.WriteLine("servercreate virtualserver_name=" & txtServername.Text _
      43. & " virtualserver_port=" & txtServerport.Text _
      44. & " virtualserver_maxclients=" & txtSlots.Text)
      45. streamw.WriteLine("logout")
      46. streamw.WriteLine("login " & Form2.TextBox3.Text & " " & Form2.TextBox4.Text)
      47. streamw.WriteLine("use port=" & txtServerport.Text)
      48. streamw.WriteLine("serveredit virtualserver_welcomemessage=" & txtServerMsg.Text)
      49. streamw.WriteLine("serveredit virtualserver_password=" & txtServerPwd.Text)
      50. streamw.WriteLine("logout")
      51. streamw.Flush()
      52. t.Start()
      53. MessageBox.Show("Server gestartet")
      54. End If
      55. Catch ex As Exception
      56. MessageBox.Show("Verbindung zum Server nicht möglich!" & vbCrLf & "Bitte IP und/oder Port prüfen" _
      57. & vbCrLf & "Sowie Benutzername und Passwort prüfen!")
      58. End Try
      59. End Sub
      60. Private Sub Listen()
      61. While client.Connected
      62. Try
      63. Me.Invoke(New DAddItem(AddressOf AddItem), streamr.ReadLine)
      64. Catch
      65. End Try
      66. End While
      67. End Sub
      68. End Class



      Wobei dieser Abschnitt:

      VB.NET-Quellcode

      1. Private Sub AddItem(ByVal s As String)
      2. ListBox1.Items.Add(s)
      3. End Sub


      für die Ausgabe in die Listbox ist.
      Soweit so gut... nur wie bekomme ich z.B die Zeile 5 der ListBox in eine Textbox oder sogar alles in eine RichTextbox???