中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C#開源類庫SimpleTCP怎么用

發布時間:2021-09-14 13:35:50 來源:億速云 閱讀:187 作者:小新 欄目:開發技術

小編給大家分享一下C#開源類庫SimpleTCP怎么用,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

簡介

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

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

它的主要特點如下:

  • 源碼簡單:源碼就幾個類,每個類也不大,在了解TcpClient用法的基礎上不需要注釋就可以看懂。

  • 功能單一:不像其它庫一樣功能繁多,它只專注于實現簡單的TCP客戶端、服務端,使用起來不用擔心增加系統的復雜性。

  • 使用簡單:后面的示例會具體講解,啟動一個客戶端或服務端只需要幾行代碼,想擴展功能也很簡單。

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

  • 已停止更新:最后更新時間是2017年,不過庫的功能比較簡單、單一,也沒那么多更新的內容。

  • 性能不是最優的:底層是基于TcpClient的,性能注定不會太高,但能用TcpClient的地方都可以用它。

使用方法

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

實現客戶端

實現一個客戶端的代碼如下:

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

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

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

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

DelimiterDataReceived和DataReceived內部使用了兩個不同的字節鏈表,解析起來互不影響。這兩個事件的處理程序中盡量不要做耗時的操作,否則會影響后續的數據接收。

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

bool exit = false;
bool connected = false;
Task.Factory.StartNew(() => 
{
    while (!exit) 
    {
        try
        {
            if (connected)
            {
                //發送心跳
                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);

把上面的代碼按順序復制到控制臺的Main函數中,然后加入下面的代碼就可以收發數據了:

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

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

實現服務端

服務端功能比較簡單,把收到分割數據加工后返回客戶端,代碼如下:

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

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

//數據接收數據
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());
};

//開始監聽
server.Start(4196);
//監聽的IP
var listeningIps = server.GetListeningIPs();
//監聽的V4Ip
var listeningV4Ips = server.GetListeningIPs().Where(ip => ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork);



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

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

//停止監聽
server.Stop();
Console.WriteLine("停止服務端!");
Console.ReadLine();

以上是“C#開源類庫SimpleTCP怎么用”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

福贡县| 绥宁县| 杭州市| 蓬溪县| 酒泉市| 乡城县| 上林县| 乐业县| 汉川市| 彩票| 合阳县| 谷城县| 灵丘县| 会同县| 本溪市| 水富县| 灵宝市| 镇雄县| 新民市| 嵊泗县| 平昌县| 台湾省| 陈巴尔虎旗| SHOW| 镇宁| 朝阳区| 永德县| 开封市| 茌平县| 曲沃县| 天水市| 万源市| 许昌县| 呼玛县| 临泽县| 仪征市| 阿勒泰市| 中卫市| 嘉禾县| 嘉义市| 肥东县|