最近写一个预警系统,想通过msn来实现,也就是我的服务器是自己写的程序,客户端自己上msn,用dotmsn1.2的已经写完了,但发现dotmsn1.2的有很多bug,我在程序中都捕捉不到,我昏,程序直接挂掉,后来找到dotmsn2.0,虽然开源,但很多地方有变动,主要是发消息时经常的不成功(我自己写的发消息一次都没有成功),包括它自己的demo都有问题,所以我想问一下各位兄台,有没有做过dotmsn2.0写过的?网上都是1.2的那个版本,基本没有2.0的。附上我现在写的using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using XihSolutions.DotMSN ;
using XihSolutions.DotMSN.Core;
using XihSolutions.DotMSN.DataTransfer;namespace MSNClient
{
    public partial class Form1 : Form
    {
        //private 
        XihSolutions.DotMSN.Messenger messenger = new Messenger();
        string sStuta;
        private Conversation conversation;
        public Form1()
        {
            
            InitializeComponent();
            
            messenger.Credentials.ClientID = "[email protected]";
            messenger.Credentials.ClientCode = "Q1P7W2E4J9R8U3S5";
            messenger.NameserverProcessor.ConnectionEstablished += new EventHandler(NameserverProcessor_ConnectionEstablished);
            messenger.Nameserver.SignedIn += new EventHandler(Nameserver_SignedIn);
            messenger.Nameserver.SignedOff += new SignedOffEventHandler(Nameserver_SignedOff);
            messenger.NameserverProcessor.ConnectingException += new ProcessorExceptionEventHandler(NameserverProcessor_ConnectingException);
            messenger.Nameserver.ExceptionOccurred += new HandlerExceptionEventHandler(Nameserver_ExceptionOccurred);
            messenger.Nameserver.AuthenticationError += new HandlerExceptionEventHandler(Nameserver_AuthenticationError);
            messenger.Nameserver.ServerErrorReceived += new ErrorReceivedEventHandler(Nameserver_ServerErrorReceived);
            messenger.ConversationCreated += new ConversationCreatedEventHandler(messenger_ConversationCreated);
            messenger.TransferInvitationReceived += new MSNSLPInvitationReceivedEventHandler(messenger_TransferInvitationReceived);
            messenger.Nameserver.ContactOnline += new ContactChangedEventHandler(Nameserver_ContactOnline);
            messenger.Nameserver.ContactOffline += new ContactChangedEventHandler(Nameserver_ContactOffline);
        }        void Nameserver_ContactOffline(object sender, ContactEventArgs e)
        {
            MethodInvoker mi = new MethodInvoker(UpdateContactlist);
            this.BeginInvoke(mi);
        }        void Nameserver_ContactOnline(object sender, ContactEventArgs e)
        {
            MethodInvoker mi = new MethodInvoker(UpdateContactlist);
            this.BeginInvoke(mi);        }        private void SetStatus()
        {
            statusBar1.Text = sStuta;
        }
        private void SetStatus(string status)
        {
            sStuta =status ;
            MethodInvoker mi = new MethodInvoker(SetStatus);
            this.BeginInvoke (mi);
        }        private void button1_Click(object sender, EventArgs e)
        {
            if (messenger.Connected)
            {
                SetStatus("从服务器断开");
                messenger.Disconnect();
            }
            messenger.Credentials.Account = user.Text;
            messenger.Credentials.Password = pwd.Text;
            ContactListView.Items.Clear();
            SetStatus("正在连接服务器......");
            messenger.Connect();
        }
        private void NameserverProcessor_ConnectionEstablished(object sender, EventArgs e)
        {
            SetStatus("已经连接上服务器,正在下载信息...");
        }        private void Nameserver_SignedIn(object sender, EventArgs e)
        {
            SetStatus("成功登陆: " + messenger.Owner.Name);            messenger.Owner.Status = PresenceStatus.Online;            MethodInvoker mi= new MethodInvoker(UpdateContactlist);
            this.BeginInvoke(mi);
        }
        private void Switchboard_TextMessageReceived(object sender, TextMessageEventArgs e)
        {
            conversation.Invite(e.Sender.Mail );
            if (conversation.SwitchboardProcessor.Connected == false)
            {
                conversation.Messenger.Nameserver.RequestSwitchboard(conversation.Switchboard, this);
            }            TextMessage messages = new TextMessage("欢迎加入");
            conversation.Switchboard.SendTextMessage(messages);
        }

解决方案 »

  1.   

    private void Switchboard_SessionClosed(object sender, EventArgs e)
            {
                //status = 1;
            }        private void Switchboard_ContactJoined(object sender, ContactEventArgs e)
            {
                //status = 2;
            }        private void Switchboard_ContactLeft(object sender, ContactEventArgs e)
            {
                //status = 1;
            }         private void Nameserver_SignedOff(object sender, SignedOffEventArgs e)
            {
                SetStatus("已经断开");
                ContactListView.Items.Clear();
            }        private void Nameserver_ExceptionOccurred(object sender, ExceptionEventArgs e)
            {
                if (e.Exception is UnauthorizedException)
                    return;            MessageBox.Show(e.Exception.ToString(), "Nameserver exception");
            }        private void NameserverProcessor_ConnectingException(object sender, ExceptionEventArgs e)
            {
                MessageBox.Show(e.Exception.ToString(), "Connecting exception");
                SetStatus("Connecting failed");
            }        private void Nameserver_AuthenticationError(object sender, ExceptionEventArgs e)
            {
                MessageBox.Show("Authentication failed, check your account or password.", "Authentication failed");
                SetStatus("Authentication failed");
            }
            private void Nameserver_ServerErrorReceived(object sender, MSNErrorEventArgs e)
            {
                MessageBox.Show(e.MSNError.ToString(), "Server error received");
                SetStatus("Server error received");
            }
            private void messenger_ConversationCreated(object sender, ConversationCreatedEventArgs e)
            {
            }
            private void messenger_TransferInvitationReceived(object sender, MSNSLPInvitationEventArgs e)
            {
            }
            private void UpdateContactlist()
            {
                if (messenger.Connected == false)
                    return;            ContactListView.SuspendLayout();
                ContactListView.Items.Clear();            foreach (Contact contact in messenger.ContactList.Forward)
                {
                    ListViewItem item = new ListViewItem();
                    if (contact.Status != PresenceStatus.Offline)
                    {                    
                        item.Text = contact.Name +"(在线)";
                    }
                    else
                    {
                        item.Text = contact.Name + "(脱机)";
                    }
                    item.Tag = contact;
                    ContactListView.Items.Add(item);            }            ContactListView.ResumeLayout();
            }        private void button3_Click(object sender, EventArgs e)
            {
                {
                    if (messenger.Connected)
                        messenger.Disconnect();
                }
            }        private void button2_Click(object sender, EventArgs e)
            {
                UpdateContactlist();
            }        private void ContactListView_DoubleClick(object sender, EventArgs e)
            {
                if (ContactListView.SelectedItems.Count == 0)
                    return;            Contact selectedContact = (Contact)ContactListView.SelectedItems[0].Tag;
                if (selectedContact != null && selectedContact.Online == true)
                {
                    try
                    {
                        if (conversation == null)
                        {
                            conversation = messenger.CreateConversation();
                            conversation.Switchboard.TextMessageReceived += new TextMessageReceivedEventHandler(Switchboard_TextMessageReceived);
                            conversation.Switchboard.SessionClosed += new SBChangedEventHandler(Switchboard_SessionClosed);
                            conversation.Switchboard.ContactJoined += new ContactChangedEventHandler(Switchboard_ContactJoined);
                            conversation.Switchboard.ContactLeft += new ContactChangedEventHandler(Switchboard_ContactLeft);                        conversation.Invite(selectedContact);
                            if (conversation.SwitchboardProcessor.Connected == false)
                            {
                                conversation.Messenger.Nameserver.RequestSwitchboard(conversation.Switchboard, this);
                            }                        TextMessage messages = new TextMessage("试一下");
                            conversation.Switchboard.SendTextMessage(messages);                    }
                        else
                        {
                            conversation.Invite(selectedContact);
                            if (conversation.SwitchboardProcessor.Connected == false)
                            {
                                conversation.Messenger.Nameserver.RequestSwitchboard(conversation.Switchboard, this);
                            }                        TextMessage messages = new TextMessage("试一下");
                            conversation.Switchboard.SendTextMessage(messages);                    }
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message);
                    }
                }
            }
        }
    }
      

  2.   

    http://www.codeproject.com/csharp/infodotnet.asp
      

  3.   

    调用conversion.Invite(account)之后需要等待账号添加成功,才能发送信息
    成功之后会触发事件conversion.Switchboard.ContactJoined