C#visual studio TCP频道已经注册

时间:2013-02-26 12:22:02

标签: c# .net-remoting

我正在使用TCP通道连接创建一个包含2个不同控制台应用程序的聊天应用程序,但是当我运行客户端控制台或服务器控制台时,我得到“TCP已经注册”

我有4个代码项目。

  1. 接口
  2. 的RemoteObject
  3. 客户端
  4. 服务器
  5. 这是界面代码:

    using System;
    
    public interface IRemoteObject
    {
        void GetData(string myString);        
    
    }
    

    这是RemoteObject代码:

    using System;
    
    public class RemoteObject : MarshalByRefObject,IRemoteObject
    {
        //Server Method
        public RemoteObject()
        {
            Console.WriteLine("Server text");                 
        }
    
        //Client Method
        public void GetData(string myString)
        {
            Console.WriteLine(myString);
        }
    }
    

    这是客户端代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Runtime.Remoting;
    using System.Runtime.Remoting.Channels;
    using System.Runtime.Remoting.Channels.Tcp;
    using System.Threading;
    
    namespace ClientConsole
    {
        public class Client
        {
            public static void Main()
            {
    
                ThreadStart client1 = new ThreadStart(ClientSide);
                Thread client2 = new Thread(client1);
                ThreadStart server1 = new ThreadStart(ServerSide);
                Thread server2 = new Thread(server1);
                client2.Start();
                server2.Start();           
    
            }
            public static void ClientSide()
            {
                Console.WriteLine("ClientSide....");
                TcpChannel ch2 = new TcpChannel();
                ChannelServices.RegisterChannel(ch2, true);
    
                IRemoteObject objRemoteRef = (IRemoteObject)Activator.GetObject(typeof(IRemoteObject), "tcp://127.0.0.1:2233/M");
    
                while (true)
                {
                    string x = Console.ReadLine();
                    objRemoteRef.GetData(x);
    
                }
    
            }
    
            public static void ServerSide()
            {
                Console.WriteLine("ServerSide....");
                TcpChannel ch2 = new TcpChannel(2233);
                ChannelServices.RegisterChannel(ch2, true);
    
                RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteObject), "M", WellKnownObjectMode.Singleton);
    
            }
    
        }
    
    }
    

    这是服务器代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Runtime;
    using System.Runtime.Remoting;
    using System.Runtime.Remoting.Channels;
    using System.Runtime.Remoting.Channels.Tcp;
    using System.Threading;
    
    
    namespace ServerConsole
    {
        public class Server
        {
            public static void Main()
            {
                ThreadStart server1 = new ThreadStart(ServerSide);
                Thread server2 = new Thread(server1);
                ThreadStart client1 = new ThreadStart(ClientSide);
                Thread client2 = new Thread(client1);
                server2.Start();
                client2.Start();
    
    
            }
    
            public static void ServerSide()
            {
                Console.WriteLine("ServerSide....");
                TcpChannel ch2 = new TcpChannel();
                ChannelServices.RegisterChannel(ch2, true);
    
                IRemoteObject objRemoteRef = (IRemoteObject)Activator.GetObject(typeof(IRemoteObject), "tcp://127.0.0.1:2333/M");
    
                while (true)
                {
                    string x = Console.ReadLine();
                    objRemoteRef.GetData(x);
    
                }
            }
    
            public static void ClientSide()
            {
                Console.WriteLine("ClientSide....");
                TcpChannel ch1 = new TcpChannel(2233);
                ChannelServices.RegisterChannel(ch1, true);
    
                RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteObject), "M", WellKnownObjectMode.Singleton);
    
                Console.ReadLine();
    
    
    
            }
        }
    }
    

    请帮助,我在这里很新,我不确定我的帖子是否正确,请理解。

    由于

1 个答案:

答案 0 :(得分:2)

试试这个:

客户

public class Client
{
    public static void Main(string[] args)
    {

        ThreadStart client1 = new ThreadStart(ClientSide);
        Thread client2 = new Thread(client1);
        ThreadStart server1 = new ThreadStart(ServerSide);
        Thread server2 = new Thread(server1);
        client2.Start();
        server2.Start();
    }
    public static void ClientSide()
    {
        Console.WriteLine("ClientSide....");
        TcpChannel ch2 = (TcpChannel)Helper.GetChannel(2333, true);
        ChannelServices.RegisterChannel(ch2, false);
        IRemoteObject objRemoteRef = (IRemoteObject)Activator.GetObject(
            typeof(IRemoteObject), "tcp://127.0.0.1:2233/M");
        while (true)
        {
            string x = Console.ReadLine();
            objRemoteRef.GetData(x);
        }
    }
    public static void ServerSide()
    {
        Console.WriteLine("ServerSide....");
        TcpChannel ch2 = (TcpChannel)Helper.GetChannel(0, true);
        ChannelServices.RegisterChannel(ch2, false);
        RemotingConfiguration.RegisterWellKnownServiceType(
            typeof(RemoteObject), "M", WellKnownObjectMode.Singleton);
    }
}

服务器:

public class Server
{
    public static void Main()
    {
        ThreadStart server1 = new ThreadStart(ServerSide);
        Thread server2 = new Thread(server1);
        ThreadStart client1 = new ThreadStart(ClientSide);
        Thread client2 = new Thread(client1);
        server2.Start();
        client2.Start();
    }
    public static void ServerSide()
    {
        Console.WriteLine("ServerSide....");
        TcpChannel ch2 = (TcpChannel)Helper.GetChannel(2233, true);
        ChannelServices.RegisterChannel(ch2, false);
        IRemoteObject objRemoteRef = (IRemoteObject)Activator.GetObject(
            typeof(IRemoteObject), "tcp://127.0.0.1:2333/M");
        while (true)
        {
            string x = Console.ReadLine();
            objRemoteRef.GetData(x);
        }
    }
    public static void ClientSide()
    {
        Console.WriteLine("ClientSide....");
        TcpChannel ch1 = (TcpChannel)Helper.GetChannel(0, true);
        ChannelServices.RegisterChannel(ch1, false);
        RemotingConfiguration.RegisterWellKnownServiceType(
            typeof(RemoteObject), "M", WellKnownObjectMode.Singleton);
        Console.ReadLine();
    }
}

Helper

public class Helper
{
    public static IChannel GetChannel(int tcpPort, bool isSecure)
    {
        BinaryServerFormatterSinkProvider serverProv =
            new BinaryServerFormatterSinkProvider();
        serverProv.TypeFilterLevel = TypeFilterLevel.Full;
        IDictionary propBag = new Hashtable();
        propBag["port"] = tcpPort;
        propBag["typeFilterLevel"] = TypeFilterLevel.Full;
        propBag["name"] = Guid.NewGuid().ToString();
        if (isSecure)
        {
            propBag["secure"] = isSecure;
            propBag["impersonate"] = false; 
        }
        return new TcpChannel(
            propBag, null, serverProv);
    }
}