2011-05-06 4 views
3

TcpClient가 인터넷을 통해 주 응용 프로그램에 연결하는 클라이언트 응용 프로그램의 인스턴스가 여러 개 있습니다. (둘 다 나에 의하여 암호로했다).중단 후 TCPClient를 다시 연결

TcpClient.Connect (IP, 포트)

내가 지금이 분리 이벤트의 다양한 유형 처리하는 경우 :

  1. 홈페이지 응용 프로그램 (서버) 또는 클라이언트 그래서 연결이처럼 만들어 앱 컴퓨터가 인터넷 연결을 끊습니다.

    연결의 이력서에
    • , 통신이 손실 것 같다,하지만 난 다시 연결을 시도 할 때, 나는 메시지가 :
    • 그래서 내가 닫아야합니다 "A 연결 요청이 이미 연결 소켓되었다" 클라이언트 응용 프로그램을 다시 시작하십시오.
  2. 메인 앱 (서버)이 닫히고 다시 시작됩니다.

    • 주 앱을 다시 시작한 다음 클라이언트 앱을 다시 연결하면 위와 동일한 오류가 발생합니다.

그래서 무엇을해야합니까? 이러한 중단이 발생할 때마다 클라이언트 응용 프로그램에서 새 TcpClient를 인스턴스화해야합니까? 나는 그것을 시도하지 않았기 때문에 그것이 가난한 해결책인지는 모르겠다.

+1

내 솔루션 살펴보기 : https://github.com/Mellen/Networking-Samples –

+3

아니요, 클라이언트 예제를 보지 마십시오. 스레드를 백그라운드에서 사용하지 마십시오. 비동기 메서드를 사용하십시오. – jgauffin

답변

6

이러한 중단이 발생할 때마다 클라이언트 응용 프로그램에서 새 TcpClient를 인스턴스화해야합니까?

예. TcpClient가 나타내는 연결이 끊어지면 더 이상 통신하기 위해 해당 개체를 사용할 수 없으며 다시 연결할 수 없습니다. 새 TcpClient 개체를 만듭니다.

문제는 NAT 게이트웨이가 TCP 연결을 시간 초과하여 서버 < -> 클라이언트간에 연결할 수 없으므로 모든 클라이언트가 연결에서 읽은 경우이 경우를 발견하지 못합니다. 그것은 연결이 아직 열려 있다고 생각합니다.

+0

감사합니다. 5 초마다 클라이언트 응용 프로그램에서 연결을 확인할 계획입니다. 확실한 응답을 제공해야하는 표준 메시지를 보내거나, 이미 사용할 수있는 TcpClient 객체에 어떤 메소드가 있습니까? 그러면 연결이 끊어졌습니다. 그러면 새로운 TcpClient를 인스턴스화하고 다시 연결할 수 있습니다. 그게 합리적이라고 생각하니? – bretddog

+0

예. 연결에 어떤 종류의 하트 비트를 보내고 응답을 기다린다 (타임 아웃과 함께). – nos

1

나는 일반적으로 이전에 스레드를 사용하여이 문제를 해결했습니다. 나는 루프를 통해 관리 작업을하고, 연결을 확인하고, 최신 사용자 입력을 확인하고, 서버 종료 요청을 확인하는 제어 스레드를 만들었습니다.이 작업이 완료되면 30 초 동안 잠을 자다가 다시 시도했습니다.

그런 다음 별도의 소켓 스레드가 생성되어 네트워크 소켓을 유지 관리했습니다. 연결이 시작되면 연결을 열어 반복적으로 반복하여 연결되어있는 사람의 메시지를 찾습니다. 메시지를 발견하면 처리하고 제어 스레드가 소비하기 위해 휘발성 객체 콜렉션에 저장합니다. 연결에 문제가 발생하면 자동으로 해결하려고 시도하지만 불가능한 경우 '죽은'상태가됩니다. 제어 스레드는 다음 반복시 죽은 소켓 스레드를 정리하고 필요에 따라 새 스레드를 만듭니다.

디버깅은 악몽 이었지만 버그가 해결되면 놀랍도록 안정되었습니다. 하나의 인스턴스에서 수십만 개의 연결과 수백 개의 동시 연결로 1 년 이상 성공적으로 실행되었으므로 재시작이나 유지 관리가 필요하지 않습니다.

+0

환호, 나는이 예에 대해 연구해야 할 것입니다. 나는 또한 그러한 수준의 안정성을 요구한다. 현재 스트림에서 AsyncCallback을 사용하므로 독자적으로 별도의 스레드가됩니다. 지속적인 검사를 위해 타이머를 사용하여 이벤트를 발생시킵니다. 이벤트는 자체 스레드에서 작동합니다. 그러나보다 포괄적 인 수표를 통합해야합니다. – bretddog

+0

타이머 스레드와 콜백 스레드는 훌륭하지만 모든 스레드를 작성할 때 더 잘 제어 할 수 있습니다. 이것의 또 다른 장점은 클라이언트와 서버가 가지고있는 라이브러리에서 패키지를 패키징 할 수있어서 클라이언트가 디버깅 목적으로 자체 서버를 실행할 수 있다는 것입니다. 게다가 클라이언트와 서버가 모두 사용할 수있는 일반적인 루틴이 있다고 확신합니다. –

관련 문제