Я реализовал клиент сокета, используя класс TcpClient. Поэтому я могу отправлять и получать данные, все работает хорошо. Но я спрашиваю у некоторых гуру: Есть ли что-то не так с моей реализацией? возможно, есть лучший способ сделать что-то. В частности, как мне обращаться с разъединениями? Есть ли какой-нибудь индикатор (или, может быть, я могу написать его сам), который говорит мне, что сокет отключен?Асинхронный сокет клиент с использованием класса TcpClient C#
Я также изучил функции async, ожидающие функции класса Socket, но не могу обернуть мою голову вокруг «SocketAsyncEventArgs», почему она там в первую очередь. Почему не могу я просто: ждать Client.SendAsync («данные»);?
public class Client
{
private TcpClient tcpClient;
public void Initialize(string ip, int port)
{
try
{
tcpClient = new TcpClient(ip, port);
if (tcpClient.Connected)
Console.WriteLine("Connected to: {0}:{1}", ip, port);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
Initialize(ip, port);
}
}
public void BeginRead()
{
var buffer = new byte[4096];
var ns = tcpClient.GetStream();
ns.BeginRead(buffer, 0, buffer.Length, EndRead, buffer);
}
public void EndRead(IAsyncResult result)
{
var buffer = (byte[])result.AsyncState;
var ns = tcpClient.GetStream();
var bytesAvailable = ns.EndRead(result);
Console.WriteLine(Encoding.ASCII.GetString(buffer, 0, bytesAvailable));
BeginRead();
}
public void BeginSend(string xml)
{
var bytes = Encoding.ASCII.GetBytes(xml);
var ns = tcpClient.GetStream();
ns.BeginWrite(bytes, 0, bytes.Length, EndSend, bytes);
}
public void EndSend(IAsyncResult result)
{
var bytes = (byte[])result.AsyncState;
Console.WriteLine("Sent {0} bytes to server.", bytes.Length);
Console.WriteLine("Sent: {0}", Encoding.ASCII.GetString(bytes));
}
}
И использование:
static void Main(string[] args)
{
var client = new Client();
client.Initialize("127.0.0.1", 8778);
client.BeginRead();
client.BeginSend("<Names><Name>John</Name></Names>");
Console.ReadLine();
}
'if (bytesRead == 0) return; 'Мне кажется неправильным? – Sir
Все в порядке. 'NetworkStream.ReadAsync' возвращает 0, когда поток закрывается с удаленной стороны. Однако, в зависимости от приложения, может возникнуть больше смысла бросать здесь исключение вместо того, чтобы просто возвращаться. Это был просто пример. Однако, кажется, что 'await' отсутствовал до' ReadAsync' в моем примере. Я это исправил. – Matthias247
Что вы подразумеваете под закрытым с удаленной стороны? Как это соотносится с тем, когда отправляемое сообщение завершено/достигнуто EOF. Но в будущем все еще может быть больше сообщений. Одна вещь, которую я пытаюсь выработать на данный момент, - это то, как продолжать чтение входящих сообщений из потока с соединением, которое никогда не закрывается. В документах MS мало примеров постоянных подключений, они вскоре закрываются после чтения. – Sir