首页 > 解决方案 > 从 telnet C# tcpclient 获取响应

问题描述

我一直在浏览有关我的担忧的答案,但我找不到具体的答案,或者至少找不到关于从 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();

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

标签: c#tcpclient

解决方案


我正在使用这段代码,您可以看看是否有帮助:

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() 返回实际从流中读取的字节数,如果此计数小于您尝试读取的计数,则为最后一部分。


推荐阅读