一個簡單 小型的C#Socket網(wǎng)絡(luò)通信庫 聊天室示例(二)

接下來 先講講服務(wù)端的吧

代碼部分解析

這里兩個類都要引用 KGSocket dll的

1.ChatNetData 建立一個 客戶端 服務(wù)端共用的數(shù)據(jù) 類庫 因為要互相傳的所以肯定要統(tǒng)一

目標(biāo)框架要選擇這個Unity 3.5 .net Subset Base Class Libraries
1.png

導(dǎo)出的dll Unity 才能用

新建的類庫選這個
2.png

里面就是一些數(shù)據(jù)結(jié)構(gòu)了
網(wǎng)絡(luò)消息自定義類 要繼承KGNetData 打上Serializable 序列化標(biāo)簽
枚舉那些因為沒辦法序列化所以用Int的代替然后接收到再強轉(zhuǎn)回來

using KGSocket;
using System;

namespace ChatNetData
{
    [Serializable]
    public class ChatDatas:KGNetData
    {
        public byte[] HeadData;

        public string PlayerName;

        public SendChat Chatdata;
    }
}
namespace ChatNetData
{

    public enum CMD
    {
        None,
        ReqLogin,
        ReqChatInfo,

        RspLogin,
        RspChatInfo,

    }
}
namespace ChatNetData
{
    public enum ErrorInfo
    {
        None,
        NameRepeatsErr,//名字重復(fù)登錄錯誤指令
    }
}
using System;

namespace ChatNetData
{
    [Serializable]
    public  class SendChat
    {
        public string chat;
        public int Islocal;
    }
}

2.ChatDatasPack 用于分辨數(shù)據(jù)是哪個客戶端發(fā)定的數(shù)據(jù)類型**

using ChatNetData;

namespace ChatServer
{
    public class ChatDatasPack
    {
        public ChatSession chatSession;

        public ChatDatas chatDatas;

    }
}
using ChatNetData;

namespace ChatServer
{
    public class ChatDatasPack
    {
        public ChatSession chatSession;

        public ChatDatas chatDatas;

    }
}

3.ChatSessio 每個客戶端的通信都是他來操作**

要繼承KGNetSession<ChatDatas> ChatDatas就是自己定義繼承KGNetData的數(shù)據(jù)類

這里主要的就是 OnDisRecive 斷開回調(diào) ,OnReciveData接收到數(shù)據(jù)回調(diào) OnStartRecive 連接成功回調(diào)

OnReciveData(ChatDatas data) 接收到數(shù)據(jù)會 new一個ChatDatasPack 賦值 添加到ChatServe的任務(wù)隊列 排序處理

using KGSocket;
using ChatNetData;

namespace ChatServer
{
    public class ChatSession : KGNetSession<ChatDatas>
    {

        public int SessionID = 0;
public string PlayerName;//緩存用戶的名字public byte[] HeadData;//緩存用戶的頭像圖片數(shù)據(jù)

        protected override void OnDisRecive()
        {
            ("名字:" + PlayerName + "已下線").KLog();

        }
        protected override void OnReciveData(ChatDatas data)
        {
            ("收到名字:" + data.PlayerName + "的請求"+(CMD)data.Cmd).KLog();
            ChatServe.Instance.AddDataPackQue(this,data);
        }

        protected override void OnStartRecive()
        {
            SessionID = ChatServe.Instance.GetSessionID();
            ("ID:" + SessionID + "已連接").KLog();

        }
    }
}

4.ChatServe 這個就是創(chuàng)建服務(wù)器socket的了 緩存客戶端 處理接收各個客戶端信息返回的業(yè)務(wù)邏輯

要繼承KGSocketServe<ChatSession, ChatDatas>

這里AddDataPackQue 就是添加接收到的消息任務(wù)隊列的,會用到一個線程鎖堡称,
lock 這里簡單說一下 作用是被lock的對象撒会,里面的語句塊 一次只被一個線程使用 如果在使用中的 其他線程就會排隊等待執(zhí)行完再輪到下一個 不會出現(xiàn)一窩蜂調(diào)用 順序錯亂情況
添加完后 在Update() 這里進行出列調(diào)用 主線程那邊就可以直接一直調(diào)用Update一直刷新有沒有新的任務(wù)隊列就好
然后DisposePack這里就是處理從客戶端接收到的數(shù)據(jù)了 判斷指令調(diào)用對應(yīng)業(yè)務(wù)邏輯

using System.Linq;

using KGSocket;
using ChatNetData;

namespace ChatServer
{
    public class ChatServe : KGSocketServe<ChatSession, ChatDatas>
    {
        private static ChatServe instance;
        public static ChatServe Instance
        {
            get
            {
                if (instance == null)
                {
                    instance = new ChatServe();
                }
                return instance;
            }
            set => instance = value;
        }

        public static readonly object obj = "lock";

        public Queue<ChatDatasPack> DataPackQue = new Queue<ChatDatasPack>();

        #region 緩存
        private int SessionID = 0;

        public int GetSessionID()
        {
            if (SessionID == int.MaxValue)
            {
                SessionID = 0;
            }
            return SessionID += 1;
        }

        public bool IsUserOnLine(string name)
        {
            return SessionList.Select(v=>v.PlayerName).ToList().Contains(name) ;
        }

        #endregion

        public void Update()
        {
            if (DataPackQue.Count>0)
            {
                lock (obj)
                {
                    DisposePack(DataPackQue.Dequeue());
                }
            }
        }

        public void DisposePack(ChatDatasPack pack)
        {
            switch ((CMD)pack.chatDatas.Cmd)
            {
                case CMD.ReqLogin:
                    //判斷在線的名字是否重復(fù)
                    if (IsUserOnLine(pack.chatDatas.PlayerName))
                    {
                        pack.chatDatas.Err = (int)ErrorInfo.NameRepeatsErr;
                    }
                    else
                    {
                        pack.chatSession.PlayerName = pack.chatDatas.PlayerName;
                        pack.chatSession.HeadData = pack.chatDatas.HeadData;
                        pack.chatDatas.Cmd = (int)CMD.RspLogin;

                    }

                    pack.chatSession.SendData(pack.chatDatas);

                    break;
                case CMD.ReqChatInfo:
                    pack.chatDatas.Cmd = (int)CMD.RspChatInfo;
                    pack.chatDatas.HeadData = pack.chatSession.HeadData;
                    pack.chatDatas.PlayerName = pack.chatSession.PlayerName;
                    //發(fā)回給自身聊天
                    pack.chatSession.SendData(pack.chatDatas);
                    //改成對方
                    pack.chatDatas.Chatdata.Islocal = 1;
                    //分發(fā)到各個客戶端 聊天消息
                    SessionList.Where(v=>v!=pack.chatSession).ToList().ForEach(v=> 
                    {
                        v.SendData(pack.chatDatas);
                    });
                    break;
            }
        }
        public void AddDataPackQue(ChatSession session, ChatDatas chatData)
        {
            lock (obj)
            {
                DataPackQue.Enqueue(new ChatDatasPack { chatSession = session, chatDatas = chatData });
            }
        }

    }
}

https://github.com/LKaiGuo/KGScriptGenerator 喜歡的給我點個星星啊
u3d萌新QQ群844087555 歡迎進來灌水=器躏。=

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末波俄,一起剝皮案震驚了整個濱河市侥加,隨后出現(xiàn)的幾起案子褒傅,更是在濱河造成了極大的恐慌弃锐,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件殿托,死亡現(xiàn)場離奇詭異霹菊,居然都是意外死亡,警方通過查閱死者的電腦和手機碌尔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門浇辜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人唾戚,你說我怎么就攤上這事柳洋。” “怎么了叹坦?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵熊镣,是天一觀的道長。 經(jīng)常有香客問我募书,道長绪囱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任莹捡,我火速辦了婚禮鬼吵,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘篮赢。我一直安慰自己齿椅,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布启泣。 她就那樣靜靜地躺著涣脚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪寥茫。 梳的紋絲不亂的頭發(fā)上遣蚀,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天,我揣著相機與錄音,去河邊找鬼芭梯。 笑死险耀,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的玖喘。 我是一名探鬼主播胰耗,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼芒涡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起卖漫,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤费尽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后羊始,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體旱幼,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年突委,在試婚紗的時候發(fā)現(xiàn)自己被綠了柏卤。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡匀油,死狀恐怖缘缚,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情敌蚜,我是刑警寧澤桥滨,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站弛车,受9級特大地震影響齐媒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜纷跛,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一喻括、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧贫奠,春花似錦唬血、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至浩姥,卻和暖如春挑随,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背勒叠。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工兜挨, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留膏孟,地道東北人。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓拌汇,卻偏偏與公主長得像柒桑,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子噪舀,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內(nèi)容