我刚刚开始使用Socket开发服务器 - 多个客户端应用程序。
服务器无需跟踪连接的客户端;如果有客户端请求连接,则服务器接受它。如果有来自任何客户端的请求(获取某些数据),服务器将响应该客户端。
/// <summary>
/// Callback when server accepts a new incoming connection.
/// </summary>
/// <param name="result">Incoming connection result object.</param>
private void AcceptedCallback(IAsyncResult result)
{
try
{
Socket clientSocket = _socket.EndAccept(result); // Asynchronously accepts an incoming connection attempt
if (clientSocket.Connected) // Check if the client is in 'Connected' state
{
StateObject state = new StateObject();
state.clientSocket = clientSocket;
clientSocket.BeginReceive(state.buffer, 0, StateObject.BufferSize, SocketFlags.None, // Start listening to client request
ReceiveCallback, state);
}
else
{
clientSocket.Close(); // Terminate that client's connection
Log.writeLog("TCPServer(AcceptedCallback)"
, "Client's status is not connected.");
}
}
catch (Exception ex)
{
Log.writeLog("TCPServer(AcceptedCallback)"
, ex.Message);
clientSocket.Close();
}
finally
{
Accept(); // Start to accept new connection request
}
}
我有3个问题:
对于我为新连接的客户端创建的每个 BeginReceive ,我的服务器应用程序是否创建了一个新的线程/对象来保存该客户端?
如果在连接客户端后,在客户端拔出网线并重新插入,客户端将再次连接到服务器,这被认为是服务器上的新连接,如果这样场景一次又一次地发生,我的服务器程序会崩溃吗?
因此,我是否需要跟踪连接到服务器的每个客户端,并找到跟踪其状态的方法,以便我可以对它们调用Close / Dispose?
到目前为止,在我对方案2的测试中,我的服务器程序中没有检测到异常,但我希望有人会帮我澄清一下。谢谢。
答案 0 :(得分:0)