年終有空咯,分享一下自己封裝的socket類庫. 由於公司寫的socket代碼非常醉人,我不能忍,所以自己封裝了一下方便大家使用,現在有空也分享給園友用用看,現在還存在一定的問題,等下我列出來,希望大家能幫我出一些解決方案,完善這個東東.
直接開講,不廢話了,一共3塊,服務端,客戶端,websocket
一:服務端
ServerListener listener = new ServerListener();
1.構造函數:
2.事件:
//日志,內部的處理日志,主要用來看流程,實際用處不大. listener.Log += listener_Log; //listener_Log(string msg) //客戶端上線 listener.ClientConnected += listener_ClientConnected; //listener_ClientConnected(BaseClient t) //客戶端下線 listener.ClientDisconnect += listener_ClientDisconnect; //listener_ClientDisconnect(BaseClient t) //接收到完整消息 listener.MsgRead += listener_MsgRead; //listener_MsgRead(BaseClient t, byte[] t2)
說明:1.Log中msg參數是執行流程的消息, 2.t是當前客戶端對象, 3.t2完整消息數據
3.方法:
//調用start啟動監聽; listener.Start(); //停止監聽 listener.Stop(); //廣播消息,msg發送的內容, //type發送到客戶端類型,傳null發送到所有類型 //(目前只有socket和websocket2個類型) listener.SendAll(byte[] msg, ClientType? type) //還有一個屬性 //在線客戶端集合 listener.Clients
二:客戶端
Client client = new Client();
1.構造函數:
2.事件
//日志 client.Log += client_Log; //client_Log(BaseClient t, string t2) //斷開連接 client.ClientDisconnect += client_ClientDisconnect; //client_ClientDisconnect(BaseClient t) //連接服務器成功 client.ClientConnected += client_ClientConnected; //client_ClientConnected(BaseClient t,bool state,string msg) //發送完一條消息 client.MsgSend += client_MsgSend; //client_MsgSend(BaseClient t) //接收到完整消息 client.MsgRead += client_MsgRead; //client_MsgRead(BaseClient t, byte[] t2)
3.方法
//啟動連接服務器 client.Start(); //斷開連接 client.Stop(); //發送數據 client.SendData(byte[] data)
4.屬性
/// <summary> /// 自動重連,默認false /// </summary> public bool AutoChonglian { get; set; } /// <summary> /// Id /// </summary> public Guid Id { get; set; } /// <summary> /// 遠程網絡地址 /// </summary> public EndPoint RemoteIp{get;set;} /// <summary> /// 本地網絡地址 /// </summary> public EndPoint LocalIp{get;set;} /// <summary> /// 客戶端類型 /// </summary> public ClientType ClientType { get; private set; } /// <summary> /// 客戶端對象是否為空 /// </summary> public bool ClientIsNull{get;private set;}
三:WebSocket
websocket已經在服務端封裝好了,直接連接就能通訊,這里唯一要講一下的就是send的時候需要注意數據長度不能超過8184,超過分段發,還是給一段js出來 大家自己看把
function addMsg(msg){ $("#msg").append("<p>"+msg+"</p>"); } var websocket = new WebSocket("ws://ip:port/"); websocket.onopen = function onOpen() { addMsg("已連接到服務器"); }; websocket.onclose = function onClose() { addMsg("服務器連接斷開"); }; websocket.onerror = function onError() { addMsg("連接服務器失敗"); } websocket.onmessage = function onMessage(evt) { var data = evt.data; addMsg(data); }; websocket.SendObj = function(obj) { return websocket.Send(obj + "⊙"); }; websocket.sendlen = 8184; //分段發送數據長度不能超過8184 websocket.Send = function (msg) { if (websocket != null && websocket.readyState === websocket.OPEN) { if (msg.length > websocket.sendlen) { var sendcount = Math.ceil(msg.length / websocket.sendlen); for (var i = 0; i < sendcount; i++) { var d = msg.substring(i * websocket.sendlen, websocket.sendlen * (i + 1)); websocket.send(d); } } else { websocket.send(msg); } return true; } else { addMsg("指令發送失敗(與服務器斷開連接)"); return false; } }; websocket.SendObj("發送數據,一般是json字符串,反正隨便你");
現在來說說還需要完整的地方
1.文件傳輸還沒有做.
2.websocket 客戶端發送大數據會有問題, 現在的情況 數據長度小於8184*5 不會有問題, 數據長度大於8184*10會頻繁出現服務器接收數據異常問題, 這里求大神幫忙看看!!!
還有個問題 循環發送大量數據也會出現問題比如 for 20次 sendobj("1")
服務端發送大數據到客戶端沒有問題
完事! 不介意騙點分吧 0.0