سؤال

I'm creating a chat application with 2 different console application using a TCP channel connection, but when I run the client console or the server console I get "TCP is already registered"

I have 4 projects of code.

  1. Interface
  2. RemoteObject
  3. Client
  4. Server

Here's the interface code:

using System;

public interface IRemoteObject
{
    void GetData(string myString);        

}

Here's the RemoteObject code:

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);
    }
}

Here's the Client code:

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);

        }

    }

}

Here's the Server Code:

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();



        }
    }
}

Please help, I'm pretty new here and I'm not sure I wrote the post correct, please understand.

Thanks

هل كانت مفيدة؟

المحلول

Try this:

The client

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);
    }
}

The server:

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();
    }
}

The Helper class

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);
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top