Senden von Strings über einen Socket Server

  • Allgemein

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von SpaceyX.

    Senden von Strings über einen Socket Server

    moin, ich habe das Problemm das ich einen Server habe. Das empfangen Funktiuoniert nur das senden nicht. Ich hab folgenden Code

    VB.NET-Quellcode

    1. Module Module1
    2. Sub Main()
    3. Console.WriteLine("Bitte Geben Sie einen Port ein")
    4. Dim port As Integer = Console.ReadLine()
    5. Dim socket As New Net.Sockets.TcpListener(port)
    6. Dim client As Net.Sockets.TcpClient
    7. socket.Start()
    8. Console.WriteLine(Today & " " & TimeOfDay & " // " & "Server Gestartet")
    9. While (True)
    10. client = socket.AcceptTcpClient
    11. Dim reader As New IO.StreamReader(client.GetStream)
    12. Console.WriteLine(Today & " " & TimeOfDay & " // " & reader.ReadToEnd)
    13. reader.Close()
    14. Dim writer As New IO.StreamWriter(client.GetStream)
    15. writer.WriteLine("hallo")
    16. writer.Close()
    17. client.Close()
    18. End While
    19. End Sub
    20. End Module


    Gruß Andy
    Meine Projekte Genesis Game Engine | GFX | smartli.me - Der smarte URL shortener

    SpaceyX schrieb:

    Du schließt den StreamReader und somit den zugrunde liegenden Stream.

    Jo das ist das Problem Fehler meldung im anhang
    Bilder
    • fehler123456.JPG

      39,17 kB, 735×394, 154 mal angesehen
    Meine Projekte Genesis Game Engine | GFX | smartli.me - Der smarte URL shortener

    Wie meinst du das, ich muss der read stream doch Schließen bevor ich den Write Stream Öffne oder ?
    das wäre der neue Code:

    VB.NET-Quellcode

    1. Sub Main()
    2. Console.WriteLine("Bitte Geben Sie einen Port ein")
    3. Dim port As Integer = Console.ReadLine()
    4. Dim socket As New Net.Sockets.TcpListener(port)
    5. Dim client As Net.Sockets.TcpClient
    6. socket.Start()
    7. Console.WriteLine(Today & " " & TimeOfDay & " // " & "Server Gestartet")
    8. While (True)
    9. Try
    10. client = socket.AcceptTcpClient
    11. Dim reader As New IO.StreamReader(client.GetStream)
    12. Console.WriteLine(Today & " " & TimeOfDay & " // " & reader.ReadToEnd)
    13. Dim writer As New IO.StreamWriter(client.GetStream)
    14. writer.WriteLine("hallo")
    15. reader.Close()
    16. writer.Close()
    17. Catch ex As Exception
    18. Console.WriteLine(Today & " " & TimeOfDay & "#FEHLER // " & ex.Message)
    19. End Try
    20. End While
    21. End Sub


    Gruß Andy
    Meine Projekte Genesis Game Engine | GFX | smartli.me - Der smarte URL shortener

    Nö, musst Du nicht. Sobald die Verbindung hergestellt ist, erzeugst Du Deinen Reader und Deinen Writer und sendest bzw. empfängst Daten. Schliessen musst Du erst, wenn Du es willst oder musst.

    Aber mal so nebenbei. Heute Nachmittag hast Du noch "einen auf dicke Hose gemacht", weil Du ja das in Java umgesetzt hast. Ich mein, mir ists egal und ich will Dich damit nicht anmachen, aber viel Grundlagen sind da nicht zu sehen. Das nur am Rande, denn das Prinzip ist immer das Selbe.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Mit Java geht er auch, aber wenn ich die Strems offen Lasse Passiert gar nichts, d.h. der Server Entfängt nichts und senddet nichts

    grüße Andy
    Meine Projekte Genesis Game Engine | GFX | smartli.me - Der smarte URL shortener

    Pack mal den StreamReader und den StreamWriter in je einen Using-Block, da kannst Du besser überblicken, wo sie verwendbar sind.
    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!
    Danke für deine Antwort, ich sende mal meine Server Klasse und Die Client Klasse. Wenn ich die Strams Offen Lasse dann
    Funktioniert nichts bis ich den Client beende.

    Klasse Client:

    VB.NET-Quellcode

    1. Sub Main()
    2. 1:
    3. Try
    4. Console.WriteLine("Geben Sie eine Nachricht ein")
    5. Dim Client As New Net.Sockets.TcpClient("127.0.0.1", 1234)
    6. Dim writer As New IO.StreamWriter(Client.GetStream)
    7. Dim reader As New IO.StreamReader(Client.GetStream)
    8. writer.WriteLine(Console.ReadLine())
    9. Console.WriteLine(reader.ReadLine)
    10. writer.Close()
    11. reader.Close()
    12. Catch ex As Exception
    13. Console.WriteLine(Today & " " & TimeOfDay & " #FEHLER// " & ex.Message)
    14. End Try
    15. GoTo 1
    16. End Sub


    Klasse Server:

    VB.NET-Quellcode

    1. Sub Main()
    2. Console.WriteLine("Bitte Geben Sie einen Port ein")
    3. Dim port As Integer = Console.ReadLine()
    4. Dim socket As New Net.Sockets.TcpListener(port)
    5. Dim client As Net.Sockets.TcpClient
    6. socket.Start()
    7. Console.WriteLine(Today & " " & TimeOfDay & " // " & "Server Gestartet")
    8. While (True)
    9. Try
    10. client = socket.AcceptTcpClient
    11. Dim reader As New IO.StreamReader(client.GetStream)
    12. Dim writer As New IO.StreamWriter(client.GetStream)
    13. Using reader
    14. Console.WriteLine(Today & " " & TimeOfDay & " // " & reader.ReadToEnd)
    15. End Using
    16. Using writer
    17. writer.WriteLine("hallo")
    18. End Using
    19. client.Close()
    20. Catch ex As Exception
    21. Console.WriteLine(Today & " " & TimeOfDay & " #FEHLER // " & ex.Message)
    22. End Try
    23. End While
    24. End Sub


    Gruß Andy
    Meine Projekte Genesis Game Engine | GFX | smartli.me - Der smarte URL shortener

    @Andy16823:: Das ist ja echt grottig:

    VB.NET-Quellcode

    1. 1:
    2. ' ...
    3. GoTo 1
    Mach Dir eine WinForm-Anwendung und pack die Variablen, die länger als ein Schleifendurchlauf vorhalten müssen, in die Klasse.
    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!
    Den Client habe ich nur auf die Schnelle Erstellt. Aber mein Problem ist das nichts Passiert wenn ich die Daten an den Server Sende. wenn ich den Client beende kommt ein Fehler, ich lade gleich mal das Programm hoch :)

    Gruß Andy
    Dateien
    • Server.zip

      (126,75 kB, 112 mal heruntergeladen, zuletzt: )
    Meine Projekte Genesis Game Engine | GFX | smartli.me - Der smarte URL shortener

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

    Andy16823 schrieb:

    kommt ein Fehler
    Welcher? In welcher Codezeile?
    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!
    Fein.
    Warum machst Du ein Programm, das auf Ereignisse reagieren soll, in eine Console?
    Warum nimmst Du nicht WinForm?
    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!
    Hier mal eine ganz ganz rudimentäres Beispiel. Ich denke, Code ist hier angebracht, da Du ja selber schon was geleistet hast.

    Nach dem Aufruf von write musst Du die .Flush-Methode nutzen, um die Zeichen, bzw. die Zeile auch aus dem Puffer zu schieben. In meinem Beispiel nimmt ein Server eine Verbindung an, wartet auf eine Übertragung (hier einfach das heutige Datum) und sendet das einfach an den Client zurück.

    Server:

    VB.NET-Quellcode

    1. Imports System.Net
    2. Imports System.Net.Sockets
    3. Imports System.IO
    4. Module Module1
    5. Private _server As New TcpListener(New IPEndPoint(IPAddress.Any, 999))
    6. Sub Main()
    7. Dim a As Action = AddressOf AcceptClients
    8. _server.Start()
    9. Console.WriteLine("Server running")
    10. a.BeginInvoke(Nothing, Nothing)
    11. Console.ReadLine()
    12. End Sub
    13. Private Sub AcceptClients()
    14. Do
    15. Dim client As TcpClient = _server.AcceptTcpClient()
    16. Dim reader As New StreamReader(client.GetStream())
    17. Dim writer As New StreamWriter(client.GetStream())
    18. Dim recMessage As String = String.Empty
    19. Console.WriteLine("Client connnected")
    20. recMessage = reader.ReadLine()
    21. Console.WriteLine(recMessage)
    22. writer.WriteLine(recMessage)
    23. writer.Flush()
    24. client.Close()
    25. Loop
    26. End Sub
    27. End Module


    Client:

    VB.NET-Quellcode

    1. Imports System.Net
    2. Imports System.Net.Sockets
    3. Imports System.IO
    4. Module Module1
    5. Sub Main()
    6. Do
    7. Dim input As String = Console.ReadLine()
    8. If input = "send" Then
    9. SendMesage()
    10. End If
    11. Loop
    12. End Sub
    13. Private Sub SendMesage()
    14. Dim client As New TcpClient()
    15. Dim message As String = DateTime.Now.ToLongDateString()
    16. Dim reader As StreamReader = Nothing
    17. Dim writer As StreamWriter = Nothing
    18. Dim recMessage As String = String.Empty
    19. client.Connect(New IPEndPoint(IPAddress.Parse("127.0.0.1"), 999))
    20. reader = New StreamReader(client.GetStream())
    21. writer = New StreamWriter(client.GetStream())
    22. writer.WriteLine(message)
    23. writer.Flush()
    24. recMessage = reader.ReadLine()
    25. Console.WriteLine(recMessage)
    26. client.Close()
    27. End Sub
    28. End Module
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    @SpaceyX Danke so Funktioniert es und auch danke an Allen Anderen Die mir geholfen haben. Das Problem war das flush gefehlt hat :thumbup:

    Grüße Andy
    Meine Projekte Genesis Game Engine | GFX | smartli.me - Der smarte URL shortener

    Ich würde Dir aber dringend empfehlen, dass Du direkt mit Sockets.Socket Instanzen arbeitest. Je weiter abstrahiert etwas ist (hier: TCPClient, Listener), desto mehr geht an Verständnis verloren. Mit Sockets hast Du am meisten Kontrolle über den Datenfluss. Auch zu empfehlen sind die asynchronen Lese- bzw. Sendevorgänge. Sicher sind diese weiter abstrahierten Klassen praktisch, aber wenn man nicht versteht, wie es eine Ebene tiefer abläuft, ist dies nicht von Vorteil.

    EDIT: Ich sehe grade, es gibt für die StreamWriter-Klasse die Property AutoFlush. Stell diese auf True und Du kannst Dir m. E. den Aufruf von Flush sparen.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o

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

    Noch einen Kleine Frage habe ich, ist dies richtig für ein Multitreading Server ?

    VB.NET-Quellcode

    1. Sub Main()
    2. Dim port As Integer = "999"
    3. Console.WriteLine(Today & " " & TimeOfDay & " // " & "Server Gestartet, warte auf Verbindung")
    4. Dim server As New Net.Sockets.TcpListener(port)
    5. server.Start()
    6. While (True)
    7. Dim client As Net.Sockets.TcpClient = server.AcceptTcpClient
    8. Dim tStar As New Threading.Thread(AddressOf task)
    9. tStar.Start(client)
    10. End While
    11. End Sub
    12. Public Sub task(ByVal client_input As Object)
    13. Dim Client As Net.Sockets.TcpClient = DirectCast(client_input, Net.Sockets.TcpClient)
    14. Dim reader As New IO.StreamReader(Client.GetStream)
    15. Dim writer As New IO.StreamWriter(Client.GetStream)
    16. Dim msg_in As String = Nothing
    17. Dim msg_out As String = Nothing
    18. Dim ip As Net.IPEndPoint = Client.Client.RemoteEndPoint
    19. Console.WriteLine(Today & " " & TimeOfDay & " // " & "Verbindung mit Client " & ip.ToString & " wurde Aufgenommen")
    20. msg_in = reader.ReadLine()
    21. Console.WriteLine(Today & " " & TimeOfDay & " [" & ip.ToString & "] " & " // " & msg_in)
    22. msg_out = "Sie sind Angemeldet"
    23. writer.WriteLine(msg_out)
    24. writer.Flush()
    25. Client.Close()
    26. End Sub
    Meine Projekte Genesis Game Engine | GFX | smartli.me - Der smarte URL shortener

    Darf ich etwas Offtopic werden und fragen wieso du SpaceyX beinhart ignorierst?
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!