使用远程处理的C#简单聊天应用程序:客户端表单不更新

时间:2015-03-15 18:55:54

标签: c# chat remoting

我试图在C#(Visual Studio)中使用远程处理创建一个简单的聊天应用程序。 我的问题是,客户端通过端口向服务器发送连接请求,服务器接收此请求,在端口中将客户端注册到字典中,然后向客户端发回一条问候消息(只是为了测试)。我可以在客户端控制台中从服务器打印消息,但表单不会更新。

以下是代码:

在客户端和服务器的共享库中,我有两个接口,一个用于服务器的服务:

namespace ChatApplication
{
    public interface IServerServices
    {
        void sendMessage(string client, string msg);

        void register(string client, int port);

    }
}

另一个是客户服务:

namespace ChatApplication
{
    public interface IClientServices
    {
        void receiveMsg(string s);
    }
}

在服务器中我有:

namespace ChatApplication
{
    public class ChatServer
    {
        static void Main(string[] args)
        {
            TcpChannel channel = new TcpChannel(8086);
            ChannelServices.RegisterChannel(channel, false);
            RemotingConfiguration.RegisterWellKnownServiceType(
                typeof(ServerServices),
                "RemoteObject",
                WellKnownObjectMode.Singleton);        
            System.Console.ReadLine();
        }
    }
}

实现服务器服务的类:

namespace ChatApplication
{
    public class ServerServices : MarshalByRefObject, IServerServices
    {
        private Dictionary<string, IClientServices> clients =
            new Dictionary<string, IClientServices>();

        public void register(string client, int port)
        {
            Console.WriteLine("Registered client: " + client + " on port: " + port);
        IClientServices cli = (IClientServices )Activator.GetObject(
            typeof(IClientServices),
            "tcp://localhost:" + port + "/RemoteClient");

        clients.Add(client, cli);
        cli.receiveMsg("Hello client " + client); //Just to test the form on the client
    }

}

}

在客户端,我有客户的主要类:

namespace ChatApplication
{
    static class ChatClient
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Form1 form = new Form1();
            Application.Run(form);
        }
    }
}

实现客户服务的类:

namespace ChatApplication
{
    public class ClientServices : MarshalByRefObject, IClientServices 
    {

        public static Form1 myForm;

        public ClientServices ()
        {
        }

        public void receiveMsg(string s)
        {
            myForm.addMsg(s);
        }

    }
}

最后是客户的表单应用程序:

namespace ChatApplication
{
    public partial class Form1 : Form
    {

        TcpChannel newch;

        public Form1()
        {
            InitializeComponent();
        }

        public void addMsg(string s)
        {
            Console.WriteLine("received msg " + s);
            session.Text += s + "\r\n";
        }

        public void connectButton_Click(object sender, EventArgs e)
        {
            int port = Int32.Parse(portText.Text);
            newch = new TcpChannel(port);
            ChannelServices.RegisterChannel(newch, false);
            ClientServices.myForm = this;
            RemotingConfiguration.RegisterWellKnownServiceType(
                typeof(ClientServices),
                "RemoteClient",
                WellKnownObjectMode.Singleton);

            IServerServices serverInstance = (IServerServices)Activator.GetObject(
            typeof(IServerServices),
            "tcp://localhost:8086/RemoteObject");

            serverInstance.register(nickname.Text, port);
        }
    }
}

问题是我在客户端的控制台中看到了文本&#34; Hello client&#34; + ... 但客户端表单的元素会话不会更新,客户端崩溃。实现客户端服务的类具有myForm具有静态的字段,因为我不知道发布具有字段的远程对象的其他方式,所以我这样做了,我猜它有效,它&# 39;只是表单没有更新。我做错了什么?

很抱歉所有的代码,但我想这样你就可以看到这里发生了什么。

1 个答案:

答案 0 :(得分:0)

黑暗中的野蛮刺:这可能是一个并发问题。尝试序列化对客户端UI的访问,这样您就不会获得重叠访问权限。就此而言,您在访问UI时是否正在编组UI线程?粗略检查一下你的UI代码让我觉得这不是问题(Console.WriteLine应该为你做这件事),但是在你发布那条错误信息之前没有人会对你有所帮助。