封裝好的socket,拿去用


  年終有空咯,分享一下自己封裝的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

dll下載地址:http://download.csdn.net/detail/fenglove123/9424665


免責聲明!

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



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