TCP-Client-Server-Kommunikation

Ich suche nur nach einem einfachen TCPClient / Listner-Beispiel in Windows Form VB.Net. Ich bin ein Neuling und Microsoft TCPClient / Listner classnbeispiele sind nicht das, was ich suche. Alles, was ich suche, ist, dass der TCPClient eine Nachricht sendet und ein TCPListener die Nachricht erhält und eine Nachricht zurückschickt “Ich habe Ihre Nachricht erhalten”?

Eine kleine Hilfe wäre toll. Ich habe einige Codes, aber nur, um eine Nachricht an den Server und nicht zurück vom Server zum Client zu senden .. Jede Hilfe wird sehr geschätzt werden ..

TCP-Kommunikation wird als Stream-basiert bezeichnet, was bedeutet, dass sie keine Pakete verarbeitet. Aufgrund dieser Nachricht können Nachrichten, die empfangen werden, teilweise oder zusammengelegt werden.

Sie könnten zum Beispiel senden:

Hello!

How are you?

Aber Sie könnten erhalten:

Hello!How are you?

oder:

Hello!How ar

e you?

(oder etwas ähnliches)

Um das zu beheben, müssen Sie etwas anwenden, das “length-prefixing” genannt wird . Längenpräfixierung (oder Längenpräfixierung) bedeutet, dass Sie vor dem Senden einer Nachricht die Länge (Anzahl der Zeichen) am Anfang angeben. Dies kann dann von dem Endpunkt gelesen werden, der dann jede Nachricht entsprechend ihrer Länge liest, so dass es keine Probleme mit teilweisen Nachrichten oder Nachrichten gibt, die zusammengelegt sind.

Das ist nicht die einfachste Sache, aber ich habe zwei classn erstellt, die das alles für Sie erledigen. Sehen Sie sich die folgenden Beispiele an, um sie für einfache nachrichtenbasierte Kommunikation zu verwenden.

Link zur Quelle: http://www.mydoomsite.com/sourcecodes/ExtendedTcpClient.zip

Link zu C # Quelle: http://www.mydoomsite.com/sourcecodes/ExtendedTcpClient%20CSharp.zip

Beispielverwendung

Beachten Sie, dass der Client in diesen Beispielen nicht auf die Clientseite , sondern auf den TcpClient verweist .

Serverseite

  1. Deklarieren Sie zunächst eine neue Variable für ExtendedTcpClient und stellen Sie sicher, dass WithEvents in die Deklaration WithEvents .

     Dim WithEvents Client As ExtendedTcpClient 
  2. Dann benötigen Sie einen TcpListener und einen Timer , um nach eingehenden Verbindungen zu TcpListener .

     Dim Listener As New TcpListener("0.0.0.0", 5555) 'Listen for any connection on port 5555. Dim WithEvents Tmr As New System.Windows.Forms.Timer 
  3. Dann müssen Sie das Tick Event des Timers abonnieren.

     Private Sub Tmr_Tick(sender As System.Object, e As System.EventArgs) Handles Tmr.Tick End Sub 

    Dort suchen Sie über die Listener.Pending() -Methode nach eingehenden Verbindungen. Wenn Sie eine Verbindung akzeptieren, deklarieren Sie zuerst eine neue Instanz des ExtendedTcpClient . Die class benötigt ein Formular als Eigentümer, in dieser Anwendung ist Me das aktuelle Formular.
    Dann verwenden Sie die ExtendedTcpClient.SetNewClient() -Methode mit Listener.AcceptTcpClient() als Argument, um den TcpClient vom Listener zu übernehmen. Setzen Sie diesen Code in den Tmr_Tick Sub:

     If Listener.Pending() = True Then Client = New ExtendedTcpClient(Me) Client.SetNewClient(Listener.AcceptTcpClient()) End If 

    Jetzt sind der Client und der Server miteinander verbunden.

  4. Jetzt müssen Sie das PacketReceived Ereignis des Clients abonnieren. Erstellen Sie ein Sub wie:

     Private Sub Client_PacketReceived(sender As Object, e As ExtendedTcpClient.PacketReceivedEventArgs) Handles Client.PacketReceived End Sub 

    Alle empfangenen Daten werden in einem Array von Bytes dargestellt. Im PacketReceived Sub können Sie das empfangene Paket als Text in eine TextBox . Überprüfen Sie einfach, ob der Paketheader PlainText ist, und dann können Sie den Inhalt der empfangenen Pakete (ein Array von Bytes, auf die über e.Packet.Contents zugegriffen e.Packet.Contents ) in eine Zeichenfolge e.Packet.Contents und in die TextBox .

     If e.Packet.Header = TcpMessagePacket.PacketHeader.PlainText Then TextBox1.AppendText("Message recieved: " & System.Text.Encoding.Default.GetString(e.Packet.Contents) & Environment.NewLine) End If 

    System.Text.Encoding.Default.GetString() konvertiert ein Byte-Array in normalen Text.

  5. Im PacketReceived Sub können Sie auch “Nachricht empfangen” an den Client senden.

     Dim ResponsePacket As New TcpMessagePacket(System.Text.Encoding.Default.GetBytes("Message received."), TcpMessagePacket.PacketHeader.PlainText) ResponsePacket.Send(Client.Client) 'Get the ExtendedTcpClient's underlying TcpClient. 
  6. Schließlich, wenn Sie das Formular schließen, müssen Sie nur den Client trennen.

     Private Sub ServerWindow_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing If Client IsNot Nothing Then Client.Disconnect() End Sub 

Und das ist es für die Serverseite.


Client-Seite

  1. Für die Client-Seite werden Sie genauso viel tun wie die Server-Seite, obwohl Sie weder einen TcpListener noch einen Timer benötigen.

     Dim Client As New ExtendedTcpClient(Me) 'The current form as it's owner. 
  2. Stellen Sie über die IP und den Port, den Sie dem Listener gegeben haben, eine Verbindung zum Server her.

     Client.Connect("127.0.0.1", 5555) 'Connects to localhost (your computer) at port 5555. 
  3. Wenn Sie jetzt Text an den Server senden möchten, tun Sie etwas (zB eine Schaltfläche):

     Dim MessagePacket As New TcpMessagePacket(System.Text.Encoding.Default.GetBytes(TextBox2.Text), TcpMessagePacket.PacketHeader.PlainText) MessagePacket.Send(Client.Client) 

    TextBox2 enthält den Text, den Sie senden möchten.

  4. Schließlich müssen Sie auch hier das PacketReceived Ereignis abonnieren, um nach Antworten vom Server zu PacketReceived . Dort erhalten Sie Text wie der Server.

     Private Sub Client_PacketReceived(sender As Object, e As ExtendedTcpClient.PacketReceivedEventArgs) Handles Client.PacketReceived If e.Packet.Header = TcpMessagePacket.PacketHeader.PlainText Then TextBox1.AppendText(System.Text.Encoding.Default.GetString(e.Packet.Contents) & Environment.NewLine) 'Prints for example "Message received." from the server. End If End Sub 

Und jetzt sollte alles funktionieren!

Link zu einem vollständigen Beispielprojekt (nur Client-zu-Server): http://www.mydoomsite.com/sourcecodes/TCP%20Messaging%20System.zip

Link zu C # Beispiel: http://www.mydoomsite.com/sourcecodes/CSharp%20TCP%20Messaging%20System.zip

Wenn Sie der class weitere Header hinzufügen möchten (die Header geben Ihnen an, um welchen Pakettyp es sich handelt), öffnen TcpMessagePacket.vb einfach TcpMessagePacket.vb und fügen Sie weitere Werte in die PacketHeader (in der Region namens Constants ) ein.

Hoffe das hilft!


Screenshot vom Beispielprojekt

(Klicken Sie auf das Bild für eine größere Auflösung)

Beispiel für die Projektausgabe von ExtendedTcpClient