在測試這種軟件時是否有任何'正式'的良好做法 ?
我可以說這個,但我確定這裏有一些很好的信息在堆棧或在野外。
在做集成測試,如何 做我測試在多個連接這個 服務器的性能/高 延遲的情況下(更具體地說, 如何模擬這些情況)?
爲了一個簡單的開始,寫一些測試和日誌記錄程序,在一個單獨的盒子上運行它們,這個程序以一系列的請求摧毀了服務器......包括無意義的請求。在兩者上運行log4net也會有所幫助。正如已經提到的,通過一種代理服務器,一個位於客戶端和服務器之間的盒子,可以實現一些延遲。客戶端指向代理,代理修改數據...延遲,更改數據包順序等...發送到服務器...反向並重復。稍微放一邊...我會避免Thread.Sleep(...)。最好使用這樣的事情:
lock (timelock) { Monitor.Wait(timelock, TimeoutInMilliseconds); }
...異步版本 Socket.Accept/Socket.Receive?我可以用 替代異步方法 處理它們的同步版本 單獨的線程嗎?
你有很多選擇,異步方法,普通舊線程,線程池,TPL等。最好的選擇是特定於應用程序。
這是來自sockets上的MSDN條目的Asynchronous Server Socket Example。
幸運的是,O'Reilly的書:C# 4.0 in a Nutshell有一組優秀的TCP Server examples,涵蓋了阻塞/非阻塞表現形式中的異步/線程方法。這裏是一個例子....
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 in a Nutshell的副本...很好。
謝謝你的提示,我要去看看這本書。 我認爲設置另一臺機器只是爲了做一些集成測試有點矯枉過正。我希望測試速度快,並通過按下按鈕來運行它們。 – 2010-07-09 16:32:08
你當然可以在同一個盒子裏做測試..但是你會共享相同的網絡堆棧。所以你的結果會有點偏差。這不是一個交易破壞者,你應該意識到可能的副作用......享受。 – Rusty 2010-07-09 17:01:09