我试图在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;只是表单没有更新。我做错了什么?
很抱歉所有的代码,但我想这样你就可以看到这里发生了什么。
答案 0 :(得分:0)
黑暗中的野蛮刺:这可能是一个并发问题。尝试序列化对客户端UI的访问,这样您就不会获得重叠访问权限。就此而言,您在访问UI时是否正在编组UI线程?粗略检查一下你的UI代码让我觉得这不是问题(Console.WriteLine应该为你做这件事),但是在你发布那条错误信息之前没有人会对你有所帮助。