Существуют ли «формальные» передовые практики?
в тестировании такого рода программного обеспечения?
Я могу поговорить об этом, но я уверен, что здесь есть какая-то полезная информация о стеке или о дикой природе.
При проведении интеграционного тестирования, как
я могу проверить производительность этого
сервер в нескольких подключениях / высокий
латентные ситуации (более конкретно,
как смоделировать эти ситуации)?
Для простого начала напишите несколько процедур тестирования и регистрации, запустив их в отдельном блоке, который забивал сервер множеством запросов ... включая бессмысленные. Запуск log4net на обоих также был бы полезен. Как уже было сказано, можно ввести некоторую задержку через своего рода прокси ... ящик, который находится между клиентом и сервером. Клиент указывает на прокси-сервер, и прокси-сервер изменяет данные ... задержку, изменение порядка пакетов и т. Д. ... отправку на сервер ... в обратном порядке и повторите. Немного в стороне ... Я бы избегал Thread.Sleep (...). Лучше использовать что-то вроде этого:
lock (timelock) { Monitor.Wait(timelock, TimeoutInMilliseconds); }
... асинхронные версии
Socket.Accept / Socket.Receive? Могу я
заменить асинхронные методы для
обрабатывая их синхронные версии в
отдельные темы?
У вас есть много опций, асинхронные методы, обычные старые потоки, пул потоков, TPL и т. Д. Лучший выбор зависит от приложения.
Вот пример асинхронного сокета сервера из записи MSDN для сокетов .
По счастливой случайности ... Книга О'Рейли: C # 4.0 в двух словах имеет превосходный набор примеров TCP-сервера , которые охватывают как асинхронные, так и потоковые методы. в блокирующих / неблокирующих проявлениях. Вот один из примеров ....
public class Server
{
public void Serve(IPAddress address, int port)
{
TcpListener listener = new TcpListener(address, port);
listener.Start();
while (true)
{
TcpClient c = listener.AcceptTcpClient();
Task.Factory.StartNew(Accept, c);
}
}
void Accept(object clientObject)
{
using (TcpClient client = (TcpClient)clientObject)
{
using (NetworkStream n = client.GetStream())
{
byte[] data = new byte[5000];
int bytesRead = 0; int chunkSize = 1;
while (bytesRead < data.Length && chunkSize > 0)
{
bytesRead +=
chunkSize = n.Read /// Read is blocking
(data, bytesRead, data.Length - bytesRead);
}
Array.Reverse(data);
n.Write /// Write is blocking
(data, 0, data.Length);
}
}
}
}
Надеюсь, это полезно.
P.S. Получить копию C # 4.0 в двух словах ... это хорошо.