2017-05-20 9 views
0

원시 응용 프로그램과 웹 응용 프로그램을 통신해야합니다.Signalr 브라우저에서 동일한 컴퓨터의 .net 클라이언트로 메시지 보내기

메시지/명령을 보내려면 signalr을 사용하는 것이 좋습니다.

파이프 라인은 다음과 같습니다

  • 사용자는 작업을하기 위해 클릭합니다.
  • Javascript (signalr 포함)는 하늘에있는 서버로 메시지를 보냅니다.
  • 서버가 특정 클라이언트에 메시지를 다시 보냅니다. 동일한 시스템에 설치된 클라이언트 여야합니다.
  • 결과가 완료되면 NET은 결과로 반전을 보냅니다.

문제는, 신호기 서버의 동일한 기계에서 클라이언트를 어떻게 찾을 수 있습니까?

우리의 시스템의 조직은 다음과 같습니다

  • 센터/체육관이 있습니다.
  • 모든 센터에는 로그인 할 수있는 직원이 있습니다.

일부 파일 구성을 사용하여 같은 센터에서 클라이언트를 식별 할 수 있습니다. 예를 들어 키 센터를 저장합니다. 그러나 한 대의 센터에 여러 컴퓨터에 하나 이상의 .NET 클라이언트가 설치되어있을 수 있습니다.

우리는 컴퓨터의 개인 IP를 사용하여 signalr 서버에서 키를 만드는 것으로 생각합니다.

var ips = []; 

    var RTCPeerConnection = window.RTCPeerConnection || 
     window.webkitRTCPeerConnection || window.mozRTCPeerConnection; 

    var pc = new RTCPeerConnection({ 
     // Don't specify any stun/turn servers, otherwise you will 
     // also find your public IP addresses. 
     iceServers: [] 
    }); 
    // Add a media line, this is needed to activate candidate gathering. 
    pc.createDataChannel(''); 

    // onicecandidate is triggered whenever a candidate has been found. 
    pc.onicecandidate = function (e) { 
     if (!e.candidate) { // Candidate gathering completed. 
      pc.close(); 
      console.log(ips); 
      return; 
     } 
     var ip = /^candidate:.+ (\S+) \d+ typ/.exec(e.candidate.candidate)[1]; 

     ips.push(ip); 
    }; 
    pc.createOffer(function (sdp) { 
     pc.setLocalDescription(sdp); 
    }, function onerror() { }); 

이 데이터는 .NET 클라이언트에서 문제없이 얻을 수 있습니다. 하지만 javascript에서는 이전 코드가 정기적으로 작동합니다. 일부 PC에서는 ipv4 만 반환합니다. 그리고 모질라에서는 작동하지 않습니다.

두 클라이언트를 어떻게 식별 할 수 있습니까? 목표에 도달하는 또 다른 방법을 알고 있습니까?

감사합니다.

+0

어쩌면 또 다른 옵션이 될 것이다 사용 [URI 방식 (https://blogs.msdn.microsoft.com/noahc/2006/10/19/register-a-custom-url- 프로토콜 처리기 /) 우리의 애플 리케이션을 시작하고, 그 결과는 signalr에 의해 보내십시오. –

답변

0

마지막으로, 우리는 좋은 해결책으로 필터링 된 IP 주소를 찾지 못했습니다.

우리는 다음과 같이했다 :

우리는 우리의 응용 프로그램을 실행하는 URI 스키마를 사용했다.

 

    Public Class RegistrarURI 


     Const URI_SCHEME As String = "xxx" 
     Const URI_KEY As String = "URL:xxx" 
     Private Shared APP_PATH As String = Location.AssemblyDirectory() ' "C:\Program Files (x86)\xxx.exe" 

     Public Shared Sub RegisterUriScheme() 

      Using hkcrClass As RegistryKey = Registry.ClassesRoot.CreateSubKey(URI_SCHEME) 
       hkcrClass.SetValue(Nothing, URI_KEY) 
       hkcrClass.SetValue("URL Protocol", [String].Empty, RegistryValueKind.[String]) 

       Using defaultIcon As RegistryKey = hkcrClass.CreateSubKey("DefaultIcon") 
        Dim iconValue As String = [String].Format("""{0}"",0", APP_PATH) 
        defaultIcon.SetValue(Nothing, iconValue) 
       End Using 

       Using shell As RegistryKey = hkcrClass.CreateSubKey("shell") 
        Using open As RegistryKey = shell.CreateSubKey("open") 
         Using command As RegistryKey = open.CreateSubKey("command") 
          Dim cmdValue As String = [String].Format("""{0}"" ""%1""", APP_PATH) 
          command.SetValue(Nothing, cmdValue) 
         End Using 
        End Using 
       End Using 
      End Using 
     End Sub 

    End Class 

URI Schema windows는 푸른 웹 애플리케이션에서 우리는 SignalR 서버를 실행합니다. 이 서버는 .NET 애플리케이션에서 Chrome으로 데이터를 전송합니다.

웹로드시 signalR 서버에 연결합니다. de uri를 만들기 위해 connectionId를 Javascript 클라이언트에서 .NET 클라이언트로 보냅니다.

그런 다음 원시 프로세스가 완료되면. .NET 클라이언트는이 정보를 signalR 서버로 보내고이 서버는 connectionId를 사용하여 javacript 클라이언트로 데이터를 미러링합니다.

기본 앱의 인스턴스가 실행되지 않도록하기 위해 IPC 채널을 사용하여 하나의 인스턴스를 이전 인스턴스로 보내고 새 인스턴스를 종료합니다.소스에

링크 Blog source