최근 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를 들어
을 내 서버 응용 프로그램이 있음을 보유 할 새 스레드/객체를 생성하지 고객?
클라이언트가 연결되고 네트워크 케이블이 클라이언트 측에서 제거되어 다시 연결되면 클라이언트는 서버에 다시 연결하며이 시나리오에서는 서버에 새 연결로 간주됩니다 다시 발생하고, 내 서버 프로그램이 충돌합니까?
따라서 서버에 연결된 각 클라이언트를 추적하고 해당 상태를 추적하여 해당 서버에서 닫기/삭제를 호출 할 수 있습니까?
시나리오 2에 대한 나의 테스트에서, 서버 프로그램에는 이상이 발견되지 않았지만, 누군가 나를 위해이를 명확히하는 데 도움이되기를 바랍니다. 고맙습니다.
신속한 답장을 보내 주셔서 감사합니다. 회신에 따라 결론은 다음과 같습니다. 1. 연결된 각 클라이언트에 대해 추가 메모리/리소스가 생성되지 않습니다. 2. "거기에서 EndXXX 메서드 호출이 예외를 throw하거나 소켓에서 읽는 0 바이트를 반환해야합니다."와 같은 상황을 처리 할 정리 코드가 있지만 폐기/닫기를 호출 할 필요가 없습니다. (서버 프로그램에서)이 오류를 일으키는 클라이언트에서. 내가 틀렸다고 정정하십시오. – Ytan
1. 스레드를 만들 필요가 없습니다. OS별로 처리됩니다. 2. 아마 가까이 다가 가거나 처분 할 필요가 없을 것이며, 그렇게한다면 아마 ObjectAlreadyDisposed 예외가 발생할 것입니다. 그러나 당신은 그렇게 할 수 있으며, 대부분은 어쨌든 100 % 확신 할 수 있습니다. 이 경우에는 거의 예상되므로 ObjectAlreadyDisposedException을 catch합니다. – uriDium
알았어, 고마워,이 사건을 지금 당장 생각해. – Ytan