📄 server.cs
字号:
using System;
using System.Runtime;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Http;
using System.Runtime.Remoting.Channels.Tcp;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters;
using System.Collections;
using System.Net;
using ChatMediator;
using System.Globalization;
[assembly:CLSCompliant(true)]
namespace RemoteServer
{
[Serializable]
internal class Mediator : MarshalByRefObject, IMediator
{
private ArrayList clientsList;
private ArrayList privateChatClient;
private string []errorMessages = {"User already exists"};
public Mediator()
{
this.clientsList = new ArrayList();
this.privateChatClient = new ArrayList();
}
#region IMediator Members
public void ConnectToChat(IClientImplement ici)
{
if (ici != null)
{
try
{
// First check with the unique user
foreach (IClientImplement icc in this.clientsList)
{
if (icc.UserName.CompareTo(ici.UserName) == 0)
{
throw new UserExceptions(errorMessages[0]);
}
}
this.clientsList.Add(ici);
Console.WriteLine("--------------------Joining of new user----------------------");
Console.WriteLine(ici.UserName + " joined chat at: " + DateTime.Now.ToString());
Console.WriteLine("----------------------------------------------------------");
foreach (IClientImplement icimp in this.clientsList)
{
ici.ClientList = this.clientsList;
icimp.SendWelcomeMessageTome(ici);
}
}
catch (RemotingException ex)
{
Console.WriteLine(ex.Message);
Console.WriteLine(ex.StackTrace);
throw new UserExceptions(ex.Message, ex);
}
}
}
public void SendMessageToAll(IClientImplement ici)
{
try
{
foreach (IClientImplement icimp in this.clientsList)
{
icimp.SendMessageTome(ici);
}
}
catch (RemotingException ex)
{
Console.WriteLine(ex.Message);
Console.WriteLine(ex.StackTrace);
throw new UserExceptions(ex.Message, ex);
}
}
public void RemoveMe(IClientImplement ici)
{
if (ici != null)
{
try
{
ArrayList temp = new ArrayList();
Console.WriteLine("\n-------------Removal of user--------------------------\n");
foreach (IClientImplement icm in this.clientsList)
{
Console.WriteLine("User name: " + icm.UserName);
if (icm.UserName.CompareTo(ici.UserName) != 0)
{
Console.WriteLine("Added user name: " + icm.UserName);
temp.Add(icm);
}
}
Console.WriteLine(ici.UserName + " left chat at: " + DateTime.Now.ToString());
foreach (IClientImplement icimp in temp)
{
Console.WriteLine("Sending message to: " + icimp.UserName);
ici.ClientList = temp;
icimp.UserLeft(ici);
}
this.clientsList.Clear();
foreach (IClientImplement icm in temp)
{
Console.WriteLine("Updating class array list. Adding: " + icm.UserName);
this.clientsList.Add(icm);
}
Console.WriteLine("\n--------------------------------------------\n");
}
catch (RemotingException ex)
{
Console.WriteLine("\n\nError occured. Message:" + ex.Message);
Console.WriteLine("Stack trace: " + ex.StackTrace);
throw new UserExceptions(ex.Message, ex);
}
}
}
public void SendPrivateMessage(IClientImplement clientObject)
{
try
{
string []strUsers = clientObject.UserName.Split('|');
string sender = strUsers[0];
string receiver = strUsers[1];
Console.WriteLine("-------------------Private chat section--------------");
Console.WriteLine("Sending private message from " + sender + " to " + receiver);
Console.WriteLine("Message: " + clientObject.Message);
foreach (IClientImplement ici in this.privateChatClient)
{
Console.WriteLine("UserName: " + ici.UserName + " Receiver: " + ici.ReceiverName);
clientObject.UserName = sender;
ici.SendMessageTome(clientObject);
}
foreach (IClientImplement icc in this.clientsList)
{
if (icc.UserName.CompareTo(receiver) == 0)
{
clientObject.UserName = sender;
Console.WriteLine("Sending private message to: " + icc.UserName);
icc.SendMessageTome(clientObject);
}
}
Console.WriteLine("-----------------------------------------------");
}
catch (Exception ex)
{
Console.WriteLine("An error occured. Error: " + ex.Message);
}
}
public void ConnectToPrivateChat(IClientImplement clientObject)
{
string []strUsers = clientObject.UserName.Split('|');
string sender = strUsers[0];
string receiver = strUsers[1];
foreach (IClientImplement ici in this.privateChatClient)
{
if (ici.UserName.CompareTo(clientObject.UserName) == 0)
{
throw new ApplicationException("User already started private chat with the given user");
}
}
this.privateChatClient.Add(clientObject);
Console.WriteLine("\n----------------Private chat connect--------------\n");
Console.WriteLine("Private chat started between " + sender + " and " + receiver + " at:" + DateTime.Now.ToString());
}
#endregion
public override object InitializeLifetimeService()
{
return null;
}
}
/// <summary>
/// Summary description for Class1.
/// </summary>
class Server
{
private HttpChannel htc;
private TcpChannel tcc;
private int httpPortNumber = 8888;
private int tcpPortNumber = 5678;
public Server()
{
// Register Http channel
SoapClientFormatterSinkProvider scl = null;
SoapServerFormatterSinkProvider ssr = new SoapServerFormatterSinkProvider();
ssr.TypeFilterLevel = TypeFilterLevel.Full;
IDictionary id = new Hashtable();
id["port"] = httpPortNumber;
id["typeFilterLevel"] = TypeFilterLevel.Full;
id["name"] = System.Guid.NewGuid().ToString();
htc = new HttpChannel(id, scl, ssr);
ChannelServices.RegisterChannel(htc);
id.Clear();
id = null;
// Register Tcp channel
BinaryClientFormatterSinkProvider bcfs = null;
BinaryServerFormatterSinkProvider bsfs = new BinaryServerFormatterSinkProvider();
bsfs.TypeFilterLevel = TypeFilterLevel.Full;
id = new Hashtable();
id["port"] = tcpPortNumber;
id["typeFilterLevel"] = TypeFilterLevel.Full;
id["name"] = System.Guid.NewGuid().ToString();
tcc = new TcpChannel(id, bcfs, bsfs);
ChannelServices.RegisterChannel(tcc);
id.Clear();
id = null;
}
public static void StartServer()
{
try
{
RemotingConfiguration.RegisterWellKnownServiceType(typeof(Mediator), "ChatServer.soap",
WellKnownObjectMode.Singleton);
}
catch (RemotingException ex)
{
Console.WriteLine(ex.Message);
throw new UserExceptions(ex.Message, ex);
}
}
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main(string[] args)
{
//
// TODO: Add code to start application here
//
if (args != null && args.Length > 0)
{
Console.WriteLine(args[0]);
}
try
{
Console.WriteLine("/********************************************************/");
Console.WriteLine("**\tWelcome to chat application developed by-:");
Console.WriteLine("**\tJayant D. Kulkarni, Mahindra-British Telecom.");
Console.WriteLine("**\tThis is server.");
Server srs = new Server();
Server.StartServer();
Console.WriteLine("**\tServer started successfuly.");
Console.WriteLine("**\tListening at.");
Console.WriteLine("**\tHttpChannel: 8888 and TcpChannel: 5678.");
Console.WriteLine("/********************************************************/\n\n");
}
catch (Exception ex)
{
Console.WriteLine("Error occured. Message: " + ex.Message);
}
Console.ReadLine();
}
}
internal class UserExceptions : ApplicationException
{
internal UserExceptions(string message) : base(message)
{
}
internal UserExceptions(string message, RemotingException ex) : base(message, ex)
{
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -