"
最近一直和Asterisk打交道,所以又写起了Socket tcp。Smark.Net是基于Socket Tcp封装的组件,主要用途是简化Socket tcp通讯的实现;已经使用它来实现了Asterisk的管理程序和AGI接管程序,以下使用Smark.Net实现一个简单的聊开程序。该程序主要分为两部分,一部分是服务端另一部分就是客户端;信息通过服务端转发到相关客户端。先看下实现的效果图再细讲每端的实现。
服务端
定义服务构建监听程序:
private Smark.Net.Server
new Smark.Net.Server
Smark.Net.Server是一个Socket Tcp的服务类,它的泛参描述这个服务是用于那个IClient的实现,XMLClient是一个实现对象,它的泛参是描述这个Client的数据分包实现。
定义相关事件:
mServer.Coding = Encoding.UTF8;
mServer.ClientDisposed += (o, c) => {
Invoke(new Action
};
mServer.ClientConnected += (o, c) => {
Smark.Net.Messages.XMLClient
= (Smark.Net.Messages.XMLClient
msgclient.MessageReceive += MessageReceive;
msgclient.Receive
msgclient.Receive//代码效果参考:https://v.youku.com/v_show/id_XNjQwMDM5NzAyOA==.html
msgclient.Receive
};
mServer.Open(""192.168.1.128"", 9120,50);
在相关事件定义了服务端的编码,还有客户端接入和退出的一些相关事件。在客户端接入事件中还分别定义了一个数据接收事件。
MessageReceive事件:
if (e.Message is Chats.Services.Login)
{
Chats.Services.Login login = (Chats.Services.Login)e.Message;
if (mClients.FindIndex(item => { return item.Name == login.UserName; }) >= 0)
{
e.Client.Send(new Chats.Services.Failure{ Error=""用户已经存在!"", ID= e.Message.ID});
e.Client.Dispose();
}
else{
e.Client【""Logined""】 =login.UserName;
e.Client.Name = login.UserName;
//代码效果参考:https://v.youku.com/v_show/id_XNjQwNjg0MzE0NA==.html
e.Client.Send(new Chats.Services.Success { ID= e.Message.ID});}
}
else
{
"