我有2个用一些软件,现在我需要一台电脑在另一台电脑上执行一个方法,现在我搜索了高低,但找不到任何关于如何做到这一点。我可以通过编写自己的小接口来执行此操作,该接口序列化参数,方法名称和返回对象,然后通过套接字发送,然后反序列化,使用反射执行该方法,并在套接字上返回结果对象。但在我开始写另类方式之前,我希望得到别人的意见。
我没有做任何事情来序列化对象并通过套接字发送它们,但是所有标准对象都是可序列化的吗?像List<> array[] float dateTime
?
我希望已经解释好了,如果不是我很抱歉并且询问什么不清楚。
答案 0 :(得分:3)
答案 1 :(得分: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.");
}
答案 2 :(得分:0)
您所描述的内容听起来像远程过程调用(RPC)。 RPC允许您在服务器上创建单个对象,客户端可以像对象一样进行交互(因此完全避免需要处理套接字)。或者,每个客户端也可以创建自己唯一的服务器对象来与之交互。
可以在网络库networkcomms.net中找到RPC的完整实现。以下代码片段来自可用的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));
免责声明:我必须补充说我是这个图书馆的开发人员。