2013-06-05 2 views
2

일부 소프트웨어에는 2 개의 PC가 있습니다. 이제 다른 PC에서 메소드를 실행하는 데 하나의 PC가 필요합니다. 이제는 높고 낮음을 검색했지만이를 수행하는 방법을 찾을 수 없습니다. 나는 인자, 메소드 이름, 리턴 객체를 직렬화하는 작은 인터페이스를 작성하고이를 소켓을 통해 전송 한 후 리플렉션을 사용하여 메소드를 실행 취소하고 소켓을 통해 결과 객체를 리턴한다. 하지만 다른 사람의 의견을 듣기를 원하기 전에 다른 방법보다 훨씬 쉬운 방법을 쓰고 싶습니다. 동적으로 소켓을 통해 메소드를 호출합니다.

  • 반환에게
  • 직렬화 다시 객체 어떤

내가하지 않은 아무것도 발생한 경우 예외 객체를 (그들은 모두 수신 개체로 전송됩니다) 여러 인수 보내기 객체를 직렬화하고 소켓을 통해 전송할 때 모든 표준 객체가 직렬화 가능합니까? List<> array[] float dateTime처럼?

나는이 ok를 설명하기를 희망한다. 그렇지 않다면 나는 미안해하고 명확하지 않은 것을 묻는다.

답변

1

예를 들어 인터넷을 검색하고 일부 코드를 붙여 넣었습니다. somone이 필요하면 여기에 게시 할 예정입니다. 이 더러운 코드입니다하지만 InvokeMethod는 클라이언트 측에, 작동하고, startIBC 각 서버에서 시작해야 할 것입니다 :

[ServiceContract] 
    public interface IBlissRequest 
    { 
     [OperationContract] 
     object SystemRequest(string InstanceName, string MethodName, params object[] Parameters); 
    } 

    public class BlissRequest : IBlissRequest 
    { 
     public object SystemRequest(string InstanceName, string MethodName, params object[] Parameters) 
     { 
      return System21.BlissProcessingUnit.BPU.RequestFromIBC(InstanceName, MethodName, Parameters); 
     } 
    } 

public static object InvokeMethod(string targetIpAddress, string InstanceName, string MethodName, params object[] Parameters) 
     { 
      try 
      { 
       var ep = "net.tcp://" + targetIpAddress + ":9985/IBC"; 

       NetTcpBinding binding = new NetTcpBinding(SecurityMode.None); 

       ChannelFactory<IBlissRequest> pipeFactory = new ChannelFactory<IBlissRequest>(binding, new EndpointAddress(ep)); 

       IBlissRequest pipeProxy = pipeFactory.CreateChannel(); 

       return pipeProxy.SystemRequest(InstanceName, MethodName, Parameters); 
      } 
      catch 
      { 
       BPUConsole.WriteLine(BPUConsole.WriteSource.IBC, "Unable to execute method: '" + MethodName +"' on Instance: '"+InstanceName+"' becouse IBC is unable to connect to: "+ targetIpAddress); 
       throw new Exception("Unable to connect to: " + targetIpAddress); 
      } 
     } 

     public static void StartIBC() 
     { 
      var uri = "net.tcp://" + BlissProcessingUnit.BPUInformation.LocalIpAddresses[0] + ":9985"; 
      Console.WriteLine("Opening connection on: " + uri); 

      ServiceHost host = new ServiceHost(typeof(BlissRequest), new Uri[] { new Uri(uri) }); 

      NetTcpBinding binding = new NetTcpBinding(SecurityMode.None); 

      host.AddServiceEndpoint(typeof(IBlissRequest), binding, "IBC"); 

      host.Open(); 

      Console.WriteLine("Service is available. " + "Press <ENTER> to exit."); 

     } 
3

서비스 WCF를 만들고 TCP를 통해 작동하도록 WCF를 설정하십시오.

이것은 당신에게 (/ 직렬화 직렬화, 열기/닫기 소켓)

좋은 사례가 대부분 일 '상자 밖으로'을 줄 것이다 here, here하고 소리를 묘사하는 어떤 here

+0

나는 이것에 대한 예를 검색 한하지만 난 아무것도 찾을 canot 전 내가 필요한 것은 다른 comuters에서 메소드를 실행할 수있는 네트워크에 여러 명의 comuters가 있지만 네트워크를 통해 쉽게 읽을 수있는 예제는 찾지 못했다는 것입니다. – Jeffnl

0

좋은 읽기 원격 프로 시저 호출 (RPC)과 유사합니다. RPC를 사용하면 클라이언트가 로컬 객체 인 것처럼 상호 작용할 수있는 서버에서 단일 객체를 작성할 수 있습니다 (소켓 처리 필요성을 완전히 피할 수 있음). 또는 각 클라이언트는 고유 한 서버 오브젝트를 작성하여 상호 작용할 수도 있습니다.

RPC의 전체 구현은 네트워크 라이브러리 networkcomms.net에서 찾을 수 있습니다. 다음 코드 스 니펫은 사용 가능한 RPC 예제에서 가져온 것으로 간단한 수학 계산을 수행 할 수있는 MathClass 유형의 객체를 사용합니다. 클라이언트 측에

//Register a single object server side called "Calculator" 
RemoteProcedureCalls.Server.RegisterInstanceForPublicRemoteCall<MathClass, IMath>(new MathClass(), "Calculator"); 

:

//Get a reference to the remote object named "Calculator" 
IMath calc = RemoteProcedureCalls.Client.CreateProxyToPublicNamedInstance<IMath>(connection, "Calculator", out instanceId); 
//We can now use the calculator object as if it were local 
//The following WriteLine outputs '12' where the calculation was performed on the server 
Console.WriteLine(calc.Multiply(4, 3)); 

면책 조항 :

목적은 서버 측 존재 나는이 라이브러리에 대한 개발자 받았음을 추가해야합니다.

관련 문제