基於非同步socket客戶端接收資料基礎類。

2021-05-24 03:19:36 字數 3481 閱讀 5438

namespace socketserver

///

/// 組包基礎類

///

///

public class grouppackagewhere t :  struct

//int m_ndatalen;

int m_nrecvoffset; //接受偏移

byte m_brealdata; //接收資料

int m_nallocrealdataitem; //預設長度

//包頭

public t head

public int headlen

public grouppackage(intptr handler)

orghandler = handler;

headlen = marshal.sizeof(typeof(t));

m_nallocrealdataitem = 1024;

m_brealdata = new byte[1024];

public void clearrecvbuffer()

m_nrecvoffset = 0;

///

/// 傳入的指標

///

public intptr orghandler

///

/// 指標

///

public intptr handler

get

public void recvbytedata(intptr pdata,int nlength)

if (nlength < 0)

throw  new argumentexception("error_recvbytedata");

int ndeallength = 0;            //已經處理的資料長度

dopdata = pdata + ndeallength;

nlength -= ndeallength;

ndeallength = 0;

if (nlength == 0) {

return;

int nheadneed = headlen - m_nrecvoffset;

if (nheadneed > 0)

if (nlength >= nheadneed)

marshal.copy(pdata, m_brealdata, m_nrecvoffset, nheadneed);

m_nrecvoffset += nheadneed;

if (!checkhead(m_brealdata))

return;

head = (t)structtransform.bytestostuct(m_brealdata, typeof(t));

ndeallength += nheadneed;

if (m_nrecvoffset == getpacketlength(m_brealdata))

onreceivepackage(m_brealdata, m_nrecvoffset);

m_nrecvoffset = 0;

continue;

else

marshal.copy(m_brealdata, m_nrecvoffset, pdata, nlength);

m_nrecvoffset += nlength;

return;

else

int npackagelength = getpacketlength(m_brealdata);

if (npackagelength < 0)

return;

if (npackagelength > 1024)

byte pnew = new byte[npackagelength];

m_brealdata.copyto(pnew, 0);

// marshal.copy(pnew, m_brealdata, m_nrecvoffset);

m_brealdata = null;

m_brealdata = pnew;

m_nallocrealdataitem = npackagelength;

int nneed = npackagelength - m_nrecvoffset;

if (nlength < nneed)

marshal.copy(pdata, m_brealdata, m_nrecvoffset, nlength);

m_nrecvoffset += nlength;

//資料不足,還要等下一次接收.

return;

else

//資料充足

//將需要部分全部拷入.

marshal.copy(pdata, m_brealdata, m_nrecvoffset, nneed);//全部拷入

//資料報,接收完整,通知資料報到達.

onreceivepackage(m_brealdata, npackagelength);

//接收完資料後,不刪除,以便下次復用。

m_nrecvoffset = 0; //再重新開始。

ndeallength += nneed; //新增已經處理的.

continue;

while (true);

///

/// 判斷包頭是否正確, 子類繼承實現

///

///

///

public virtual bool checkhead(byte prealdata)

return true;

///

/// 獲取包長度,子類繼承實現

///

///

///

public virtual int getpacketlength(byte prealdata)

//測試**

byte temp = new byte[4];

temp[0] = prealdata[12];

temp[1] = prealdata[13];

temp[2] = prealdata[14];

temp[3] = prealdata[15];

byte temp1 = new byte[4];

temp1[0] = prealdata[0];

temp1[1] = prealdata[1];

temp1[2] = prealdata[2];

temp1[3] = prealdata[3];

return (int)bitconverter.toint32(temp, 0) + (int)bitconverter.toint32(temp1, 0);

///

/// 接受包完整後執行方法 

///

///

///

public virtual void onreceivepackage(byte readdata, int len)

Vue 客戶端接收不到 response返回資料

前言 自己是基於別人的專案開發的,考慮到js沒vue好用,就採用vue來改變dom節點和資料以及監聽事件的實現。背景 login頁面,原開發者是通過表單 submit來提交資料的。自己沒考慮太多,直接在提交標籤加入點選方法,試圖通過點選事件觸發vue中的提交資料的方法,然後根據返回資料再進行頁面跳轉...

mqtt js 客戶端接入

公司入手乙個新任務,類似於乙個網頁版文字直播室,需要監聽某個老師的訊息。於是服務端搭建了mqtt服務。1.引入 js 也可以用對應的cdn 位址 for the plain libraryfor the minified library 2.示例 create a client instance c...

TCP通訊指定客戶端接收資料的埠 Socket

使用socket實現tcp通訊時,服務端響應資料給客戶端時,客戶端接收資料的埠是隨機的。如果想指定客戶端接收資料的埠,那麼可以在客戶端建立socket時使用如下api socket new socket ip,serverport,inetaddress.getbyname getlocalipad...