写了一个异步socket的服务程序,现在如何做并发数量的测试?
我在本机上同时启动了200个客户端,运行正常,但是超过300就开始有连接不上的情况发生,我的机器2.8CPU 1G内存.
同时在两台机器上各运行200个客户端,还是各有一部分的连接不上的情况.
请问,我的服务程序的并发数量就只能是300以下了吗?
并发数量跟什么有关系,如何做测试呢?请有经验的高手指点一下.
我在本机上同时启动了200个客户端,运行正常,但是超过300就开始有连接不上的情况发生,我的机器2.8CPU 1G内存.
同时在两台机器上各运行200个客户端,还是各有一部分的连接不上的情况.
请问,我的服务程序的并发数量就只能是300以下了吗?
并发数量跟什么有关系,如何做测试呢?请有经验的高手指点一下.
2:每个接收线程只接收一个字符串,sleep(10000)后,然后发回客户端.
3:用的只是异步函数,没有自行管理线程,应该是由异步线程池统一管理的.我换到server2003上再试试,可能跟XP的线程数量限制有关系?希望大家多提供更好的建议.
_______________________________________________________________你是说每个客户端有一个线程负责Socket接收吗?如果是的话,此方案肯定不能应付大量客户,二三百个定死无疑.
另外,给一下你用的那个MSDN上的例子的链接,我看一下.
////
每个客户不用一个线程来维持...那怎么保持状态呀?
{
try
{
AsyncCallback recieveData = new AsyncCallback( OnRecievedData );
sock.BeginReceive( m_byBuff, 0, m_byBuff.Length,
SocketFlags.None, recieveData, sock );
}
catch( Exception ex )
{
MessageBox.Show( this, ex.Message, "Setup Recieve Callback failed!" );
}
}public void OnRecievedData( IAsyncResult ar )
{
// Socket was the passed in object
Socket sock = (Socket)ar.AsyncState; // Check if we got any data
try
{
int nBytesRec = sock.EndReceive( ar );
if( nBytesRec > 0 )
{
// Wrote the data to the List
string sRecieved = Encoding.ASCII.GetString( m_byBuff,
0, nBytesRec ); // WARNING : The following line is NOT thread safe. Invoke is
// m_lbRecievedData.Items.Add( sRecieved );
Invoke( m_AddMessage, new string [] { sRecieved } ); // If the connection is still usable restablish the callback
SetupRecieveCallback( sock );
}
else
{
// If no data was recieved then the connection is probably dead
Console.WriteLine( "Client {0}, disconnected",
sock.RemoteEndPoint );
sock.Shutdown( SocketShutdown.Both );
sock.Close();
}
}
catch( Exception ex )
{
MessageBox.Show( this, ex.Message, "Unusual error druing Recieve!" );
}
}
此方法还有一个好处是.NET底层的Socket类库在你用异步时可以聪明到最大限度地利用通讯硬件上的线程和资源,对节省CPU资源很有帮助.