在网页里实现在线发送msn消息

我那天说插件后,一个朋友为我怎么实现在网页里发送msn消息,他说他下载了dotmsn,可是在网页里没有用,最坏的时候还死机.今天就来说下具体实现.具体的效果请看
http://www.faydu.net/msn.aspx
Microsoft公布了msn的api,那么这个api到底是什么呢?其实这个api是微软的一系列软件开发接口,你利用他可以实现的有,建设一个msn搜索引擎,建设一个msn程序等,msn messenger的api其实没想象的那么复杂,简单的说来是个协议的解释,本质上就是用一个socket与远程的msn服务器通讯,这样的程序你肯定可以写出来,msn messenger的api就是告诉你你发送什么消息到服务器可以得到什么样的信息,以及服务器的消息代表什么意思.
比如 "ver port 20\r\n"改变端口等.
知道这些你还要知道已经有人帮你写好了相对与该协议,的程序接口,你只要调用就可以,主要有两个,dotmsn和jmsn,DOTMSN是一个丹麦人写的,全部是c#,最新的版本是用兵Net framework2.0,这点要注意;还有一个jmsn,是一个韩国人编写的,这两个都是源代码的,可以在sourceforge上找到.
dotmsn为什么在网页下用不起来呢?只要是有个矛盾在里面,网页一次POSTBACK后,原来的msn对象就失去了连接,而你再做动作,由于连接的不在,所以自然错了,并且你应主要到他的SynchronizeList方法必须等待SynchronizationCompleted事件的执行完毕,这是个异步的过程,而page是自顶向下的,所以出现了难点.
具体做法:
我们把dotmsn封装,这样一来我们在自身的对象里完成异步和事件出发,而网页不出现postback,这样就可以了





using System;
using DotMSN;
using System.Text; 
using System.Threading; 
using System.Collections; 
namespace AspdotnetMSN
{
    /// <summary>
    /// Class1 的摘要说明。
    /// </summary>
    public class Msn
    {
        private Messenger messenger;
        private string vuser;
        private string vpwd;
        private ArrayList m_msglist=new ArrayList(); 
        private string _tempmsg;
        private ArrayList  m_ForwardList=new ArrayList() ;
        private ArrayList  m_ReverseList=new ArrayList();
        private ArrayList  m_BlockedList=new ArrayList();
        private ArrayList  m_AllowedList=new ArrayList();
        private ArrayList  m_Allist=new ArrayList();
        private System.Threading.ManualResetEvent avr; 
        public string Log;
        public Msn(string user,string pwd )
        {
            //
            // TODO: 在此处添加构造函数逻辑
            //
        vuser=user;
        vpwd=pwd;
        avr=new ManualResetEvent(false); 
        messenger = new Messenger();
        _tempmsg=string.Format("你好,我是{0},需要帮助吗?","Mandy"); 
        }
        public string Contact
        {
            get
            {
            return Log;
            }
            set
            {
            Log=value;
            }
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="operation">操作码,1=发送消息;2=与某人对话</param>
        /// <returns></returns>
        public bool Connect()
        {                        
            
            try
            {                
                // make sure we don't use the default settings, since they're invalid
                if(vuser == "")
                    return false;
                else
                {   avr.Reset(); 
                    messenger.ConversationCreated += new Messenger.ConversationCreatedHandler(ConversationCreated);
                    messenger.SynchronizationCompleted += new Messenger.SynchronizationCompletedHandler(OnSynchronizationCompleted);
                    messenger.Connect(vuser, vpwd);
                    if(messenger.Connected )
                    {
                    ;
                    }
                        
                    messenger.SynchronizeList();
                    avr.WaitOne(); 
                    return true;                
  
                }
            }
            catch(MSNException e)
            {
                // in case of an error, report this to the user (or developer)
                return false;    
                
            }            

        }

        private void ConversationCreated(Messenger sender, ConversationEventArgs e)

        {        
            e.Conversation.ContactJoin += new Conversation.ContactJoinHandler(ContactJoined); 
            e.Conversation.MessageReceived += new Conversation.MessageReceivedHandler(MessageReceived);
            
        }

        private void MessageReceived(Conversation sender, MessageEventArgs e)

        {
            
            string msg_rcv = e.Message.Text;
            msg_rcv = e.Message.Text.Replace("\0", "");
            m_msglist.Add(string.Format("{0}:{1}\r\n{2}",e.Sender.Name,msg_rcv ,DateTime.Now.ToLongTimeString() )   ) ;

        }

        private void ContactJoined(Conversation sender, ContactEventArgs e)
        {
            sender.SendMessage(_tempmsg);
        }

        private void OnSynchronizationCompleted(Messenger sender, EventArgs e)
        {
            // first show all people who are on our forwardlist. This is the 'main' contactlist
            // a normal person would see when logging in.
            // if you want to get all 'online' people enumerate trough this list and extract
            // all contacts with the right DotMSN.MSNStatus  (eg online/away/busy)
            


            foreach(Contact contact in messenger.GetListEnumerator(MSNList.ForwardList))
            {                    
                m_ForwardList.Add(new MyContact(contact.Name,contact.Mail,contact.Status.ToString()    ) ) ;
            }

            // now get the reverse list. This list shows all people who have you on their
            // contactlist.
            foreach(Contact contact in messenger.ReverseList)
            {
                m_ReverseList.Add(new MyContact(contact.Name,contact.Mail,contact.Status.ToString()    ) ) ;
            }

            // we follow with the blocked list. this shows all the people who are blocked
            // by you
            foreach(Contact contact in messenger.BlockedList)
            {
                m_BlockedList.Add(new MyContact(contact.Name,contact.Mail,contact.Status.ToString()    ) ) ;
            }

            // when the privacy of the client is set to MSNPrivacy.NoneButAllowed then only
            // the contacts on the allowedlist are able to see your status
            foreach(Contact contact in messenger.AllowedList)
            {
                m_AllowedList.Add(new MyContact(contact.Name,contact.Mail,contact.Status.ToString()    ) ) ;
            }

            // now set our initial status !
            // we must set an initial status otherwise 
            messenger.SetStatus(MSNStatus.Online);                    
            avr.Set();
        }

        public    ArrayList MyForwardList
        {
          get
          {
          return m_ForwardList;
          }
        }
        public    ArrayList MyReverseList
        {
            get
            {
                return m_ReverseList;
            }
        }
        public    ArrayList MyBlockedList
        {
            get
            {
                return m_BlockedList;
            }
        }
        public ArrayList MyAllowedList
        {
            get
            {
                return m_AllowedList;
            }
        }
        public ArrayList MyAllList
        {
            get
            {
                return m_Allist;
            }
        }
        private void Conversation(MyContact cu)
        {
        messenger.RequestConversation(cu.Email);
        }
        private void Conversation(string  email)
        {
            messenger.RequestConversation(email);
        }

        public void SendMsg(MyContact cu,string msg)
        {
        this._tempmsg=msg; 
        Conversation(cu);
        }
        public void SendMsg(string cu,string msg)
        {
            this._tempmsg=msg; 
            Conversation(cu);
        }
        public void    Quit()
        {
            if(messenger.Connected )            
            messenger.CloseConnection(); 
            
        }

        public ArrayList GetMsg()
        {
        return     m_msglist ;
        }

        public void AddContact(string email)
        {
            this.messenger.AddContact(email);  
         
        }
    }

    public class    MyContact
    {
    string muser;
    string memail;
    string mstatus;
    
        public    MyContact(string u,string e,string st)
        {
        muser=u;
        memail=e;
        mstatus=st;
        }
        public string UserName
        {
            get
            {
            return muser;
            }
            set
            {
            muser=value;
            }
        }

        public string Email
        {
            get
            {
                return memail;
            }
            set
            {
                memail=value;
            }
        }

        public string Status
        {
            get
            {
                return mstatus;
            }
            set
            {
                mstatus=value;
            }
        }

    }
    

}
将其编译,然后调用.
<script language="vb" runat="server">
Private Sub sendmsg(ByVal sender As Object, ByVal e As EventArgs)
try 
     Dim i As AspdotnetMSN.Msn = New AspdotnetMSN.Msn(user.text, pwd.text)
       i.Connect()
       i.SendMsg(rec.text,words.text)
        catch ex as exception
        end try
    End Sub
    
    Private Sub listcontact(ByVal sender As Object, ByVal e As EventArgs) 
    try
      contactlister.Text=""
       Dim i As AspdotnetMSN.Msn = New AspdotnetMSN.Msn(user.text, pwd.text)
        i.Connect()
        Dim m As Object
        For Each m In i.MyForwardList
      contactlister.Text+=String.Format("{0}<br>", CType(m, MyContact).UserName)
        Next
         catch ex as exception
        end try
    End Sub
    
     Private Sub getmsg(ByVal sender As Object, ByVal e As EventArgs) 
     try
      ml.Text=""
       Dim i As AspdotnetMSN.Msn = New AspdotnetMSN.Msn(user.text, pwd.text)
        i.Connect()
        Dim m As Object
        For Each m In i.GetMsg
      ml.Text+=String.Format("{0}<br>", cstr(m))
        Next
        catch ex as exception
        end try
    End Sub
    
    
    
        </script>
具体用到产品里面请结合数据库,最好用上Ajax,特别是接受消息的时候

原文地址:https://www.cnblogs.com/cclinux/p/567443.html