using System;
using System.Collections;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using System.Runtime.Remoting;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Console.Write("press any key plus enter to create server: ");
if (Console.ReadLine().Length > 0)
{
var serverProv = new BinaryServerFormatterSinkProvider();
serverProv.TypeFilterLevel = System.Runtime.Serialization.Formatters.TypeFilterLevel.Full;
IDictionary props = new Hashtable();
props["port"] = 17017;
props["name"] = "tcp server";
var channel = new TcpChannel(props, null, serverProv);
ChannelServices.RegisterChannel(channel, false);
RemotingConfiguration.RegisterWellKnownServiceType(typeof(Server), "server",
WellKnownObjectMode.Singleton);
Console.WriteLine("Server created");
}
else
{
ChannelServices.RegisterChannel(new TcpChannel(), false);
Server server = (Server)Activator.GetObject(typeof(Server), "tcp://localhost:17017/server");
Client client = new Client();
client.Connect(server);
}
Console.ReadLine();
}
}
class Server : MarshalByRefObject
{
//private List<Client> cilents = new List<Client>();
public event EventHandler ClientedAdded;
public void AddClient(Client client)
{
if (ClientedAdded != null)
{
foreach (EventHandler handler in ClientedAdded.GetInvocationList())
{
handler.BeginInvoke(this, EventArgs.Empty, null, null);
}
}
}
}
class Client : MarshalByRefObject
{
public void Connect(Server server)
{
server.ClientedAdded += server_ClientedAdded;
server.AddClient(this);
}
void server_ClientedAdded(object sender, EventArgs e)
{
Console.WriteLine("server_ClientedAdded");
}
}
}
首先,运行exe并创建一个服务器。然后运行exe并直接按 Enter 创建客户端。
handler.BeginInvoke(this, EventArgs.Empty, null, null);
会抛出异常。
此远程处理代理没有通道接收器,这意味着服务器 没有正在收听的注册服务器频道,或者这个 应用程序没有合适的客户端通道与服务器通信。
那么如何解决呢?
我在http://www.codeguru.com/forum/showthread.php?t=420124上发现了类似的问题。作者提供了一个解决方案,但对我来说太简短了。
答案 0 :(得分:0)
我不知道可能是什么问题,但是2天前我不得不编写一个小应用程序代码 使用相同的技术(TCP频道)
这是一段代码(它运行良好,经过多次测试):
服务器:
TcpChannel chan = new TcpChannel(8086);
ChannelServices.RegisterChannel(chan);
RemotingConfiguration.RegisterWellKnownServiceType
(Type.GetType("ClockBiometric.RequestServer"),
"checkFingerprintTemplate", WellKnownObjectMode.Singleton);
客户端:
RequestServer obj =
(RequestServer)Activator.GetObject(typeof(ClockBiometric.RequestServer)
,"tcp://localhost:8086/checkFingerprintTemplate");
if (obj == null)
// couldn't reach server
else obj.checkFingerprintTemplate(1300, "abcd"); // just call some function
RequestServer类是:
public class RequestServer : MarshalByRefObject
{
public RequestServer()
{
}
public void checkFingerprintTemplate(int iIndexNum, String sTemplate)
{
doSomeStuff();
}
}
希望这有帮助!
答案 1 :(得分:0)
我解决了!
尝试使用
handler(this, EventArgs.Empty)
而不是
handler.BeginInvoke(this, EventArgs.Empty, null, null);
我有一个例外,说无法调用私有方法。
然后问题很明显,我将server_ClientedAdded公之于众。
现在代码可以使用了!