我想知道我在正在构建的应用程序中是否正确。应用程序必须接收传入的TCP连接,并且每次调用使用一个线程,因此服务器可以并行回答多个呼叫。
我正在做的是在我收到一个接受的客户后立即再次致电BeginAcceptTcpClient
。我想当命中ConnectionAccepted
方法时,它实际上是在一个单独的线程中。
public class ServerExample:IDisposable
{
TcpListener _listener;
public ServerExample()
{
_listener = new TcpListener(IPAddress.Any, 10034);
_listener.Start();
_listener.BeginAcceptTcpClient(ConnectionAccepted,null);
}
private void ConnectionAccepted(IAsyncResult ia)
{
_listener.BeginAcceptTcpClient(ConnectionAccepted, null);
try
{
TcpClient client = _listener.EndAcceptTcpClient(ia);
// work with your client
// when this method ends, the poolthread is returned
// to the pool.
}
catch (Exception ex)
{
// handle or rethrow the exception
}
}
public void Dispose()
{
_listener.Stop();
}
}
我做对了吗?
干杯。
答案 0 :(得分:1)
嗯,你可以像这样使方法静态:
private static void ConnectionAccepted(IAsyncResult ia)
{
var listener = (TcpListener)result.AsyncState;
TcpClient client = listener.EndAcceptTcpClient();
listener.BeginAcceptTcpClient(ConnectionAccepted, listener);
// .....
}
也许你不希望它是静态的,但是这样你可以将方法移动到你喜欢的地方,并且不依赖于这个类中的成员变量而是另一个。 I.E:解耦服务器tcp逻辑和服务器客户端逻辑。