You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

108 lines
1.8 KiB

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp.TelnetSamples
{
internal class AsyncStreamTelnetClient : IAsyncTelnetClient
{
public event EventHandler<string> MessageCallback;
private TcpClient _client;
private NetworkStream _stream;
public async void Connect(string ip, int port = 23)
{
try
{
Close();
_client = new TcpClient();
await _client.ConnectAsync(ip, port);
_stream = _client.GetStream();
Task.Run(ReadAsync);
}
catch (Exception)
{
throw;
}
}
private async void ReadAsync()
{
try
{
StringBuilder sb = new StringBuilder();
byte[] readBuffer = new byte[1024];
while (true)
{
int bytesRead = await this._stream.ReadAsync(readBuffer);
if (bytesRead < 1)
break;
string data = Encoding.ASCII.GetString(readBuffer, 0, bytesRead);
sb.Append(data);
if (!data.EndsWith("\r\n>"))
continue;
// 에코 삭제
string read = sb.ToString();
int rnIdx = read.IndexOf("\r\n");
read = read.Substring(rnIdx + 1);
if (this.MessageCallback != null)
this.MessageCallback(this, read);
sb.Clear();
}
}
catch (Exception)
{
throw;
}
}
public async void SendCommand(string command)
{
try
{
command += "\r\n";
byte[] sendBytes = Encoding.ASCII.GetBytes(command);
await _stream.WriteAsync(sendBytes);
}
catch (Exception)
{
throw;
}
}
public void Close()
{
try
{
if (_client == null)
return;
if (_stream != null)
{
_stream.Flush();
_stream.Close();
}
_client.Close();
_client.Dispose();
}
catch (Exception)
{
throw;
}
}
}
}