现在的位置: 首页 > 综合 > 正文

Smark.Net实现简单聊天程序

2013年03月17日 ⁄ 综合 ⁄ 共 2663字 ⁄ 字号 评论关闭

       最近一直和Asterisk打交道,所以又写起了Socket tcpSmark.Net是基于Socket Tcp封装的组件,主要用途是简化Socket tcp通讯的实现;已经使用它来实现了Asterisk的管理程序和AGI接管程序,以下使用Smark.Net实现一个简单的聊开程序。该程序主要分为两部分,一部分是服务端另一部分就是客户端;信息通过服务端转发到相关客户端。先看下实现的效果图再细讲每端的实现。

 

 

服务端

       定义服务构建监听程序:

private Smark.Net.Server<Smark.Net.Messages.XMLClient<Smark.Net.Messages.XMLMessageAnalyse>> mServer =

new Smark.Net.Server<Smark.Net.Messages.XMLClient<Smark.Net.Messages.XMLMessageAnalyse>>();

       Smark.Net.Server是一个Socket Tcp的服务类,它的泛参描述这个服务是用于那个IClient的实现,XMLClient是一个实现对象,它的泛参是描述这个Client的数据分包实现。

       定义相关事件:

mServer.Coding = Encoding.UTF8;

mServer.ClientDisposed += (o, c) => {

      Invoke(new Action<Smark.Net.IClient>(ClientClose), c.Client);

};

mServer.ClientConnected += (o, c) => {

    Smark.Net.Messages.XMLClient<Smark.Net.Messages.XMLMessageAnalyse> msgclient

        = (Smark.Net.Messages.XMLClient<Smark.Net.Messages.XMLMessageAnalyse>)c.Client;

    msgclient.MessageReceive += MessageReceive;

    msgclient.Receive<Chats.Services.SelectUser>(SelectUser);

    msgclient.Receive<Chats.Services.Say>(Say);

    msgclient.Receive<Chats.Services.Login>(Login);

   };

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;

        e.Client.Send(new Chats.Services.Success { ID= e.Message.ID});

    }

}

else

{

    if (e.Client["Logined"] == null)

        e.Client.Dispose();

}

       在消息总接收事件里,对是否登陆的用户进行处理;如果没有登陆就进行其他消息发送的情况直接把连接关闭。

       SelectUser消息接收:

Chats.Services.ListUsers lu = new Chats.Services.ListUsers();

lu.ID = select.ID;

foreach (Smark.Net.IClient item in GetClients())

{

    lu.Users.Add(item.Name);

}

lu.Send(client);

       当收到SelectUser消息时,把当前的所有连接发送回相关请求客户端。

       Login消息接收:

private void Login(Smark.Net.Messages.IXMLClient client, Chats.Services.Login msg)

{

    Smark.Net.IClient[] clients = GetClients();

 

    foreach (Smark.Net.IClient item in clients)

    {

        if (item != client)

        {

            item.Send(msg);

        }

    }

}

       登陆消息处理主要是告诉其他连接的说你已经登陆。

       Say消息接收:

private void Say(Smark.Net.Messages.IXMLClient client, Chats.Services.Say say)

{

    Smark.Net.IClient[] clients = GetClients();

  

    foreach (Smark.Net.IClient item in clients)

    {

        if (say.To.FindIndex(c => { return c == item.Name; }) >= 0)

        {

            item.Send(say);

        }

    }

}

  根据Say消息的接收人对当前连接进行匹配并发送。

 

客户端

       连接到服务端器并定义相关消息接收事件

mConnection = Smark.Net.Server<Smark.Net.Messages.XMLClient<Smark.Net.Messages.

抱歉!评论已关闭.