Сохраняйте это простым.
Абстрагируйтесь от сетевого уровня.Я обычно использую интерфейс, который называется что-то вроде INetworkChannel
, который выглядит примерно так:
public interface INetworkChannel : IDisposable
{
void Connect(IPEndPoint remoteEndPoint);
void Send(byte[] buffer, int offset, int count);
public event EventHandler Disconnected;
public event EventHandler<ReceivedEventArgs> Received;
}
Это позволяет легко протестировать все, и вы можете создать SecureNetworkChannel
класс, который использует SslStream
или FastNetworkChannel
который использует новые методы Async.
Детали, например, какой поток используется или если вы используете TcpClient
или Socket
, не должны иметь значения для остальной части приложения.
Редактировать
Тестирование реализации INetworkingChannel
также легко, поскольку теперь у вас есть класс с очень четкой ответственностью.Я создаю соединение с моими реализациями, чтобы проверить их.Пусть TcpListener
прослушивает порт 0
, чтобы ОС могла назначить свободный порт.
Я просто проверяю, правильно ли он обрабатывает отправку и получает, и правильно ли он выполняет очистку при закрытии / разрыве соединения.