Clientsname vom Server zurück geben

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Clientsname vom Server zurück geben

    Hallo liebe Leute, könnt ihr mir sagen wie ich meinem Server sagen kann das er mir eine Liste zurück geben soll, mit denn Namen der Clients die dann in der ListBox des Clients angezeigt werden soll.?
    Der Code besteht teilweise aus einem anderen Tutorial von diesem Forum!

    Mein Server

    VB.NET-Quellcode

    1. Imports System.Net.Sockets
    2. Imports System.IO
    3. Imports System.Net
    4. ' TCP-MultiServer
    5. ' C 2009 - Vincent Casser
    6. Module Module1
    7. Private server As TcpListener
    8. Private client As New TcpClient
    9. Private ipendpoint As IPEndPoint = New IPEndPoint(IPAddress.Any, 8087) ' eingestellt ist port 8000. dieser muss ggf. freigegeben sein!
    10. Private list As New List(Of Connection)
    11. Private Structure Connection
    12. Dim stream As NetworkStream
    13. Dim streamw As StreamWriter
    14. Dim streamr As StreamReader
    15. Dim nick As String ' natürlich optional, aber für die identifikation des clients empfehlenswert.
    16. End Structure
    17. Private Sub SendToAllClients(ByVal s As String)
    18. For Each c As Connection In list ' an alle clients weitersenden.
    19. Try
    20. c.streamw.WriteLine(s)
    21. c.streamw.Flush()
    22. Catch
    23. End Try
    24. Next
    25. End Sub
    26. Sub Main()
    27. Console.WriteLine("Der Server läuft!")
    28. server = New TcpListener(ipendpoint)
    29. server.Start()
    30. While True ' wir warten auf eine neue verbindung...
    31. client = server.AcceptTcpClient
    32. Dim c As New Connection ' und erstellen für die neue verbindung eine neue connection...
    33. c.stream = client.GetStream
    34. c.streamr = New StreamReader(c.stream)
    35. c.streamw = New StreamWriter(c.stream)
    36. c.nick = c.streamr.ReadLine ' falls das mit dem nick nicht gewünscht, auch diese zeile entfernen.
    37. list.Add(c) ' und fügen sie der liste der clients hinzu.
    38. Console.WriteLine(c.nick & " ist beigetreten.")
    39. ' falls alle anderen das auch lesen sollen können, an alle clients weiterleiten. siehe SendToAllClients
    40. Dim t As New Threading.Thread(AddressOf ListenToConnection)
    41. t.Start(c)
    42. End While
    43. End Sub
    44. Private Sub ListenToConnection(ByVal con As Connection)
    45. Do
    46. Try
    47. Dim tmp As String = con.streamr.ReadLine ' warten, bis etwas empfangen wird...
    48. If tmp = "/test" Then
    49. MsgBox("Befehl erfolgreich")
    50. ElseIf tmp = "/listp" Then
    51. SendToAllClients(list.Last.ToString)
    52. End If
    53. Console.WriteLine(con.nick & ": " & tmp)
    54. SendToAllClients(con.nick & ": " & tmp) ' an alle clients weitersenden.
    55. Catch ' die aktuelle überwachte verbindung hat sich wohl verabschiedet.
    56. Console.WriteLine(con.nick & " has exit.")
    57. SendToAllClients(con.nick & "hat uns verlassen.")
    58. list.Remove(con)
    59. Exit Do
    60. End Try
    61. Loop
    62. End Sub
    63. End Module


    Und das mein Client(1textbox, 1 Button, 1ListBox(Wo die Clients gelistet werden solln), 1richttextbox)

    VB.NET-Quellcode

    1. Imports System.Net.Sockets
    2. Imports System.IO
    3. Imports System.Text.RegularExpressions
    4. Public Class Form1
    5. Private stream As NetworkStream
    6. Private streamw As StreamWriter
    7. Private streamr As StreamReader
    8. Private client As New TcpClient
    9. Private t As New Threading.Thread(AddressOf Listen)
    10. Private Delegate Sub DAddItem(ByVal s As String)
    11. Private nick As String = "unknown"
    12. Private Sub AddItem(ByVal s As String)
    13. rtb_chat.AppendText(String.Format("{0,10}", s) & vbCr)
    14. End Sub
    15. Private Sub Form1_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
    16. Try
    17. client.Connect("127.0.0.1", 8087) ' hier die ip des servers eintragen.
    18. ' da dieser beim testen wohl lokal läuft, hier die loopback-ip 127.0.0.1.
    19. If client.Connected Then
    20. stream = client.GetStream
    21. streamw = New StreamWriter(stream)
    22. streamr = New StreamReader(stream)
    23. streamw.WriteLine(nick) ' das ist optional.
    24. streamw.Flush()
    25. t.Start()
    26. Else
    27. MessageBox.Show("Verbindung zum Server nicht möglich!")
    28. Application.Exit()
    29. End If
    30. Catch ex As Exception
    31. MessageBox.Show("Verbindung zum Server nicht möglich!")
    32. Application.Exit()
    33. End Try
    34. End Sub
    35. Private Sub Listen()
    36. While client.Connected
    37. Try
    38. Me.Invoke(New DAddItem(AddressOf AddMessage), streamr.ReadLine)
    39. 'Me.Invoke(New AddMessage(streamr.ReadLine))
    40. Catch
    41. MessageBox.Show("Verbindung zum Server nicht möglich!")
    42. Application.Exit()
    43. End Try
    44. End While
    45. End Sub
    46. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    47. nick = My.Settings.benutzername
    48. End Sub
    49. Private Sub AddMessage(ByVal msg As String)
    50. rtb_chat.AppendText(msg & vbCrLf)
    51. End Sub
    52. Private Sub btn_sendmessage_Click(sender As Object, e As EventArgs) Handles btn_sendmessage.Click
    53. streamw.WriteLine(txt_sendmessagebox.Text)
    54. streamw.Flush()
    55. txt_sendmessagebox.Clear()
    56. End Sub
    Definiere

    Lord_Else schrieb:

    Namen der Clients
    In jedem Falle solltest Du mit Else oder Continue Do arbeiten.
    Im Client-Thread musst Du bei Application.Exit() danach ein Return einbauen, damit der Thread ordentlich beendet wird.
    Und: Machst Du Option Strict On.
    Meinst Du beim Server dies (Nur der Frager bekommt eine Antwort):
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub ListenToConnection(o As Object)
    2. Dim con As Connection = DirectCast(o, Connection)
    3. Do
    4. Try
    5. Dim tmp As String = con.streamr.ReadLine ' warten, bis etwas empfangen wird...
    6. If tmp = "/test" Then
    7. MsgBox("Befehl erfolgreich")
    8. ElseIf tmp = "/listp" Then
    9. For Each c As Connection In list ' an alle clients weitersenden.
    10. Try
    11. con.streamw.WriteLine("Info:" & c.nick) ' Hier die Info reinschreiben
    12. con.streamw.Flush()
    13. Catch
    14. End Try
    15. Next
    16. 'SendToAllClients(list.Last.nick)
    17. Else
    18. Console.WriteLine(con.nick & ": " & tmp)
    19. SendToAllClients(con.nick & ": " & tmp) ' an alle clients weitersenden.
    20. End If
    21. Catch ' die aktuelle überwachte verbindung hat sich wohl verabschiedet.
    22. Console.WriteLine(con.nick & " has exit.")
    23. SendToAllClients(con.nick & "hat uns verlassen.")
    24. list.Remove(con)
    25. Exit Do
    26. End Try
    27. Loop
    28. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Lord_Else schrieb:

    und nicht an alle.
    steht in meinem Post.
    Wohin die Ergebnisse ausgegeben werden, musst Du halt organisieren.
    Sinnvoll wäre da noch eine END_OF_TRANSMISSION-Kennung, dass der Client weiß, dass die Übertragung zu Ende ist.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Lord_Else schrieb:

    zurückgeben
    Du musst Dir mit For Each einen Übertragungsstring aufbauen, der nach jedem Einzelnamen ein Trennzeichen hat.
    Nach dem letzten Namen machst Du

    RodFromGermany schrieb:

    eine END_OF_TRANSMISSION-Kennung
    rein. Das ganze musst Du auf Client-Seite natürlich entsprechend auswerten.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!