繁体   English   中英

.net远程处理聊天服务器问题

[英].net remoting problem with chat server

我的聊天服务器实现存在问题,我无法弄清为什么它无法按预期工作。

客户端可以将消息发送到服务器,但是服务器仅将消息发送到自身而不是客户端。

例如,客户端连接到服务器,然后在聊天中键入“ hello”。 服务器成功获取消息,但随后将消息发布到其自己的控制台,而不是将其发送到连接的客户端。

好吧...也许我错过了一些东西,因为我是.Net远程处理的新手。 也许有人可以帮助我找出问题所在。 任何帮助表示赞赏!

编码:

我在服务器上有一个用于聊天实现的小界面

 public class ChatService : MarshalByRefObject, IService
 {
private Dictionary<string, IClient> m_ConnectedClients = new Dictionary<string, IClient>();
private static ChatService _Chat;

private ChatService()
{
    Console.WriteLine("chat service created");
    _Chat = this;
}

public bool Login(IClient user)
{
    Console.WriteLine("logging in: " + user.GetIp());
    if (!m_ConnectedClients.ContainsKey(user.GetIp()))
    {
            m_ConnectedClients.Add(user.GetIp(), user);
        PostMessage(user.GetIp(), user.GetUserName() + " has entered chat");
        return true;
    }

    return false;
}

public bool Logoff(string ip)
{
    Console.WriteLine("logging off: " + ip);
    IClient user;

    if (m_ConnectedClients.TryGetValue(ip, out user))
    {
        PostMessage(ip, user + " has left chat");
        m_ConnectedClients.Remove(ip);
        return true;
    }

    return false;
}

   public bool PostMessage(string ip, string text)
   {
            Console.WriteLine("posting message: " + text + " to: " + m_ConnectedClients.Values.Count);
    foreach (var chatter in m_ConnectedClients.Values)
    {
        Console.WriteLine(chatter.GetUserName() + " : " + chatter.GetIp());
        chatter.SendText(text);
    }

    return true;
}

}

我的服务器将chatservice实现为单例:

RemotingConfiguration.RegisterWellKnownServiceType(typeof(ChatService), "chatservice",  WellKnownObjectMode.Singleton);

我的客户也很简单:

[Serializable]
public class Chat_Client : IClient
{
    private string m_IpAdresse;
    private string m_UserName = "Jonny";
    private string m_Input;

    public Chat_Client(string ip, string username)
    {
        m_IpAdresse = ip;
        m_UserName = username;
    }

    public bool HandleInput(string input)
    {
        if (input.Equals("exit"))
        {
            Client.m_ChatService.Logoff(m_IpAdresse);
            return false;
        }

        m_Input = input;
        Thread sendThread = new Thread(new ThreadStart(SendPostMessage));
        sendThread.Start();

        //Console.WriteLine("post message");
        return true;
    }

    private void SendPostMessage()
    {
        Client.m_ChatService.PostMessage(m_IpAdresse, m_Input);

        Thread thisThread = Thread.CurrentThread;
        thisThread.Interrupt();
        thisThread.Abort();
    }


    public void SendText(string text)
    {
        Console.WriteLine("send text got: " + text);
        Console.WriteLine(text);
    }

主客户端通过以下方式连接到服务器:

public void Connect()
{
        try
        {
            TcpChannel channel = new TcpChannel(0);
            ChannelServices.RegisterChannel(channel, false);
            m_ChatService = (IService)Activator.GetObject(typeof(IService), "tcp://" + hostname + ":9898/Host/chatservice");

            System.Net.IPHostEntry hostInfo = Dns.GetHostEntry(Dns.GetHostName());
            m_IpAdresse = hostInfo.AddressList[0].ToString();

            Chat_Client client = new Chat_Client(m_IpAdresse, m_UserName);

            Console.WriteLine("Response from Server: " + m_ChatService.Login(client));

            string input = "";

            while (m_Running)
            {
                input = Console.ReadLine();
                m_Running = client.HandleInput(input);
            }
        }
}

@约翰:不,我没有意识到。 感谢您提供的信息,我将对其进行调查。

@Felipe:主机名是我要连接的服务器的dns名称。

我找到了一种解决方法来使这项工作。 我在客户端登录时向服务器连接的客户端添加了一个附加的TcpListener。通过第二个通道,我将聊天消息传送回去。

但是我不明白为什么旧的解决方案不起作用:<

谢谢你们的提示。

.NET远程处理的最佳方法是将其放弃用于WCF。 如果您阅读了有关可伸缩性的所有最佳实践,则最终使用它的方式将与Web服务模型高度兼容,并且Web服务的使用将更加容易。

远程处理在技术上引人入胜,并构成了反射的基础,但是一旦涉及到缓慢,不可靠的连接,便会崩溃—与进程内消息传递相比, 所有连接都是缓慢且不可靠的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM