WCF P2P example
Create empty c# Console project and add reference to System.ServiceModel
Message interface and class
[ServiceContract(CallbackContract = typeof(IMessage))]
public interface IMessage{[OperationContract(IsOneWay = true)]
void Send(string sender, string message);}class MessageImpl : IMessage
{public string Name { get; set; }public MessageImpl(string name){Name = name;}public void Send(string sender, string message){if (!Name.Equals(sender))
{Console.WriteLine("{0}: {1}", sender, message);
}}}
Messenger
public class Messenger{public string Name { get; private set; }public IMessage Channel;
public IMessage Host;
private DuplexChannelFactory<IMessage> _factory;
private readonly AutoResetEvent _stopped = new AutoResetEvent(false);private readonly AutoResetEvent _started = new AutoResetEvent(false);public Messenger(string name, AutoResetEvent started){Name = name;_started = started;}private void StartService(){var binding = new NetPeerTcpBinding();
binding.Security.Mode = SecurityMode.None;var endpoint = new ServiceEndpoint(
ContractDescription.GetContract(typeof(IMessage)),
binding,new EndpointAddress("net.p2p://Messenger"));Host = new MessageImpl(Name);
_factory = new DuplexChannelFactory<IMessage>(
new InstanceContext(Host),
endpoint);var channel = _factory.CreateChannel();((ICommunicationObject)channel).Open();Channel = channel;}private void StopService(){((ICommunicationObject)Channel).Close();if (_factory != null)_factory.Close();}public void Start(){Console.WriteLine("Starting Messenger");
StartService();Console.WriteLine("Running Messenger");
_started.Set();_stopped.WaitOne();Console.WriteLine("Stopping Messenger");
StopService();Console.WriteLine("Stopped");
}public void Stop(){_stopped.Set();}}
Main Program
class Program
{static void Main(string[] args){if(args.Length<1)
{Console.WriteLine("usage: Messenger <your-name>");
return;
}var me = args[0];var started = new AutoResetEvent(false);var messager = new Messenger(me,started);
var thread = new Thread(messager.Start) { IsBackground = true };thread.Start();started.WaitOne();while (true){string tmp = Console.ReadLine();
if (tmp == "bye") break;messager.Channel.Send(me, tmp);}messager.Stop();thread.Join();}}
To start it run
Messenger.exe <your-name>
To stop type ‘bye’
Comments
Post a Comment