服务器端的高性能实现(三)——框架结构的初步调整

在上次,我完成了一个非常简单的小框架。为了后面的开发,现在是对这个框架做些调整的时候了。

首先是配置信息的调整。比如IP和端口,这些东西当然不能写死在代码里面了。为此,先在项目里面建立一个文件夹,起名Config。顾名思义,这里面的东西将来都会是配置相关的代码。

这次先在里面添加3个文件。

第一个叫做ConfigProvider,它的作用是对外提供配置信息。这一次,就让它提供IP地址和端口。将来还会提供更多的内容,比如线程池的配置参数。理所当然的,ConfigProvider当然也是单件模式了。不过我要在它的构造函数里面加点东西:
private string ipAddr;
private int portNum;
private ConfigProvider()
{
Init();
}
我在构造函数里面添加了一个Init方法,它的作用是解析配置文件。配置文件我打算用.net提供的配置文件,就是那个扩展名是.config的xml文件。下面是Init的实现代码。
private void Init()
{
//UserProperty是我定义的一个节点名称
CustomSection sec = (CustomSection)ConfigurationManager.GetSection("UserProperty");
CustomElement custElem = sec.CustElem;
this.ipAddr = custElem.IP;//IP地址
this.portNum = custElem.Port;//端口号
}

好了,ConfigProvider实现好了。很简单吧,也很容易看明白。接下来是里面用到的CustomSection和CustomElement。
先说CustomSection。看名字也很容易理解它的用处了,它表示配置文件里面的一节。实现代码就聊聊几行,如下:
class CustomSection : ConfigurationSection
{
[ConfigurationProperty("CustomProperty")]
public CustomElement CustElem
{
get{return (CustomElement)this["CustomProperty"];}
}
}
完了。就这么几行。
接下来是CustomElement了。
class CustomElement : ConfigurationElement
{
[ConfigurationProperty("IP")]
{
get{return (string)this["IP"];}
}

[ConfigurationProperty("Port")]
{
get{return (string)this["Port"];}
}
}
再下来是配置文件里面的内容:
.....





IP="192.168.14.13"
Port="9527"/>


好了,接下来该调整框架结构了。首先建立一个文件夹Core,然后把最早建立的Core放进去。接着,先添加一个Listener类。把Core里面的start和stop转移到这里面来。这样做的目的是专门建立一个用于监听网络的类,做到条例清晰。

下面建立一个ConnectionManager类。还记得先前Core里面用一个ArrayList保存socket的做法么?其实这个ConnectionManager,就是一个高级些的ArrayList。在文件夹Core下面添加ConnectionManager类,然后停下来思考一下先。这个ConnectionManager都要提供什么方法呢?肯定要有添加socket,删除socket,将来还会有遍历socket的功能。好了,就先实现刚才说的那两个方法。代码如下:
private ArrayList allsockets = new ArrayList();
public void AddSocket(TcpClient client)
{
if (client != null && !allsockets.Contains(client))
{
allsockets.Add(client);
}
}

public void RemoveAllSockets()
{
try
{
foreach(TcpClient client in allsockets)
{
client.GetStream().Closer();
client.Close();
}
Clear();
}
catch{}
}

public void Clear()
{
allsockets.Clear();
}
上面的三个方法,分别提供了保存socket,关闭全部socket和清空socket的功能。做完这些之后,我们的工作还没有结束。接着是添加一个接口:IConnection。目前,这个接口就3个方法,就是上面那3个,呵呵。然后修改类ConnectionManager的声明,让它继承这个接口。

可能有人会问了:干什么要这么做呢?
理由很多,但是一条就足够了:为了测试!

现在做好了ConnectionManager,接下来就要回过头来修改一下Listener了。没错,我也要给它的接口提取出来。不过提取之前,还要改点东西。
首先就是把以前Listener里面用到allsockets的地方,都改用ConnectionManager来做。
然后,把对ConnectionManager的声明使用这样修改:
不要写private ConnectionManager connection = new ConnectionManager();
而是要写private IConnection connection;
为了给connection赋值,我又添加了一个属性:
public IConnection Connection
{
get{return this.connection;}
set{this.connection = (IConnection)value;}
}
接下来,提取接口,我添加了一个IListener接口,如下:
interface IListener
{
void Start();
void Stop();
IConnection Connection{set;get;}
}
最后,就是修改Listener的声明了,让它继承IListener。

这些都做完了,剩下的就是修改Core这个最早做好的类了。可以说,现在的它才是真正的实现了当领导的愿望,不用再自己去干活了。
现在的core里面的start和stop方法实现如下:
public void Start()
{
listener.Start();
}

public void Stop()
{
listener.Stop();
}
此外,Core也逃脱不了被提取接口的命运。它的接口也很简单,就是上面那两个方法,接口的名字自然就叫做ICore了,呵呵。

完成了这些,还有一件事情没有做。就是给Listener设置Connection。为此,我在Core的构造函数里面添加了一个Init方法。Init的代码如下:
private IListener listener;
private void Init()
{
if(listerner == null)
listener = new Listener();
listener.Connection = new ConnectionManager();
}

不过,上面有一行代码的实现还可以做得更好,就是这行:
listener.Connection = new ConnectionManager();

既然都接口了,又有了上面配置文件的基础,嘿嘿,反射一下好了。利用配置文件,来决定我们用哪个ConnectionManager(虽然就一个吧,而且似乎也没有变动的必要)。 可是为什么要这么做呢?很简单:灵活,另外就是———多学习点技术总不是坏事情吧,嘿嘿。

于是,仿照上面在配置文件里面添加IP和Port的过程,添加一个Connection属性,类型还是字符串就可以了。
我这里的配置文件就变成了下面的样子:


IP="192.168.14.13"
Port="9527"
Connection ="Server4Win.Core.ConnectionManager"/>

至于修改CustomXX类的过程我就跳过了。
下面修改Core里面的Init。
private void Init()
{
if(listerner == null)
listener = new Listener();
connection = (IConnection)Activator.CreateInstance(Type.GetType(ConfigProvider.GetInstance.Connection));
if (connection == null)
{
throw new TypeLoadException("cann't find this type");
}
else
{
listener.Connection = connection;
}
}

如此一来,以后要是换个Connection,直接改配置文件就可以了。

框架结构的调整到这里先告一段落。接下来就要进入真正的正题了:如何响应客户端的信息。

这个东西,下次写!嘿嘿。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值