• 在网页里实现在线发送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,特别是接受消息的时候

  • 相关阅读:
    Java语法总结 线程
    Java多线程编程总结
    eclipse插件开发
    Java私塾的一些基础练习题(一)
    反射练习
    内部类实现动态链表(增,删,查,打印)
    oracle 存储过程第四天
    java 面向对象个人理解
    jsp的flash小例子
    oralcle 存储过程批处理
  • 原文地址:https://www.cnblogs.com/cclinux/p/567443.html
Copyright © 2020-2023  润新知