Ok her er hele koden.... det virker hvertfald for mig...
Jeg har lavet 3 projekter...:
RemotingServer: (Har RemotingInterface som referance)
----------------------------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.ComponentModel;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using System.Threading;
using RemotingClient;
using RemotingInterfaces;
namespace RemotingServer
{
class Program
{
static void Main(string[] args)
{
EVSRemotingInnerSingleton.Instance.OnMessageReceived += new OnMessageReceivedDelegate(Instance_OnMessageReceived);
EVSRemotingMiniServer server = new EVSRemotingMiniServer();
Console.WriteLine("Type Eny Key to Shutdown the server");
Console.ReadLine();
Environment.Exit(0);
}
static void Instance_OnMessageReceived(string message, string sender)
{
Console.WriteLine("Message: \n\r {0} \n\r\n\r Sender: \n\r {1} \n\r\n\r --------------- \n\r", message, sender);
}
}
class EVSRemotingMiniServer
{
private EVSRemotingImplementation eri;
private delegate void ShowMessageDelegate(string message, string sender);
private ShowMessageDelegate showMessage;
public Thread myMiniRemotingServerThread;
public EVSRemotingMiniServer()
{
this.startRemotingService();
}
public void startRemotingService()
{
myMiniRemotingServerThread = new Thread(new System.Threading.ThreadStart(this.remotingService));
myMiniRemotingServerThread.Start();
}
private void remotingService()
{
BinaryServerFormatterSinkProvider serverProv = new BinaryServerFormatterSinkProvider();
BinaryClientFormatterSinkProvider clientProv = new BinaryClientFormatterSinkProvider();
serverProv.TypeFilterLevel = System.Runtime.Serialization.Formatters.TypeFilterLevel.Full;
System.Collections.Hashtable properties = new System.Collections.Hashtable();
properties["port"] = 9900;
try
{
TcpChannel tcp = new TcpChannel(properties, clientProv, serverProv);
ChannelServices.RegisterChannel(tcp, false);
RemotingConfiguration.RegisterWellKnownServiceType(typeof(EVSRemotingImplementation), "MessageServer.rem", WellKnownObjectMode.SingleCall);
Console.WriteLine("TcpRemoting Server Started");
}
catch (Exception ex)
{
Console.WriteLine("------------------------------------------------------------------------");
Console.WriteLine(ex.Message);
Console.WriteLine(ex.StackTrace);
Console.WriteLine();
}
//SingleCall anbefales gennerelt, normal gør jeg det at jeg bruger single calls, og gemmer min singleton inde bag et interface.. så slipper du for en masse bøvl på serversiden
//Bøvlen er naturligvis at der skal til at være sponsors og alt muligt på serversiden, ting som gennerelt set i mine øjne er overføldigt for en server implementation
}
public void eri_OnMessageReceived(string message, string sender)
{
//this.Invoke(showMessage, new object[] { message, sender });
Console.WriteLine(message);
}
public void ShowReceivedMessage(string message, string sender)
{
Console.WriteLine(message + sender);
}
}
public delegate void OnMessageReceivedDelegate(string message, string sender);
[Serializable]
public class EVSRemotingImplementation : MarshalByRefObject, EVSMiniServerInterface
{
public void ChangeGooditems(string message, string sender)
{
EVSRemotingInnerSingleton.Instance.ChangeGooditems(message, sender);
}
}
public class EVSRemotingInnerSingleton
{
private static EVSRemotingInnerSingleton instance = new EVSRemotingInnerSingleton();
public static EVSRemotingInnerSingleton Instance { get { return instance; } }
private EVSRemotingInnerSingleton()
{ }
public event OnMessageReceivedDelegate OnMessageReceived;
public void ChangeGooditems(string message, string sender)
{
if ((OnMessageReceived != null) && (OnMessageReceived.GetInvocationList().Length > 0))
OnMessageReceived(message, sender);
}
}
}
----------------------------------------------------------------------------------------
RemotingInterface:
----------------------------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Text;
namespace RemotingInterfaces
{
public interface EVSMiniServerInterface
{
void ChangeGooditems(string message, string sender);
}
}
----------------------------------------------------------------------------------------
RemotingClient: (Har RemotingInterface som referance)
----------------------------------------------------------------------------------------
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
namespace RemotingClient
{
class Program
{
static void Main(string[] args)
{
BinaryServerFormatterSinkProvider serverProv = new BinaryServerFormatterSinkProvider();
BinaryClientFormatterSinkProvider clientProv = new BinaryClientFormatterSinkProvider();
serverProv.TypeFilterLevel = System.Runtime.Serialization.Formatters.TypeFilterLevel.Full;
Hashtable properties = new System.Collections.Hashtable();
properties.Add("port", 9000);
TcpChannel tcp = new TcpChannel(properties, clientProv, serverProv);
ChannelServices.RegisterChannel(tcp, false);
EVSMiniServerInterface sm = (EVSMiniServerInterface)Activator.GetObject(typeof(EVSMiniServerInterface), "
tcp://localhost:9900/MessageServer.rem");
while (true)
{
if (sm == null)
{
Console.WriteLine("Failed to communicate with remote server.");
return;
}
else
{
Console.WriteLine("Enter message to send to server:");
string message = Console.ReadLine();
Console.WriteLine("Enter your name (sender):");
string sender = Console.ReadLine();
sm.ChangeGooditems(message, sender);
}
}
}
}
}
----------------------------------------------------------------------------------------