C#?Socket數(shù)據(jù)接收的三種實(shí)現(xiàn)方式
Stream.Read 方法
當(dāng)在派生類中重寫時(shí),從當(dāng)前流讀取字節(jié)序列,并將此流中的位置提升讀取的字節(jié)數(shù)。
語(yǔ)法:
public abstract int Read(byte[] buffer, int offset, int count)
參數(shù):
- buffer: 字節(jié)數(shù)組。此方法返回時(shí),該緩沖區(qū)包含指定的字符數(shù)組,該數(shù)組的 offset 和 (offset + count -1) 之間的值由從當(dāng)前源中讀取的字節(jié)替換。
- offset: buffer 中的從零開始的字節(jié)偏移量,從此處開始存儲(chǔ)從當(dāng)前流中讀取的數(shù)據(jù)。
- count: 要從當(dāng)前流中最多讀取的字節(jié)數(shù)。
返回值:
讀入緩沖區(qū)中的總字節(jié)數(shù)。如果當(dāng)前可用的字節(jié)數(shù)沒有請(qǐng)求的字節(jié)數(shù)那么多,則總字節(jié)數(shù)可能小于請(qǐng)求的字節(jié)數(shù),或者如果已到達(dá)流的末尾,則為零 (0)。
備注:
此方法的實(shí)現(xiàn)從當(dāng)前流中讀取最多的 count 個(gè)字節(jié),并將它們存儲(chǔ)在從 offset 開始的 buffer 中。流中的當(dāng)前位置提升已讀取的字節(jié)數(shù);但是,如果出現(xiàn)異常,流中的當(dāng)前位置保持不變。實(shí)現(xiàn)返回已讀取的字節(jié)數(shù)。僅當(dāng)位置當(dāng)前位于流的末尾時(shí),返回值才為零。如果沒有任何可用的數(shù)據(jù),該實(shí)現(xiàn)將一直阻塞到至少有一個(gè)字節(jié)的數(shù)據(jù)可讀為止。僅當(dāng)流中不再有其他的數(shù)據(jù),而且也不再需要更多的數(shù)據(jù)(如已關(guān)閉的套接字或文件尾)時(shí),Read 才返回 0。即使尚未到達(dá)流的末尾,實(shí)現(xiàn)仍可以隨意返回少于所請(qǐng)求的字節(jié)。
之前一般采用如下方式進(jìn)行數(shù)據(jù)接收:
int recv;//定義接收數(shù)據(jù)長(zhǎng)度變量 IPEndPoint ipEnd = new IPEndPoint(IPAddress.Parse(textBox1.Text), int.Parse(textBox2.Text)); //接收端所監(jiān)聽的接口,ip也可以用IPAddress.Any Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //初始化一個(gè)Socket對(duì)象 socket.Bind(ipEnd);//綁定套接字到一個(gè)IP地址和一個(gè)端口上(bind()); socket.Listen(10); while (true) { byte[] data = new byte[1024];//對(duì)data清零 Socket clientSocket = socket.Accept(); //一旦接受連接,創(chuàng)建一個(gè)客戶端 recv = clientSocket.Receive(data); if (recv == 0) //如果收到的數(shù)據(jù)長(zhǎng)度小于0,則退出 break; string stringData = "0x" + BitConverter.ToString(data).Replace("-", " 0x").ToLower(); this.Invoke((EventHandler)delegate { richTextBox1.Text += DateTime.Now.ToString("yy-MM-dd hh:mm:ss") + stringData + "\n"; }); }
之前用的時(shí)候沒發(fā)現(xiàn)什么問題,但是今天在測(cè)試金屬門數(shù)據(jù)接收的時(shí)候發(fā)現(xiàn)會(huì)丟數(shù)據(jù),金屬門每隔十秒給我一次數(shù)據(jù),用上面這個(gè)差不多60秒才能收到一組數(shù)據(jù),針對(duì)以上問題,做了如下修改:
將數(shù)據(jù)接收放到 while (true),數(shù)據(jù)接收正常。
以下分別采用三種方式實(shí)現(xiàn)了數(shù)據(jù)的正常接收,代碼如下:
測(cè)試:
Task.Run(() => {}); 這個(gè)可以去掉;
到此這篇關(guān)于C# Socket數(shù)據(jù)接收的三種實(shí)現(xiàn)方式的文章就介紹到這了,更多相關(guān)C# Socket數(shù)據(jù)接收內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#跨平臺(tái)開發(fā)之使用C/C++生成的動(dòng)態(tài)鏈接庫(kù)
這篇文章介紹了C#跨平臺(tái)開發(fā)之使用C/C++生成的動(dòng)態(tài)鏈接庫(kù),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-01-01C# OpenCvSharp實(shí)現(xiàn)圖片批量改名
這篇文章主要為大家詳細(xì)介紹了C#如何結(jié)合OpenCvSharp實(shí)現(xiàn)圖片批量改名功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-03-03解析c#在未出現(xiàn)異常情況下查看當(dāng)前調(diào)用堆棧的解決方法
本篇文章是對(duì)c#在未出現(xiàn)異常情況下查看當(dāng)前調(diào)用堆棧的解決方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05