0
Im使用.NET Remoting编写聊天应用程序。问题是我想用Invoke在客户端编辑表单(addMsg),但我不能调用它,因为我只能实例化超类(在clientObject构造函数中)而不是子类,因为它对我而言不可见。 我不能很好地解释这个问题,但它在评论中的代码中是明确的。.NET ChatRemoting问题
客户机代码:
命名空间DADChat {
public partial class Form1 : Form
{
private MyRemoteObject objetoServidor = null;
private clientObject objetoCliente = null;
public Form1()
{
InitializeComponent();
}
private void sendButton_Click(object sender, EventArgs e)
{
string mensagem = messageBox.Text;
string nick = nickBox.Text;
objetoServidor.enviaMensagem(nick, mensagem);
}
public void addMsg(string m) //adiciona mensagem à conversa
{
textBox4.Text += "\r\n" + m;
}
private void connectButton_Click(object sender, EventArgs e)
{
string url = "tcp://localhost:" + portBox.Text + "/objectClientName";
int port = Int32.Parse(portBox.Text);
string nick = nickBox.Text;
TcpChannel channel = new TcpChannel(port);
ChannelServices.RegisterChannel(channel, true);
objetoCliente = new clientObject(this); /* i use this to pass the reference of this object so i can edit the form in the remote class */
RemotingServices.Marshal(objetoCliente, "objectClientName", typeof(clientObject));
objetoServidor = (MyRemoteObject)Activator.GetObject(typeof(MyRemoteObject), "tcp://localhost:8096/MyRemoteObjectName");
NovoCliente cliente = new NovoCliente();
cliente.Nome = nick;
objetoServidor.adicionarCliente(cliente.Nome, url, port);
objetoServidor.printListaClientes();
}
}
}
远程类: 命名空间ChatObjects { 公共委托无效delChat(串m);
public class MyRemoteObject : MarshalByRefObject
{
private List<NovoCliente> listaClientes = new List<NovoCliente>();
public event delChat serverParaCliente;
public string metodoOla()
{
return "Ola!";
}
public void adicionarCliente(string nome, string url,int port)
{
if (nome != null)
{
NovoCliente cliente = new NovoCliente();
cliente.Nome = nome;
cliente.Porto = port;
cliente.URL = url;
listaClientes.Add(cliente);
}
}
public void printListaClientes()
{
for (int i = 0; i < listaClientes.Count; i++)
Console.WriteLine("Cliente: " + listaClientes[i].Nome + " e a sua localização é " + listaClientes[i].Porto + "\n");
}
public void enviaMensagem(string nickname, string mensagem) //método responsável por receber a mensagem do utilizador e envia para o chat
{
string mensagemFinal = nickname + ": " + mensagem;
foreach (NovoCliente cliente in listaClientes)
{
clientObject obj = (clientObject)Activator.GetObject(typeof(clientObject), cliente.URL);
obj.recebeMsg(mensagemFinal);
}
}
}
public class clientObject : MarshalByRefObject
{
public Form f; /* the problem resides here because to call addMsg it should Form1 f and not Form */
public clientObject(Form f)
{
this.f = f;
}
public void recebeMsg(string msg)
{
f.Invoke(new delChat(f.addMsg), new object[] { msg }); /* cant call addMsg */
}
}
public class NovoCliente
{
private string nome;
private int porto;
private string url;
public string Nome
{
get
{
return nome;
}
set
{
nome = value;
}
}
public string URL
{
get
{
return url;
}
set
{
url = value;
}
}
public int Porto
{
get
{
return porto;
}
set
{
porto = value;
}
}
}
}
感谢您的帮助提前
你能举个例子吗? –