Multiserver (TCP)

    • VB.NET

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

      Soo..
      Ich habe da mal eine Frage und ein Angebot:

      Frage:
      Wie bekomme ich die "Online-User Liste" seperat hin?
      Also eine eigenständige Liste im Client.

      Angebot:
      Wenn es genug Interesse gibt dann schreibe ich in Perl gerne den Server für Linux.
      Der Server läuft bereits so wie er ist problemlos auf Mac und Linux (bei mir auch aktiv als Lizenzserver auf Debian Lenny am laufen), genauso wie der Client.

      Die Online-Liste kannst du doch ganz einfach selbst realisieren, du musst nur bei Veränderungen (neuer Client oder Client weg) an alle Clients die neuen Daten senden.

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

      Um eine User-online-Liste zu erstellen musst du diese Veränderungen vornehmen:

      Am Client:

      1) eine Listbox1 zur Form hinzufügen
      2) Die "AddItem" Sub so verändern:

      VB.NET-Quellcode

      1. Public Sub AddItem(ByVal s As String)
      2. Dim userlist As String()
      3. If s.StartsWith("/u ") Then
      4. userlist = s.Remove(0, 3).Split(",")
      5. ListBox1.Items.Clear()
      6. ListBox1.Items.AddRange(userlist)
      7. Else
      8. RichTextBox1.Text = RichTextBox1.Text & s & vbCrLf
      9. End If
      10. End Sub


      Man könnte es auch in die "Listen()" sub eingaben nur so geht man den Delegates aus dem Weg.


      Am Server:

      1) Erstellst diese Sub:

      VB.NET-Quellcode

      1. Public Sub Userlist()
      2. Dim users As String = ""
      3. For Each Connections In list
      4. users = users & Connections.nick.ToString & ","
      5. SendToAllClients("/u " & users)
      6. Next
      7. End Sub


      2) Dann schreibst du in die "Main()" Sub hinter:

      VB.NET-Quellcode

      1. list.Add(c)


      das

      VB.NET-Quellcode

      1. Userlist()


      Das wars. Sollte funktionieren!

      Ist nicht das Sauberste aber funktioniert bei mir!


      MFG
      Werewolve

      Ich habe da ein Problem.

      Hallo und danke erstmal für das tolle tut.

      Undzwar kommt bei mir der Fehler:

      Der Name "SendToAllClients" wurde nicht deklariert.

      Bin für jede Hilfe dankbar.

      MFG. David

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

      Also ich hab es jetzt so gemacht wie Werewolve es beschrieben hatte..
      Nun frage ich mich ob das so seine Richtigkeit hat:


      Client:

      VB.NET-Quellcode

      1. Imports System.Net.SocketsImports System.IO
      2. Public Class Form1 Private stream As NetworkStream Private streamw As StreamWriter Private streamr As StreamReader Private client As New TcpClient Private t As New Threading.Thread(AddressOf Listen) Private Delegate Sub DAddItem(ByVal s As String) Private nick As String = "unknown"
      3. Private Sub AddItem(ByVal s As String) ListBox1.Items.Add(s) Dim userlist As String() If s.StartsWith("/u ") Then userlist = s.Remove(0, 3).Split(",") ListBox2.Items.Clear() ListBox2.Items.AddRange(userlist) Else ListBox2.Text = ListBox2.Text & s & vbCrLf End If If s.StartsWith("/kicked") Then
      4. Try client.Close() stream.Close() streamw.Close() streamr.Close() Application.Exit() Catch ex As Exception MsgBox("Fehler!") End Try MsgBox("You are Kicked") Application.Exit() End If End Sub
      5. Private Sub Listen() While client.Connected Try Me.Invoke(New DAddItem(AddressOf AddItem), streamr.ReadLine) Catch
      6. Application.Exit() End Try End While End Sub
      7. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) streamw.WriteLine(TextBox1.Text) streamw.Flush() TextBox1.Clear() End Sub
      8. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load TextBox1.Focus() End Sub
      9. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Form2.ShowDialog() End Sub
      10. Private Sub Form1_leave(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.FormClosed Try client.Close() stream.Close() streamw.Close() streamr.Close() Application.Exit() Catch ex As Exception Application.Exit() End Try End Sub
      11. Private Sub TextBox1_KeyPress_1(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress If e.KeyChar = Convert.ToChar(Keys.Enter) Then streamw.WriteLine(TextBox1.Text) streamw.Flush() TextBox1.Clear() e.Handled = True End If End Sub
      12. Private Sub BeendenToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BeendenToolStripMenuItem.Click Try client.Close() stream.Close() streamw.Close() streamr.Close() Application.Exit() Catch ex As Exception Application.Exit() End Try End Sub
      13. Private Sub NachUpdatesSuchenToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NachUpdatesSuchenToolStripMenuItem.Click If UpdateController1.checkForUpdatesDialog(Me) <> DialogResult.OK Then Exit Sub End If If UpdateController1.showUpdateDialog(Me) = DialogResult.OK Then If UpdateController1.downloadUpdatesDialog(Me) = DialogResult.OK Then UpdateController1.applyUpdate() End If End If End Sub
      14. Private Sub VerbindenTrennenToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles VerbindenTrennenToolStripMenuItem.Click nick = InputBox("Nickname: ", "Namen festlegen", "unknown") Try client.Connect("88.84.134.138", "8500")
      15. If client.Connected Then stream = client.GetStream streamw = New StreamWriter(stream) streamr = New StreamReader(stream)
      16. streamw.WriteLine(nick) streamw.Flush()
      17. t.Start() Else MessageBox.Show("Verbindung zum Server nicht möglich!") Application.Exit() End If Catch ex As Exception MessageBox.Show("Verbindung zum Server nicht möglich!") Application.Exit() End Try End Sub
      18. Private Sub ServerStartenToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ServerStartenToolStripMenuItem.Click Shell("ChatServer.exe") nick = InputBox("Nickname: ", "Namen festlegen", "unknown") Try client.Connect("127.0.0.1", "8000")
      19. If client.Connected Then stream = client.GetStream streamw = New StreamWriter(stream) streamr = New StreamReader(stream)
      20. streamw.WriteLine(nick) streamw.Flush()
      21. t.Start() Else MessageBox.Show("Verbindung zum Server nicht möglich!") Application.Exit() End If Catch ex As Exception MessageBox.Show("Verbindung zum Server nicht möglich!") Application.Exit() End Try End Sub
      22. Private Sub ZuServerVerbindenToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ZuServerVerbindenToolStripMenuItem.Click Form2.ShowDialog() Form2.ShowInTaskbar = False nick = InputBox("Nickname: ", "Namen festlegen", "unknown") Try client.Connect(Form2.TextBox1.Text = """", Form2.TextBox2.Text & """")
      23. If client.Connected Then stream = client.GetStream streamw = New StreamWriter(stream) streamr = New StreamReader(stream)
      24. streamw.WriteLine(nick) streamw.Flush()
      25. t.Start() Else MessageBox.Show("Verbindung zum Server nicht möglich!") End If Catch ex As Exception MessageBox.Show("Verbindung zum Server nicht möglich!") End Try End Sub
      26. Private Sub EinstellungenToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles EinstellungenToolStripMenuItem.Click Form3.ShowDialog() End Sub
      27. Private Sub TrennenToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TrennenToolStripMenuItem.Click Try client.Close() stream.Close() streamw.Close() streamr.Close() Catch ex As Exception Application.Exit() End Try End Sub
      28. Private Sub NetChatToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NetChatToolStripMenuItem.Click AboutBox1.ShowDialog() End Sub
      29. Private Sub DokumentationToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DokumentationToolStripMenuItem.Click Form4.Show() End Sub
      30. Private Sub ChangelogToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ChangelogToolStripMenuItem.Click Todo.ShowDialog() End Sub
      31. Private Sub EntwicklerTeamToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FrinoDevTeamToolStripMenuItem.Click Dev_Team.ShowDialog() End Sub
      32. End Class




      Server:

      VB.NET-Quellcode

      1. Imports System.Net.SocketsImports System.IOImports System.Net
      2. Module Module1 Private server As TcpListener Private client As New TcpClient Private ipendpoint As IPEndPoint = New IPEndPoint(IPAddress.Any, 8000) Private list As New List(Of Connection)
      3. Private Structure Connection Dim stream As NetworkStream Dim streamw As StreamWriter Dim streamr As StreamReader Dim nick As String End Structure
      4. Private Sub SendToAllClients(ByVal s As String) For Each c As Connection In list Try c.streamw.WriteLine(s) c.streamw.Flush() Catch End Try Next End Sub Private Sub SendToClient(ByVal c As Connection, ByVal data As String) c.streamw.WriteLine(data) c.streamw.Flush() End Sub
      5. Sub Main() server = New TcpListener(ipendpoint) server.Start()
      6. While True client = server.AcceptTcpClient
      7. Dim c As New Connection c.stream = client.GetStream c.streamr = New StreamReader(c.stream) c.streamw = New StreamWriter(c.stream)
      8. c.nick = c.streamr.ReadLine
      9. list.Add(c) Userlist() Console.WriteLine("-> " & c.nick & " ist beigetreten.")
      10. For Each d As Connection In list Try d.streamw.WriteLine("-> " & c.nick & " ist beigetreten.") d.streamw.Flush() Catch End Try Next
      11. Dim t As New Threading.Thread(AddressOf ListenToConnection) t.Start(c) End While End Sub
      12. Private Sub ListenToConnection(ByVal con As Connection) Do Try Dim tmp As String = con.streamr.ReadLine Console.WriteLine(con.nick & ": " & tmp) SendToAllClients(con.nick & ": " & tmp)
      13. Catch list.Remove(con) Console.WriteLine(con.nick & " has exit.") Exit Do End Try Loop End Sub
      14. Public Sub Userlist() Dim users As String = "" For Each Connections In list users = users & Connections.nick.ToString & "," SendToAllClients("/u " & users) Next End SubEnd Module




      Weil irgendwie kommt beides in die ListBox2.. Also wenn ein User begetreten ist und die OnlineUser.
      Ich wollte aber eigentlich dass beides seperat ist.
      Also die OnlineUser in der ListBox2 und der Rest in der ListBox1 also der "ChatBox"..
      Wie bekomm ich das nun hin? ?(
      Ja perfekt!

      Hab aber noch eine Kleinigkeit vergessen!

      Ihr müsst jetzt noch verhindern das ein User Text verschickt der mit "/u" anfängt!
      Am besten Ihr baut in die Send Button Prozedur einfach ein:

      VB.NET-Quellcode

      1. If Textbox1.Text.Startswith("/u ") = False then
      2. send blabla
      3. Else
      4. Exit Sub
      5. End if


      oder so!

      MFG
      Werewolve
      ich hab einfach mal dein tut heruntergeldaen. so und jetzthabe ich im ordner "zum testen" einfach server und client gestartet. Im client habe ich dann meinen byte stream reingepostet. und es kam nur ein teil beim server an. obwohl der stream aus nur einer einzgen zeile bestand (halt extrem lange zeile :D ).
      Ich habe den server so umgeproggt das er mir den empfangen stream in einer textdatei speichert. aber wie geasgt. es kam nur ein teil des streams an weil er konnte nicht mehr zu einem bild zurückverwandelt werden. wenn ich den sring direkt wieder encodeirt habe kam mein bild sofort wieder.
      Also meine frage: wie übertragen ich denn dann um gottes namen ein bild :S ich hatte diese idee für so einfach gehalten...
      Senden:

      VB.NET-Quellcode

      1. streamw.write(base64toimage(bmp))
      2. streamw.flush


      das codeiren:

      VB.NET-Quellcode

      1. Public Function Base64ToImage(ByVal sData As String) As Image
      2. Dim oImage As Image = Nothing
      3. If sData.Length > 0 Then
      4. ' String decodieren und in Byte-Array umwandeln
      5. Dim nBytes() As Byte = Convert.FromBase64String(sData)
      6. If nBytes IsNot Nothing AndAlso nBytes.Length > 0 Then
      7. ' Byte-Array in Image-Objekt umwandeln
      8. With New System.Drawing.ImageConverter
      9. oImage = CType(.ConvertFrom(nBytes), Image)
      10. End With
      11. End If
      12. End If
      13. Return (oImage)
      14. End Function


      und beim server:

      VB.NET-Quellcode

      1. Do
      2. Try
      3. Dim tmp As String
      4. tmp = con.streamr.ReadLine ' warten, bis etwas empfangen wird...
      5. base64toimage(tmp)
      6. cahtch
      7. end try
      8. loop


      VB.NET-Quellcode

      1. Public Function Base64ToImage(ByVal sData As String) As Image
      2. Dim oImage As Image = Nothing
      3. If sData.Length > 0 Then
      4. ' String decodieren und in Byte-Array umwandeln
      5. Dim nBytes() As Byte = Convert.FromBase64String(sData)
      6. If nBytes IsNot Nothing AndAlso nBytes.Length > 0 Then
      7. ' Byte-Array in Image-Objekt umwandeln
      8. With New System.Drawing.ImageConverter
      9. oImage = CType(.ConvertFrom(nBytes), Image)
      10. End With
      11. End If
      12. End If
      13. Return (oImage)
      14. End Function


      Das codieren encodieren funt perfekt wenn ichs direkt ausprobiere. es muss also am tcp liegen....
      Wenn ich das richtig sehe ist encoding und decoding das gleiche:

      VB.NET-Quellcode

      1. Public Function Base64ToImage(ByVal sData As String) As Image
      2. Dim oImage As Image = Nothing
      3. If sData.Length > 0 Then
      4. ' String decodieren und in Byte-Array umwandeln
      5. Dim nBytes() As Byte = Convert.FromBase64String(sData)
      6. If nBytes IsNot Nothing AndAlso nBytes.Length > 0 Then
      7. ' Byte-Array in Image-Objekt umwandeln
      8. With New System.Drawing.ImageConverter
      9. oImage = CType(.ConvertFrom(nBytes), Image)
      10. End With
      11. End If
      12. End If
      13. Return (oImage)
      14. End Function


      VB.NET-Quellcode

      1. Public Function Base64ToImage(ByVal sData As String) As Image
      2. Dim oImage As Image = Nothing
      3. If sData.Length > 0 Then
      4. ' String decodieren und in Byte-Array umwandeln
      5. Dim nBytes() As Byte = Convert.FromBase64String(sData)
      6. If nBytes IsNot Nothing AndAlso nBytes.Length > 0 Then
      7. ' Byte-Array in Image-Objekt umwandeln
      8. With New System.Drawing.ImageConverter
      9. oImage = CType(.ConvertFrom(nBytes), Image)
      10. End With
      11. End If
      12. End If
      13. Return (oImage)
      14. End Function


      Dürfte ja eigentlich nicht sein!

      MFG
      Werewolve