程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> DotMSN機器人自動掉線的問題

DotMSN機器人自動掉線的問題

編輯:關於.NET

使用DotMSN來開發MSN機器人,機器人在一段時間裡如果沒有接收到任何會話請求時,經常會自動斷線 。而且這個連接斷線是沒有響應任何事件的,而且Connected是True,Owner.Status也是正常的,這不得 不讓人頭痛啊。

經過查閱一些資料,發現只要定時向MSN服務器發送Ping命令,以保持客戶端與服務器的連接,即可解 決這個問題。但是問題是DotMSN裡提到的SendPing()方法它並沒有提供啊!?可以查找到MSNP協議裡頭, 發送Ping命令是通過PNG\r\n。但是如何來發送是一個問題了。

最初的想法是構建一個NSMessage對象,由NameserverProcessor.SendMessage方法來發送。使用代碼 如下:

1: void SendPing()
2: {
3: NSMessage message = new NSMessage("PNG\r\n", new string[] { });
4: messenger.NameserverProcessor.SendMessage(message);
5: }

但是每當我發送一個Ping命令後,雖然PingAnswer事件會被觸發,也就是服務器有響應了,Ping命令 發送成功。但是同時我的登錄也會被服務器踢出,SignedOff事件被觸發了。在仔細查閱了NSMessage信息 對象的定義後發現,這個對象構建的發送字節除了命令本身還會有空格,TransactionID,還有參數,最 後才會加上\r\n。而Ping命令本身是不需要任何參數的,整個命令就只有PNG\r\n。解決辦法是不是可以 構建一個專門的PingMessage對象來表示Ping命令,這個對象很簡單:

1: public class PingMessage : XihSolutions.DotMSN.Core.NSMessage
2: {
3: public override byte[] GetBytes()
4: {
5: return System.Text.Encoding.UTF8.GetBytes("PNG\r\n");
6: }
7: }

重新修改一下SendPing方法:

1: void SendPing()
2: {
3: messenger.NameserverProcessor.SendMessage(new PingMessage());
4: }

登錄後,發送一個Ping命令試試,PingAnswer事件觸發了,用戶不會被踢出了。這表示Ping命令發送 成功了。接下來所要做的就是創建一個Timer對象,由Timer對象來控制定時向服務器發送Ping命令,以保 證機器人客戶端正與服務器保持連接。

注意,目前我的測試是在之前連接斷開間隔時間內,甚至更長一些,機器人始終保持連接。不保證全 天候都能保持連接,但是其它的斷開原因可能需要不同的處理方法。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved