2015-10-15 56 views
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; 
     } 
    } 
} 

}

感谢您的帮助提前

回答

0

当您设置您需要通过它的Form1的实例在远程监听,或者使其可用。在某个具有Form1实例的某个对象上有一个静态对象。然后你可以读远程课程。

+0

你能举个例子吗? –