Frage

Ich nutze TcpClient Klasse eine Telnet-Verbindung zu implementieren. Was ich nicht weiß, wie das Ende der Reaktion zu bestimmen. Es scheint, dass einmal DataAvailable Eigenschaft wahr ist, ich die Daten von Strom und DataAvailable gelesen wird dann auf false vorübergehend eingestellt, während Puffer mit einem anderen Teil der Daten gefüllt wird, aber ich denke, alle weg lesen und gehen. Wie stelle ich sicher, dass alle Antwort gelesen wurde?

Sie könnten mir sagen, wie Sie den Code-Snippet zu ändern, um diese Arbeit richtig zu machen. Es funktioniert richtig, wenn ich Schritt durch den Code, weil es viel Zeit ist für die gesamte Antwort abgerufen werden. Schätzen Sie Ihre Hilfe.

if (this.Stream.DataAvailable)
{
    readBuffer = new Byte[this.Client.ReceiveBufferSize];
    do
    {
        // read data
        bytes = this.Stream.Read(readBuffer, 0, readBuffer.Length);
        Thread.Sleep(10);
        responseData = String.Concat(responseData, System.Text.Encoding.ASCII.GetString(readBuffer, 0, bytes));

       } while (this.Stream.DataAvailable);

       allDataRead = true;
       break;
}
War es hilfreich?

Lösung

Mit TCP-Verbindungen für Anwendungen wie Telnet gibt es kein solches Konzept als das Ende der Übertragung. Sie werden oft Telnet-Clients finden, die jeden Tastendruck einen nach dem anderen senden, wenn der Benutzer sie eintritt, und es ist bis zu dem Server zu entscheiden, wann Maßnahmen zu ergreifen, in der Regel, wenn es einen Zeilenvorschub wird. Andere Kunden können einige Client-Schlüssel drückt puffern und sie alle auf einmal senden.

Durch das Aussehen Ihrer Anwendung, die Sie für die Linie suchen sollten speist das Ende einer Übertragung anzuzeigen.

do    
{      
     bytes = this.Stream.Read(readBuffer, 0, readBuffer.Length);             
     responseData = String.Concat(responseData, System.Text.Encoding.ASCII.GetString (readBuffer, 0, bytes));       
} while (this.Stream.DataAvailable && !responseData.Contains("\n"));       

Andere Tipps

Ich glaube nicht, es ist eine gute Idee DataAvailable für diesen Zweck zu verwenden. Das Ende der Reaktion ist, was auch immer Ihr Protokoll sagt, es ist.

Es ist besser zu blockierende Aufrufe wie Lesen zu benutzen, um Ihre Sachen zu lesen, und verwenden, was Protokoll, das Sie festgestellt haben, um zu bestimmen, um mehr zu lesen, und wie viel. Es könnte sein, dass nicht alle Daten, die Sie zurückgegeben wünschen, weil Lesen nicht zurück, wenn alle Daten gelesen werden, aber wenn einige Daten gelesen werden, so dass Sie auf überprüfen müssen, wie viel gelesen wurde.

Wenn Ihr Protokoll Telnet, werden Sie wahrscheinlich auf jedes einzelne Byte reagieren wollen empfangen werden, wie mit einem Terminal Sie es echo wollen oder Prozessbefehle oder was nicht.

DataAvailable ist vielleicht geeignet, um zu überprüfen, ob ein Read blockieren würden, wenn sie aufgerufen (es zurück mit dem, was in dem Puffer ist), aber es macht die Schleife weniger einfach.

Ist dies eine tatsächliche Telnet-Verbindung, das heißt verbinden Sie mit einem Telnet-Server oder von ‚telnet‘ meinst du wirklich ‚TCP / IP-Socket‘?

Sie zunächst fest, ob der Server die Verbindung unterbrochen wird, wenn die Übertragung abgeschlossen ist. Wenn ja, können Sie einfach bis zum Ende des Stroms lesen. Andernfalls, wenn nicht, werden Sie haben ein Stichwort in den Daten zu verwenden, um zu bestimmen, ob die Lese abgeschlossen ist. Verschiedene Protokolle arbeiten auf unterschiedliche Weise in dieser Hinsicht so, wenn Sie uns das Protokoll aufklären könnten wir in der Lage sein können, eine direkte Antwort zu geben. Ansätze im Allgemeinen in zwei Lager fallen: unter anderem einer Anzahl von Bytes / Zeichen am Anfang der Antwort (der Empfänger liest einfach, dass vielen Bytes / Zeichen) oder auch eine Markierung mit dem Ende der Reaktion auf begrenzen (der Empfänger liest bis zum Erhalt der Begrenzer).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top