메신저 나 자신을 위해 이것을 알아내는 것이 어려워서 여기에서 묻습니다. 원격 컴퓨터에 클라이언트를 설치하는 응용 프로그램이 있고 클라이언트가 소켓을 통해 다시보고합니다.홀드 타이머 유형 스레드
홀드 타이머를 만들려고합니다. 즉, 클라이언트가 1 분마다 서버에 hello 메시지를 보냅니다. 서버가 보류 타이머 내의 클라이언트로부터 hello 패킷을받지 못하면 클라이언트가 제거됩니다. 나는 하나의 클라이언트로 그것을 잘 할 수있다. ... 그러나 여러개를 위해 나는 그것을 이해할 수 없다. 서버에 연결된 새로운 클라이언트를 foreach 스레드로 생성하려고합니다. 그리고 그 스레드 내부에서 기다려 타이머를 시작 .. 어떻게 스레드와 클라이언트를 구별합니까 어떻게 안녕하세요 패킷이 클라이언트에서받은 경우 보류 타이머를 재설정합니까.
모든 hello 패킷에 대해 새 스레드를 만들고 이전 패킷을 중지 할 것을 생각했습니다. 하지만 내가 어떻게 cpu 집중이 될지 모르겠다
만약 당신이 내 질문을 이해하지 못한다면, 그렇게 말하면 좋지 않다는 것을 설명하려고 애 쓰지 말아라.
어떤 솔루션이 더 좋습니까? 해결책 A) 새 스레드를 시작하고 hello 패킷이 도착할 때마다 이전 스레드를 중지 하시겠습니까? (매 40 초마다) - 100 클라이언트에서
솔루션 B) 훨씬 더 확장 가능한 솔루션을 여기에 삽입하십시오.
솔루션 C) 동적으로 만드는 스레드 내에서 타이머에 액세스 할 수 있습니까? - 동적으로 생성 된 모든 스레드에 고유 한 스레드 이름이 있습니다.
그리고 스레드와 동일한 이름의 클라이언트로부터 hello 패킷을받을 때 리셋합니까?
해결책 D) 타이머를 사전에 저장하십시오. 공개 사전 timersDict = new Dictionary(); 및 루프 안녕하세요 패킷 수신 대기 타이머에 대한 참조에있는 참조를 찾으십시오.? 원격 호스트 응용 프로그램까지
foreach(var item in timersDict)
{
if(item.Key == stripip(client.RemoteEndPoint.ToString()))
TimerReset(item.Value);
}
솔루션
설정, 서버에 매 3 초에 "hello"라는 메시지를 보낼 수 있습니다. 경과 이벤트가 1 초마다 발생하는 서버에 타이머를 만듭니다. 설정은 원격 컴퓨터가 죽은 것으로 간주하기까지 얼마나 걸릴지를 결정하는 int를 보유하는 정적 값을 9 초로 선택했습니다.
서버가 hello 메시지를 수신하면 클라이언트의 IP 주소와 함께 목록에 타임 스탬프를 저장합니다. timer_elapsed 이벤트
void holdtimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
try
{
if (server.Clients.GetAllItems().Count != 0)
{
foreach (IScsServerClient _client in server.Clients.GetAllItems())
{
string ipaddr = stripip(_client.RemoteEndPoint.ToString());
bool containsentry = _clientlist.Any(item => item.ipadress == ipaddr);
if (containsentry)
{
foreach (Scsserverclient entry in _clientlist.Where(entry => entry.ipadress == ipaddr))
{
if ((DateTime.Now - TimeSpan.FromSeconds(Settings.Default.Hold)) > entry.lasthello &&
entry.isConnect != "Disconnected")
{
entry.client.Disconnect();
}
}
}
}
}
}
catch (Exception ex)
{
}
}
에
은 기본적으로 내가 연결된 클라이언트 목록을 실행하고 마지막으로받은 헬로 메시지가 구초보다 오래된 경우에, 나는 분리에 클라이언트로 고려한다.
이미 가지고있는 코드를 게시 할 수 있습니까? 나는 당신이 해결책을 설계하는 것을 막을 구체적인 문제를 발견 할 수 없다. 아마도 당신이 잘못하고있는 것을보고 그것을 지적하는 것이 더 쉬울 수도 있습니다. – usr
잘 그게, 내가 해결책을 주위에 내 머리를 감쌀 수 없다. 나는 작동하지 않는 코드를 가지고 있지 않다. 이 최선의 방법을 알아낼 수 없다. – VisualBean
서버를 ASP.NET 응용 프로그램으로 만들고 클라이언트가 HTTP를 통해 서버를 호출하도록 할 수 있습니까? 그렇게하면 인프라가 연결을 관리하고 이러한 모든 우려가 사라집니다. – usr