2

TCP チャネル接続を使用して 2 つの異なるコンソール アプリケーションでチャット アプリケーションを作成していますが、クライアント コンソールまたはサーバー コンソールを実行すると、「TCP は既に登録されています」というメッセージが表示されます。

コードの 4 つのプロジェクトがあります。

  1. インターフェース
  2. リモートオブジェクト
  3. クライアント
  4. サーバ

インターフェースコードは次のとおりです。

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



        }
    }
}

助けてください、私はここではかなり新しいので、投稿を正しく書いたかどうかわかりません。ご了承ください。

ありがとう

4

1 に答える 1

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);
    }
}
于 2013-02-26T13:01:29.663 に答える