无法从传输连接中读取数据:连接已关闭。

4
例外情况是远程异常-身份验证失败。详细消息说:“无法从传输连接读取数据:连接已关闭。”
我正在尝试创建两个简单的服务器,它们可以作为远程对象在C#中通信。ServerInfo只是我创建的一个类,它保存IP和端口,并可以返回地址。它很好用,因为我以前用过它,并且已经调试过了。另外,服务器启动得很好,没有抛出任何异常,并且通道也没有问题地注册。我使用Forms来做界面,并调用服务器上的一些方法,但是在调试时从FormsApplication向服务器传递参数时没有发现任何问题。在这一章节中,所有的事情都看起来很好。
public ChordServerProgram()
        {
            RemotingServices.Marshal(this, "PADIBook");
            nodeInt = 0;
        }

        public void startServer()
        {
            try
            {
                serverChannel = new TcpChannel(serverInfo.Port);
                ChannelServices.RegisterChannel(serverChannel, true);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
        }

我运行了两个该程序的实例。然后在应用程序的一个实例上调用startNode方法。端口和地址都没问题。你可以看到,我使用本地主机的IP地址,因为这个服务器只是为测试目的而存在。

public void startNode(String portStr)
            {
                IPAddress address = IPAddress.Parse("127.0.0.1");
                Int32 port = Int32.Parse(portStr);
                serverInfo = new ServerInfo(address, port);

                startServer();

                //node = new ChordNode(serverInfo,this);

            }

然后,在另一个实例中,我再次通过接口调用startNode方法,并提供一个种子服务器以获取信息。这就是出错的地方。当它在刚刚获取的seedServer代理上调用方法时,会抛出RemotingException异常,原因是身份验证失败。(我想要获取的参数是节点,我只是使用整数来确保ChordNode类与此错误无关。)

        public void startNode(String portStr, String seedStr)
        {
            IPAddress address = IPAddress.Parse("127.0.0.1");
            Int32 port = Int32.Parse(portStr);
            serverInfo = new ServerInfo(address, port);

            IPAddress addressSeed = IPAddress.Parse("127.0.0.1");
            Int32 portSeed = Int32.Parse(seedStr);
            ServerInfo seedInfo = new ServerInfo(addressSeed, portSeed);            

            startServer();

            ChordServerProgram seedServer = (ChordServerProgram)Activator.GetObject(typeof(ChordServerProgram), seedInfo.GetFullAddress());

//            node = new ChordNode(serverInfo,this);
            int seedNode = seedServer.nodeInt;
//            node.chordJoin(seedNode.self);

        }
2个回答

0

您在 startServer() 中指定了安全性是 Remoting 服务器上必须的:

ChannelServices.RegisterChannel(serverChannel, true); 

然而,“客户端”端没有指定安全性,因此出现了授权错误。除非服务器安全设置为“false”,否则您需要在两端都指定tcp通道安全性。在使用Activator.GetObject之前,在第二个startNode方法中,您需要执行以下操作,请注意TcpChannel上没有指定端口,不像服务器端:

TcpChannel ClientChan = new TcpChannel();            
ChannelServices.RegisterChannel(ClientChan, true); 

此外,除非您在某些未提供给我们的代码中进行此操作,否则似乎也没有在服务器端注册已知的服务类型,尽管您说它在调试器中运行正常,所以在这种情况下可能不是必需的。请参见 MSDN on RegisterWellKnownServiceType

0

尝试将ensureSecurity设置为false,它应该开始工作。
ChannelServices.RegisterChannel(serverChannel, false);


是的,但如果我们想启用安全性呢? - Gareth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接