每个套接字地址通常只允许使用一次&”.网络远程处理

本文关键字:一次 网络 处理 程处理 地址 套接字 许使用 | 更新日期: 2023-09-27 17:58:14

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

当我试图在我的监视器和服务器之间建立连接时,我得到了错误。我的服务器在端口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

有什么想法吗?

谢谢。

每个套接字地址通常只允许使用一次&”.网络远程处理

您收到错误的原因是创建了一个新的服务器实例,该实例开始侦听端口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);