91网首页-91网页版-91网在线观看-91网站免费观看-91网站永久视频-91网站在线播放

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

C# 開源類庫 SimpleTCP

admin
2023年5月15日 21:51 本文熱度 1291

簡介


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

SimpleTCP

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


它的主要特點如下:

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

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

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

使用方法

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

實現(xiàn)客戶端

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

//初始化
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ù)的事件,遇到分隔符就會觸發(fā)事件
client.DelimiterDataReceived += (sender, msg) => 
{
    Console.WriteLine("DelimiterStr-"+DateTime.Now.ToString()+ msg.MessageString);
};

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

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

SimpleTCP沒有心跳、重連功能,也沒找到反饋客戶端連接狀態(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ù)制到控制臺的Main函數(shù)中,然后加入下面的代碼就可以收發(fā)數(shù)據(jù)了:

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

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

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

服務(wù)端功能比較簡單,把收到分割數(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());
};

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

//開始監(jiān)聽
server.Start(4196);
//監(jiān)聽的IP
var listeningIps = server.GetListeningIPs();
//監(jiān)聽的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)聽
server.Stop();
Console.WriteLine("停止服務(wù)端!");
Console.ReadLine();

總結(jié)

上面的代碼主要為了展示庫的功能,實際使用時可能就幾行代碼,性能要求不高的項目都可以使用。

為了節(jié)省大家的時間,項目和庫的源碼都放到某度網(wǎng)盤了。給本公號發(fā)送【源碼】可以獲取鏈接。


轉(zhuǎn)自:time-flies

鏈接:cnblogs.com/timefiles/p/CSharpSimpleTCP.html


該文章在 2023/5/15 21:51:17 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點晴ERP是一款針對中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點晴PMS碼頭管理系統(tǒng)主要針對港口碼頭集裝箱與散貨日常運作、調(diào)度、堆場、車隊、財務(wù)費用、相關(guān)報表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點,圍繞調(diào)度、堆場作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點晴WMS倉儲管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務(wù)都免費,不限功能、不限時間、不限用戶的免費OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 日韩欧美精品 | 日韩免费在线观 | 国内精品自产拍 | 福利资源在线播放 | 国产亚洲精品导航 | 区二区在线欧美 | 国产一区二区影视 | 精品国产色欧洲激情 | 国产又大又| 91超精品| 国产欧美综合一 | 日韩精品在线第一页 | 国产激情视频 | 精品偷拍欧美日韩 | 国产91白丝在 | 日韩欧美亚洲大片 | 福利导航大全 | 国产日韩影院在线 | 九九九九九九伊人 | 欧美日韩国产不卡 | 国产欧美在线观看 | 欧美日韩综合在线 | 国产乱子伦精 | 欧美综合天天 | 成人精品一区二区三 | 欧美日韩乱一区二区 | 日韩有码在线视频 | 国产精品视频视 | 日本1区在线观看 | 成人免费国产ga | 国产精品私密 | 91精品最新 | 91视频区 | 日韩中文字幕不卡 | 乱伦精品亚洲影视 | 乱码在线观看 | 三年片免费观看大全 | 国产精品九九片 | 韩剧嘟嘟网 | 九热视频 | 国产精品欧美日韩 |