通常只允许使用每个套接字地址一次......" .net远程处理

时间:2014-04-14 21:33:59

标签: c# .net sockets remoting

我基本上制作了一个客户端/服务器应用程序和另一个从服务器(监视器)获取信息的软件。我这样做并且必须使用.NET远程处理。

当我尝试在monintor和服务器之间建立连接时,我收到错误。我的服务器侦听端口5000上的连接,我的远程处理侦听端口5002。

这就是我在服务器中收听的方式:

 class Server : MarshalByRefObject, ServerInterface
 {
    public Server()
    {
       Listener();
    }

    private void Listener()
    {
        TcpListener listener = new TcpListener(IPAddress.Any, 5000);
        listener.Start();

        while (offline == false)
        {
            TcpClient client = listener.AcceptTcpClient();
        }
    }
 }

这是我的远程对象是用一个定义的接口构造的,它有一个返回列表的方法。

此代码位于控制台应用程序的主要部分,同时还创建了一个新的服务器实例。

        TcpChannel channel = new TcpChannel(5002);
        ChannelServices.RegisterChannel(channel, false);
        RemotingConfiguration.RegisterWellKnownServiceType(typeof(Server),
        "Server", WellKnownObjectMode.SingleCall);

        Server s = new Server();

这是我在我的监视器上构建tcpchannel / remoting的方法

  IServer obj = (ServerInterface)Activator.GetObject(typeof(ServerInterface), "tcp://localhost:5002/Server");

但是当我尝试拨打其中一种方法时,我会在标题中收到错误,

  List<string> cons = obj.getIPs(); //error line

任何想法的人?

谢谢。

1 个答案:

答案 0 :(得分:1)

您收到错误是因为创建了一个新的服务器实例,它开始侦听端口5000(Server s = new Server();),然后当创建一个新的远程实例时,它的默认构造函数会运行并尝试执行相同。 你需要服务器在端口5000上单独收听吗?如果这样做,您可以创建另一个为非远程实例运行的构造函数:

class Server : MarshalByRefObject, ServerInterface
{
    public Server()
    {
    }

    public Server(bool local)
    {
       Listener();
    }

    private void Listener()
    {
        TcpListener listener = new TcpListener(IPAddress.Any, 5000);
        listener.Start();

        while (offline == false)
        {
            TcpClient client = listener.AcceptTcpClient();
        }
    }
 }

...

TcpChannel channel = new TcpChannel(5002);
ChannelServices.RegisterChannel(channel, false);
RemotingConfiguration.RegisterWellKnownServiceType(typeof(Server),
        "Server", WellKnownObjectMode.SingleCall);

Server s = new Server(true);