2 Befehle über gleichen Socket senden, Möglich ?

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von margarete.

    2 Befehle über gleichen Socket senden, Möglich ?

    Hi, mein vorhaben ist es eine server client kommunikation herzustellen, sodass ich nun ein programm habe dass auf einem button die listening funktion aktiviert und mit dem anderem button eine message an den gegenüber senden kann (in diesem fall "ey yo") .
    Das problem ist, dass mein program auf 2 gleiche sockets listen muss . Wenn ich dies probiere dann kommen nachrichten im direktfenster wie " eine ausnahme des typs "system.invalidoperationexception" ist in system.dll aufgetreten oder das gleiche mit " system.net.sockets.socketexception" .

    Ich vermute dass es daran liegt dass man keine verbindung für 2 sockets aufbauen kann von einem rechner(IP) . Nur wie löse ich jetz das problem, jemand ein trick oder sonstiges? ?(

    Der code :

    1. VB.NET-Quellcode

      1. Imports System.Net.Sockets
      2. Imports System.Text
      3. Public Class Form1
      4. Dim TcpListen As New TcpListener(8000) 'begin accept ausprobieren
      5. Dim TcpClient As TcpClient = TcpListen.AcceptTcpClient
      6. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
      7. TcpListen.Start()
      8. Dim NetworkStream As NetworkStream = TcpClient.GetStream
      9. Dim bytes(TcpClient.ReceiveBufferSize) As Byte
      10. NetworkStream.Read(bytes, 0, CInt(TcpClient.ReceiveBufferSize))
      11. Dim ClientData As String = Encoding.ASCII.GetString(bytes)
      12. txtListen.Text = ClientData
      13. End Sub
      14. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
      15. Dim NetworkStream As NetworkStream = TcpClient.GetStream
      16. Dim Message As String = "Ey Yo"
      17. Dim sendbytes As Byte() = Encoding.ASCII.GetBytes(Message)
      18. NetworkStream.Write(sendbytes, 0, sendbytes.Length)
      19. End Sub
      20. End Class


    ich erklärs mal explizit :
    ich habe ein program das auf connections wartet auf dem port 8000 .
    außerdem will ich mehrere verschiedene clienten gleichzeitig annehmen . (wie geht das? :S )
    das problem JETZT ist : wenn ich mit dem clienten programm zum programm connecte das auf den port 8000 listened dann geht ja alles gut ( dann ist in dem server ein label und da steht dann "client connected" ) NUR habe ich jetz noch mit dem server ein button eingebaut der dann den clienten dazu bringen soll mir eine nachricht zu senden .

    Beide befehle habe ich für verschiedene buttons, wenn ich auf den listen button drücke dann haben client und server dauerhaft eine verbindung . wenn ich jetz den anderen button auch noch drücke (um einen neue message zu bekomm) dann sind sozusagen ZWEI verbindungen zwischen gleichem client und server und dies geht nicht.

    wie kann man das lösen ?
    Mir scheint, du hast das Prinzip von TCP nicht verstanden:
    Ein Server horcht auf Port X, der ist nun blockiert. Der Client connected und baut eine Verbindung auf einem anderen, freien Port Y auf. Der Port Y ist nun auch blockiert. Nur eine TCP-Verbindung pro Port!
    Du solltest auf keinen Fall eine Zeile wie 6 verwenden. Schau dir mal eines der gängigen TCP-Tutorials an.
    O_o , tut mir leid ich dachte dass man mehrere clienten an einen server (listener ) connecten kann .
    Da es ja auch so funktioniert bei anderen programmen, wie chat programmen und games zb. cs .
    nunja schade dass soetwas nicht möglich ist .

    könntest du mir gute tutorials empfehlen ? :S
    server != listener (oder in VB-Schreibweise: server <> listener ;) )
    Jedenfalls was deine Auffassung von "Server" betrifft.
    Stell dir allerdings den "Server" jetzt als das Programm an sich vor, dass sich um die Verbindungen von/zu den Clients kümmert.
    Du erstellst also solch einen Server und lässt ihn auf einem Rechner laufen. Der Server öffnet dabei einen (Server-)Socket auf einem bestimmten (in den meisten Fällen *einzigen*) Port.
    Die acceptClient() Methode ist eigentlich eine blockende-Methode, das bedeutet, dass der Programmfluss solange gestoppt ist, bis sich ein neuer Client zu dem Server verbunden hat, danach wird der Code weiter durchgelaufen.

    Jetzt hast du einen Verbindung von einem einzelnen Client.
    Willst du mehrere Clients haben, müsstest du entweder einen single-threaded select-Server wählen, aber das ist nicht ganz ohne, oder, was einfacher ist für jeden Client einen neuen Thread erzeugen, der sich um die Kommunikation kümmert z.B.:
    (Zur besseren Lesbarkeit unnötige Code-Trennungen)
    Client c = Server.acceptClient()
    clientListe.add( new Kommunikator(c) )

    Dabei stellt der Server dann wirklich nur noch den Server da, der Clients annimmt und einer Liste hinzufügt. Der Kommunikator hingegen ist der "wichtigere" Teil, er kümmert sich um alles was zu einem Client gesendet und von einem empfangen wird.

    Nur so zur Übersicht. Solltest dir trotzdem ein gutes Tutorial suchen.