我的第一個Socket程序-SuperSocket使用入門(二)


操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操

辛辛苦苦寫那么久的博客,最后手賤點了全屏富文本編輯器找上傳附件的按鈕,結果整個頁面都卡死了,只能關掉再打開看自動保存的,尼瑪的,就一個div顯示內容,都找不到按鈕來還原,麻痹麻痹麻痹麻痹麻痹,這惡心的IE,沒心情寫了,后面的是手動F12從dom中拷出來的代碼,最后直接發個百度網盤的連接吧,這個富文本編輯器都沒看到上傳附件的按鈕

接下來看下線程里的操作:

/// <summary> /// 異步線程發送信息 /// </summary> public class ThreadSendMsg { public void DoWork() { while (true) { try { List<MsgEntity> list = GlobalWeChatMsgList.GetList(); for (int i = 0; i < list.Count; i++) { var session = list[i].session; if (session != null) { var session_client = session.AppServer.GetAllSessions(); var client = session_client.Where(c => c.SN == list[i].sn); if (client != null) { foreach (var item in client) { item.Send(list[i].msg + " " + list[i].guid.ToString() + " " + list[i].open_id + "$"); } } } } } catch (Exception ex) { LogHelper.WriteLog("線程循環出錯:" + ex.Message + "------------" + DateTime.Now.ToString()); } //線程睡眠1秒 System.Threading.Thread.Sleep(2000); } } }

上面有一句:if (client != null)  ,這里從所有的session查找sn=列表中的那個,並判斷這個連接是否還在線,如果在則發送,不在則消息還存在待發送的列表中 上面我們向安卓客戶端發出去了消息,什么時候我們來把這條消息從待發送列表中刪掉呢?不然安卓客戶端就會不停的收到這條消息,這就需要安卓客戶端主動告訴我們已經收到了這條消息我們新加一個命令:

/// <summary> /// 客戶端來這里確認收到消息 /// </summary> public class IGET : CommandBase<WeChatSession, StringRequestInfo> { public override void ExecuteCommand(WeChatSession session, StringRequestInfo requestInfo) { if (requestInfo.Parameters.Count() != 1) { session.Send("error parameters\r\n"); return; } string key = requestInfo.Parameters[0]; if (string.IsNullOrWhiteSpace(key)) { session.Send("guid is null\r\n"); return; } if (key.Substring(key.Length - 1, 1) != "$") { session.Send("error guid\r\n"); return; } try { Guid guid = new Guid(key.Substring(0, key.Length - 1)); GlobalWeChatMsgList.RemoveMsg(guid); session.Send("success\r\n"); } catch { session.Send("not validate guid\r\n"); } } }

基本功能這里都已經好了,還有一個是客戶端連接的心跳,客戶端怎么知道當前與socket服務器連接正常?所以再加一個命令處理類:

 public class XT : CommandBase<WeChatSession, StringRequestInfo> { public override void ExecuteCommand(WeChatSession session, StringRequestInfo requestInfo) { if (requestInfo.Parameters.Count() == 1) { if (requestInfo.Parameters[0] == "&") { if (!session.isLogin|| string.IsNullOrWhiteSpace(session.SN)) session.Send("no check\r\n"); else session.Send("$\r\n"); } } } }

這個心跳的消息通訊很簡單,他發一個&字符,服務器響應一個$符號,這里再重申一下,服務器與客戶端的通訊信息結尾都是以\r\n結束。

---------------------------------------------------------------------------------- End ---------------------------------------------------------------------------------------------------------

源碼:http://pan.baidu.com/s/1bntsF3x

又看了一下僅剩的博客,媽蛋的,丟了一大半,這篇已經沒法看了,直接下源碼看吧,操操操操操操操操操操操操操

 

 

 


 

                                  2016-06-06更新

  今天閑來無事,又看了一下SuperSocket,本來想把這篇殘缺的博客補一補,但是官方文檔已經寫的那么詳細了,我覺得就沒必要再贅述了,就這樣吧


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM