【问题标题】:Getting Response from telnet C# tcpclient从 telnet C# tcpclient 获取响应
【发布时间】:2020-12-15 16:19:50
【问题描述】:

我一直在浏览有关我所关心的问题的答案,但我找不到具体的答案,或者至少找不到关于从 Telnet 连接获得响应的清晰想法。这是我的代码:

TcpClient vpnMI = new TcpClient("127.0.0.1", 7505);
String message = "hold release\n";

Byte[] data = System.Text.Encoding.ASCII.GetBytes(message);
NetworkStream stream = vpnMI.GetStream();

stream.Write(data, 0, data.Length);
Console.WriteLine("Sent {0}", message);

data = new Byte[256];

MemoryStream memoryStream = new MemoryStream();

String responseData = String.Empty;
Int32 bytes = 0;
do
{
    bytes = stream.Read(data, 0, data.Length);
    memoryStream.Write(data, 0, bytes);                    
}
while (stream.DataAvailable);
responseData = System.Text.Encoding.ASCII.GetString(memoryStream.ToArray());
Console.WriteLine("Received: {0}", responseData);

// Close everything.
stream.Close();
vpnMI.Close();

但我只能在发送“保持释放”之前得到响应,即使之后有响应。 提前感谢您的回复。

【问题讨论】:

  • 感谢您的回复@TheGeneral,但您的意思是永远?是因为stream.DataAvailable 吗?
  • 如果服务器发送大量数据DataAvailable将永远为真。 Telnet 客户端不能那样工作。过去,他们会立即将从服务器接收到的每个字节发送到控制台。更聪明的方法是逐行读取输出。您可以为此使用 StreamReader。您可以使用StreamWriter 写入服务器而无需将字符串显式转换为字节
  • 谢谢@PanagiotisKanavos 我在这方面还是不太擅长,所以如何逐行读取输出?我应该设置一个循环来检查该行是否为 != none?

标签: c# tcpclient


【解决方案1】:

我正在使用这段代码,如果有帮助你可以看看:

public async Task<string> SendMessageAsync(string host, int port, string message, string encoding = "utf-8")
    {

        using (var tcpClient = new TcpClient())
        {
            //connect
            await tcpClient.ConnectAsync(host, port);
            using (NetworkStream networkStream = tcpClient.GetStream())
            {

                //write message to stream
                var enc = Encoding.GetEncoding(encoding);
                var bytes = enc.GetBytes(message);
                await networkStream.WriteAsync(bytes, 0, bytes.Length);

                //read response from stream
                var buffer = new byte[READ_BUFFER_SIZE];
                using (var ms = new MemoryStream())
                {
                    //read all bytes to ms
                    while (true)
                    {
                        int byteCount = await networkStream.ReadAsync(buffer, 0, READ_BUFFER_SIZE);
                        ms.Write(buffer, 0, byteCount);

                        if (byteCount < READ_BUFFER_SIZE)
                        {
                            break;
                        }
                    }

                    //convert ms to string
                    ms.Seek(0, SeekOrigin.Begin);
                    using (StreamReader sr = new StreamReader(ms, enc))
                    {
                        var result = await sr.ReadToEndAsync();

                        return result;
                    }

                }
            }
        }
    }

networkStream.ReadAsync() 返回实际从流中读取的字节数,如果此计数小于您尝试读取的计数,则为最后一部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-17
    • 2015-05-13
    • 2018-07-10
    • 2016-06-19
    • 1970-01-01
    • 2013-05-13
    • 2013-06-17
    • 2011-12-20
    相关资源
    最近更新 更多