最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#開(kāi)源類庫(kù)SimpleTCP使用方法

 更新時(shí)間:2021年09月14日 11:29:08   作者:time-flies  
SimpleTCP內(nèi)部有一個(gè)特殊字符分割字符串的協(xié)議可以直接使用,也可以在DataReceived事件處理程序中實(shí)現(xiàn)自己的協(xié)議,這篇文章主要介紹了C#開(kāi)源類庫(kù)SimpleTCP的使用方法,需要的朋友可以參考下

簡(jiǎn)介

工作中經(jīng)常遇到需要實(shí)現(xiàn)TCP客戶端或服務(wù)端的時(shí)候,如果每次都自己寫(xiě)會(huì)很麻煩且無(wú)聊,使用SuperSocket庫(kù)又太大了。這時(shí)候就可以使用SimpleTCP了,當(dāng)然僅限于C#語(yǔ)言。

SimpleTCP是一個(gè)簡(jiǎn)單且非常有用的 .NET 庫(kù),用于處理啟動(dòng)和使用 TCP 套接字(客戶端和服務(wù)器)的重復(fù)性任務(wù),使用起來(lái)非常方便、代碼也少。它的內(nèi)部不是直接使用的Socket,而是在TcpClient的基礎(chǔ)上進(jìn)行了再次封裝,接口更簡(jiǎn)單、明了。

它的主要特點(diǎn)如下:

  • 源碼簡(jiǎn)單:源碼就幾個(gè)類,每個(gè)類也不大,在了解TcpClient用法的基礎(chǔ)上不需要注釋就可以看懂。
  • 功能單一:不像其它庫(kù)一樣功能繁多,它只專注于實(shí)現(xiàn)簡(jiǎn)單的TCP客戶端、服務(wù)端,使用起來(lái)不用擔(dān)心增加系統(tǒng)的復(fù)雜性。
  • 使用簡(jiǎn)單:后面的示例會(huì)具體講解,啟動(dòng)一個(gè)客戶端或服務(wù)端只需要幾行代碼,想擴(kuò)展功能也很簡(jiǎn)單。

說(shuō)一下它的不足之處(在我看來(lái)完全可以接受):

  • 已停止更新:最后更新時(shí)間是2017年,不過(guò)庫(kù)的功能比較簡(jiǎn)單、單一,也沒(méi)那么多更新的內(nèi)容。
  • 性能不是最優(yōu)的:底層是基于TcpClient的,性能注定不會(huì)太高,但能用TcpClient的地方都可以用它。

使用方法

在項(xiàng)目中直接引用SimpleTCP.dll即可, dll文件可以通過(guò)NuGet安裝或從github下載源碼編譯。
SimpleTCP內(nèi)部有一個(gè)特殊字符分割字符串的協(xié)議可以直接使用,也可以在DataReceived事件處理程序中實(shí)現(xiàn)自己的協(xié)議。

實(shí)現(xiàn)客戶端

實(shí)現(xiàn)一個(gè)客戶端的代碼如下:

//初始化
var client = new SimpleTcpClient();            

//設(shè)置編碼格式,默認(rèn)是UTF8
client.StringEncoder = System.Text.ASCIIEncoding.ASCII;
//設(shè)置分隔符,默認(rèn)是0x13
client.Delimiter = Encoding.ASCII.GetBytes("\r")[0];

//收到分割數(shù)據(jù)的事件,遇到分隔符就會(huì)觸發(fā)事件
client.DelimiterDataReceived += (sender, msg) => 
{
    Console.WriteLine("DelimiterStr-"+DateTime.Now.ToString()+ msg.MessageString);
};

//收到數(shù)據(jù)的事件,可以在這里實(shí)現(xiàn)自己的協(xié)議
client.DataReceived += (sender, msg) => 
{
    //字節(jié)數(shù)組
    Console.WriteLine("Data:"+BitConverter.ToString(msg.Data));
    //字符串消息
    Console.WriteLine("ReceivedStr:" + msg.MessageString);
};

DelimiterDataReceived和DataReceived內(nèi)部使用了兩個(gè)不同的字節(jié)鏈表,解析起來(lái)互不影響。這兩個(gè)事件的處理程序中盡量不要做耗時(shí)的操作,否則會(huì)影響后續(xù)的數(shù)據(jù)接收。

SimpleTCP沒(méi)有心跳、重連功能,也沒(méi)找到反饋客戶端連接狀態(tài)的屬性(不建議使用內(nèi)部TcpClient的連接狀態(tài))。我們可以直接擴(kuò)展這些功能,代碼如下:

bool exit = false;
bool connected = false;
Task.Factory.StartNew(() => 
{
    while (!exit) 
    {
        try
        {
            if (connected)
            {
                //發(fā)送心跳
                client.Write("");
                Task.Delay(10000).Wait();
            }
            else
            {
                //斷線重連
                client.Connect("127.0.0.1", 4196);
                connected = true;
                Task.Delay(1000).Wait();
            }
        }
        catch (Exception)
        {
            connected = false;
            client.Disconnect();
        }
    }               
    
}, TaskCreationOptions.LongRunning);

把上面的代碼按順序復(fù)制到控制臺(tái)的Main函數(shù)中,然后加入下面的代碼就可以收發(fā)數(shù)據(jù)了:

while (true) 
{
    string strLine = Console.ReadLine();
    if (strLine == "esc") 
    {
        exit = true;
        client.Disconnect();
        return;
    }
    if (connected) 
    { 
        //獲取服務(wù)端回復(fù)的消息,最多等待3秒,收到消息時(shí)會(huì)提前返回
        //也可以使用Write、WriteLine方法發(fā)送數(shù)據(jù),WriteLine會(huì)自動(dòng)在后面加上設(shè)置的分隔符
        var replyMsg = client.WriteLineAndGetReply(strLine, TimeSpan.FromSeconds(3));
        if (replyMsg != null) 
        {
            Console.WriteLine(replyMsg);
        }
    }
}

注:WriteLineAndGetReply內(nèi)部使用的是DataReceived,不會(huì)自動(dòng)去除分隔符。

實(shí)現(xiàn)服務(wù)端

服務(wù)端功能比較簡(jiǎn)單,把收到分割數(shù)據(jù)加工后返回客戶端,代碼如下:

//初始化
var server = new SimpleTcpServer();
//設(shè)置編碼格式,默認(rèn)是UTF8
server.StringEncoder = System.Text.ASCIIEncoding.ASCII;
server.Delimiter =  Encoding.ASCII.GetBytes("\r")[0];

//分割數(shù)據(jù)接收事件
server.DelimiterDataReceived += (sender, msg) => 
{
    Console.WriteLine(msg.TcpClient.Client.RemoteEndPoint.ToString()+":" + msg.MessageString);
    msg.ReplyLine("Reply-" + msg.MessageString);
};

//數(shù)據(jù)接收數(shù)據(jù)
server.DataReceived += (sender, msg) =>
{
    Console.WriteLine(msg.TcpClient.Client.RemoteEndPoint.ToString() + ":" + msg.MessageString);
};

//客戶端連接事件
server.ClientConnected += (sender, msg) => 
{
    Console.WriteLine("ClientConnected:" + msg.Client.RemoteEndPoint.ToString());
};

//客戶端斷開(kāi)事件
server.ClientDisconnected += (sender, msg) =>
{
    Console.WriteLine("ClientDisconnected:" + msg.Client.RemoteEndPoint.ToString());
};

//開(kāi)始監(jiān)聽(tīng)
server.Start(4196);
//監(jiān)聽(tīng)的IP
var listeningIps = server.GetListeningIPs();
//監(jiān)聽(tīng)的V4Ip
var listeningV4Ips = server.GetListeningIPs().Where(ip => ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork);



Task.Factory.StartNew(() =>
{
    while (true)
    {   
        //連接數(shù)監(jiān)控
        int clientsConnected = server.ConnectedClientsCount;
        Console.WriteLine("當(dāng)前連接的客戶端數(shù):" + clientsConnected);
        Task.Delay(10000).Wait();
    }

}, TaskCreationOptions.LongRunning);            
Console.ReadLine();

//停止監(jiān)聽(tīng)
server.Stop();
Console.WriteLine("停止服務(wù)端!");
Console.ReadLine();

總結(jié)

上面的代碼主要為了展示庫(kù)的功能,實(shí)際使用時(shí)可能就幾行代碼,性能要求不高的項(xiàng)目都可以使用。

項(xiàng)目和庫(kù)的源碼鏈接如下:

鏈接: https://pan.baidu.com/s/1NgW4CQsU-1BJGgJHg8X2Fg 提取碼: 7vgf

鏈接: https://pan.baidu.com/s/1_2Gr83mkygHdN6B3KIx56w 提取碼: 5kdh

到此這篇關(guān)于C#開(kāi)源類庫(kù)SimpleTCP的文章就介紹到這了,更多相關(guān)C#開(kāi)源類庫(kù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++中繼承(inheritance)詳解及其作用介紹

    C++中繼承(inheritance)詳解及其作用介紹

    這篇文章主要介紹了C++中繼承(inheritance)詳解及其作用介紹,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • C語(yǔ)言中關(guān)于動(dòng)態(tài)內(nèi)存分配的詳解

    C語(yǔ)言中關(guān)于動(dòng)態(tài)內(nèi)存分配的詳解

    動(dòng)態(tài)內(nèi)存是指在堆上分配的內(nèi)存,而靜態(tài)內(nèi)存是指在棧上分配的內(nèi)存。棧上分配的內(nèi)存是由系統(tǒng)分配和釋放的,空間有限,在復(fù)合語(yǔ)句或函數(shù)運(yùn)行結(jié)束后就會(huì)被系統(tǒng)自動(dòng)釋放而堆上分配的內(nèi)存則不會(huì)有這個(gè)問(wèn)題。
    2021-09-09
  • C++中的friend函數(shù)詳細(xì)解析

    C++中的friend函數(shù)詳細(xì)解析

    本篇文章主要介紹了C++中的friend函數(shù)詳細(xì)解析,對(duì)初學(xué)c++的人有一定的幫助,有需要的可以了解一下。
    2016-11-11
  • vs code 配置c/c++環(huán)境的詳細(xì)教程(推薦)

    vs code 配置c/c++環(huán)境的詳細(xì)教程(推薦)

    這篇文章主要介紹了vs code 配置c/c++環(huán)境的詳細(xì)教程(推薦),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • 16種C語(yǔ)言編譯警告(Warning)類型的解決方法

    16種C語(yǔ)言編譯警告(Warning)類型的解決方法

    由于編譯的警告各種各樣,根本不可以一一羅列出來(lái),下面只是列舉出比較典型的十六種警告,還有一些警告,大家只要根據(jù)字面意思,就可以很快的查找出來(lái),并解決之。希望對(duì)大家有所幫助。
    2014-08-08
  • C/C++實(shí)現(xiàn)內(nèi)存泄漏檢測(cè)詳解

    C/C++實(shí)現(xiàn)內(nèi)存泄漏檢測(cè)詳解

    這篇文章主要為大家詳細(xì)介紹了c++進(jìn)行內(nèi)存泄漏檢測(cè)的方法,幫助大家更好的理解和學(xué)習(xí)使用c++,感興趣的朋友可以了解下,希望能夠給你帶來(lái)幫助
    2023-02-02
  • C++深入探究友元使用

    C++深入探究友元使用

    采用類的機(jī)制后實(shí)現(xiàn)了數(shù)據(jù)的隱藏與封裝,類的數(shù)據(jù)成員一般定義為私有成員,成員函數(shù)一般定義為公有的,依此提供類與外界間的通信接口。但是,有時(shí)需要定義一些函數(shù),這些函數(shù)不是類的一部分,但又需要頻繁地訪問(wèn)類的數(shù)據(jù)成員,這時(shí)可以將這些函數(shù)定義為該類的友元函數(shù)
    2022-07-07
  • C++計(jì)算ICMP頭的校驗(yàn)和實(shí)例

    C++計(jì)算ICMP頭的校驗(yàn)和實(shí)例

    這篇文章主要介紹了C++計(jì)算ICMP頭的校驗(yàn)和的方法,代碼簡(jiǎn)單實(shí)用,對(duì)于校驗(yàn)ICMP報(bào)文來(lái)說(shuō)有不錯(cuò)的實(shí)用價(jià)值,需要的朋友可以參考下
    2014-10-10
  • c++11 atomic的使用詳解

    c++11 atomic的使用詳解

    這篇文章主要介紹了c++11 atomic的使用詳解,幫助大家更好的理解和學(xué)習(xí)使用c++,感興趣的朋友可以了解下
    2021-02-02
  • 二叉樹(shù)先根(先序)遍歷的改進(jìn)

    二叉樹(shù)先根(先序)遍歷的改進(jìn)

    這篇文章主要介紹了二叉樹(shù)先根(先序)遍歷的改進(jìn),有需要的朋友可以參考一下
    2014-01-01

最新評(píng)論

北安市| 麻栗坡县| 肇东市| 北京市| 葫芦岛市| 岱山县| 四川省| 正安县| 麻栗坡县| 滦南县| 屏东市| 苏尼特右旗| 康乐县| 平定县| 临汾市| 新平| 沁源县| 柞水县| 商南县| 定结县| 清苑县| 凭祥市| 呼和浩特市| 伊金霍洛旗| 大余县| 无锡市| 安多县| 中山市| 和林格尔县| 江山市| 保亭| 项城市| 兴隆县| 邓州市| 印江| 赤壁市| 女性| 和平县| 泰顺县| 临沧市| 平阳县|