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...