聊天服务器出现.net远程处理问题
本文关键字:处理问题 net 服务器 聊天 | 更新日期: 2023-09-27 17:59:27
我的聊天服务器实现有问题,我不明白为什么它不能按预期工作。
客户端可以向服务器发送消息,但服务器只向自身而不是客户端发送消息。
例如,客户端连接到服务器,然后在聊天中键入"你好"。服务器成功地获取了消息,但随后将消息发布到自己的控制台,而不是发送到连接的客户端。
嗯。。。也许我错过了什么,因为我对.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;
}
}
My Server将聊天服务实现为singleton:
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:hostname是我要连接的服务器的dns名称。
我找到了一个变通办法来实现这一点。当客户端登录时,我向服务器连接的客户端添加了一个额外的TcpListener。通过第二个通道,我将聊天消息发回。
然而,我不明白为什么旧的解决方案不起作用:<
谢谢你们的提示。
对.NET远程处理最好的做法是放弃它,转而使用WCF。如果您阅读了所有关于可伸缩性的最佳实践,那么最终使用它的方式与Web服务模型非常兼容,并且Web服务更容易使用。
远程处理在技术上很吸引人,是反思的基础,但一旦涉及到缓慢、不可靠的连接,远程处理就会崩溃——与进程中的消息传递相比,所有连接都是缓慢和不可靠的。