在测试这种软件时是否有任何'正式'的良好做法 ?
我可以说这个,但我确定这里有一些很好的信息在堆栈或在野外。
在做集成测试,如何 做我测试在多个连接这个 服务器的性能/高 延迟的情况下(更具体地说, 如何模拟这些情况)?
为了一个简单的开始,写一些测试和日志记录程序,在一个单独的盒子上运行它们,这个程序以一系列的请求摧毁了服务器......包括无意义的请求。在两者上运行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