要偵測伺服器是否掛點,可以用 .NET 的 TcpClient 嘗試連接伺服器的特定 port,這種簡單的方法不僅可以用在 Web 伺服器,也可以用於資料庫伺服器(例如:嘗試連接 Oracle 伺服器的 1521 port)。
一旦發現伺服器無法正常運作,程式可以發送 mail 通知系統管理員,可是系統管理員不見得會經常收信,這樣的時效性就不夠快。現在 MSN messenger 已經很普遍,如果發現系統出問題時,能夠發即時訊息給相關人員,似乎是個不錯的辦法。
這裡我用來發送 MSN 即時訊息的元件是 MSNPSharp。這個元件有附一個 Windows Forms 範例程式可以參考,此範例就像一個陽春型的 MSN Messenger,可以讓你登入 MSN 伺服器、發送訊息給聯絡人等等。
仔細研究這個範例程式,大概就可以瞭解 MSNPSharp 的基本用法,同時也可以發現,此元件大量運用了非同步處理的程式撰寫模型。這種非同步的撰寫方式不僅增加了學習門檻,除錯也比較麻煩,更重要的是,這並不是我想要的。
我的需求很簡單:當程式需要發送 MSN 訊息時,就先登入 MSN 伺服器,然後依事先設定的聯絡人逐一發送文字訊息。訊息發送的對象有可能是離線狀態,這沒關係,繼續發送給下一位聯絡人即可。
針對上述需求,我寫了一個簡單的 wrapper 類別:SimpleMsnMessenger。這裡我不打算詳細說明原理,謹列出幾個重點步驟:
- 建立 Messenger 物件 => messenger。
- 利用 messenger.Connect() 登入伺服器。
關鍵事件:messenger.Nameserver.SignedIn - 利用 messenger.CreateConversation() 建立 Conversation 物件 => conversation。
關鍵事件:messenger.ConversationCreated - 利用 conversation.Invite(("someone@hotmail", ClientType.PassportMember); 邀請對方加入對話。
關鍵事件:conversation.Switchboard.ContactJoined (已成功邀請對方加入對話) - 利用 conversation.SwitchBoard.SendTextMessage() 發送文字訊息。
SimpleMsnMessenger 的完整程式碼可按此連結下載。Note: 此程式碼還有許多改進空間,尤其是錯誤處理的部分,但基本上還堪用。
以下是使用此 wrapper class 的範例:
class ServerAliveChecker
{
private SimpleMsnMessenger msn = new SimpleMsnMessenger("robot@hotmail.com", "password");
private void SendMsn(StringBuilder text)
{
string receivers = ConfigurationManager.AppSettings["ReceiverMsn"];
if (String.IsNullOrEmpty(receivers))
{
return;
}
lblStat.Text = "正在傳送 MSN 訊息...";
Application.DoEvents();
string[] msnMail = receivers.Split(';');
try
{
msn.Connect();
// 等待登入動作完成。
while (msn.IsConnecting && msn.ErrorCount <= 0)
{
Application.DoEvents();
}
if (msn.Connected && msn.SignedIn)
{
// 登入成功
foreach (string mail in msnMail)
{
msn.SendTextMessage(mail, text.ToString());
}
// 等待訊息全部發完,但只等待一段時間。
DateTime now = DateTime.Now;
while (!msn.MessageQueueEmpty)
{
Application.DoEvents();
System.Threading.Thread.Sleep(500);
TimeSpan ts = DateTime.Now.Subtract(now);
if (ts.Minutes >= 3)
{
break;
}
}
msn.Disconnect();
}
else
{
string err = "MSN Messenger 登入失敗";
if (msn.ErrorCount > 0)
{
LogError(err + ": " + msn.LastError.Message);
}
else
{
LogError(err + "。" + msn.LastError.Message);
}
return;
}
}
catch (Exception ex)
{
LogError(ex.ToString());
}
}
}
按此連結下載完整的類別與範例原始碼
請問可以提供完整的source code嗎?
回覆刪除thx
我把整個範例程式(包含元件)包成 zip 檔放在網路硬碟上了。超連結請看內文。
回覆刪除感謝!
回覆刪除您這篇文章對我很有幫助
目前小弟在研究source 中
請問一下現在還可以用嗎?
回覆刪除似乎沒辦法登入><
到目前為止,程式都還正常運作喔!
回覆刪除請問要怎樣能在登入後
回覆刪除抓到我MSN上的暱稱或是狀態之類的
有甚麼指令能抓ㄇ???
在上方的範例中有用到
回覆刪除msn.MessageQueueEmpty
但在 SimpleMsnMessenger 卻沒有 MessageQueueEmpty 的public 可以使用
不知是哪出了問題
啊! 抱歉,SimpleMsnMessenger 少了一個 MessageQueueEmpty 屬性的定義。我已經把更正的版本放上去,您可重新下載,或自行加上這段程式碼:
回覆刪除public bool MessageQueueEmpty
{
get
{
return (msgQueue.Count == 0);
}
}
您好:
回覆刪除看到您的文章您真的非常厲害
請問可以寄給我完整的source code嗎?
現在我們很需要您的source code
以下是我的信箱也是我的MSN
jay1393@yahoo.com.tw
也希望可以跟您換個MSN有些相關問題想跟您請教.也可以交個朋友.
非常感謝您!
文章裡面有提供完整 source code 的下載連結喔!
回覆刪除忘了說....我對 MSNPSharp 的研究,其實也就僅止於這篇文章裡面的程式碼,因為目前我所需要的也就只是簡單的發訊息功能而已。若要了解更完整的用法,還是建議大家研究一下 MSNPSharp 附的範例程式喔。
回覆刪除因為我現在所需要的就是要讓我的專題題目OPENNMS能夠在網段出現問題的時候,發送訊息給管理者,裡面是有內建發送MAIL的功能,但是我現在需要讓他能夠發送MSN訊息告知網路哪邊出了問題,以便達到更即時的通知,而在網站查資料以後發現你所用的東西與我所需要的有類似之處,而小弟我對JAVA懂得實在不深,還想請你不嗇給予指導.
回覆刪除這是 C#,不是 Java 喔!
回覆刪除想請問這程式碼使用在vs2010中,是否也可以正常運作呢?我使用時stat一值停在"登入中..."
回覆刪除想問是不是哪邊有出了甚麼問題呢
Hi Ben,
回覆刪除這個範例程式似乎已經不能運作了。就像你說的,登入時會一直停留在嘗試登入的狀態。
我試過官網新版的範例程式是 OK 的,可以參考看看:
http://code.google.com/p/msnp-sharp/downloads/detail?name=MSNPSharp_504_RELEASE.zip
好的~我試試看~謝謝^^
回覆刪除MSNPSharp 5.04的好多方法都不一樣了,就單純發訊息通知某些人這件事情來說,寫法變得簡單了。
回覆刪除嗯。昨晚還試了一下連結新版 DLL,重新編譯這個範例程式時,一堆錯誤。也難怪啦,這個範例是三年多前寫的,一直沒動,而 MSNPSharp 一直都有在繼續發展。
回覆刪除YA! 有除錯完成要分享喔!
回覆刪除好滴好滴 :)
回覆刪除