訊息的封裝方式有多中,比如xml,json等,但是我依然覺得使用拼資料的方式最簡單,也最節省頻寬。比如我們處理乙個邏輯就可以這樣處理了:
int cast_net(messageblock &mb)
int area_id,lvl;
mv >> area >> lvl;
//邏輯處理
messageblock re_mb;
re_mb << item_id << item_sum;
return this->respond_to_client(re_mb);
在之前公司的時候,使用的是ace的ace_message_block,來到了新的公司,重新封裝了ace_message_block。 很多地方學習了ace的設計。比如 wr_ptr(),rd_ptr()等。
messageblock.h 檔案
/* * messageblock.h
** created on: aug 11, 2012
* author: archy_yu
*/#ifndef messageblock_h_
#define messageblock_h_
#include
#include <
string>
class messageblock ;
#endif
/* messageblock_h_ */
messageblock.cpp檔案
/** messageblock.cpp
** created on: aug 11, 2012
* author: archy_yu
*/#include
#include
#include
#include <
string.h>
#include
"messageblock.h
"messageblock::messageblock(
int n)
/*messageblock::messageblock(short tag,short len)
}messageblock::messageblock(tlventity paratlventity)
memcpy(this->data,paratlventity.value,paratlventity.length);}*/
messageblock::messageblock(messageblock &mb)
/*messageblock::messageblock(char* msg,int len)
messageblock::messageblock(std::string str)
*/messageblock::~messageblock()
messageblock& messageblock::
operator
<< (
const
char &value)
this->capacity =
this->wr_position +
sizeof(
char); }
*((char* )(
this->data + wr_position )) = value;
wr_position +=
sizeof(
char);
len = wr_position ;
return *
this; }
messageblock& messageblock::
operator
<<(
const
short &value)
this->capacity =
this->wr_position +
sizeof(
short); }
*((short* )(
this->data + wr_position )) = value;
wr_position +=
sizeof(
short);
len = wr_position;
return *
this; }
messageblock& messageblock::
operator
<<(
const
int &value)
this->capacity =
this->wr_position +
sizeof(
int); }
*((int* )(
this->data + wr_position )) = value;
wr_position +=
sizeof(
int);
this->len = wr_position;
return *
this; }
messageblock& messageblock::
operator
<<(
const
char* ss)
this->capacity =
this->wr_position +
2 + strlen(ss); }
*((short* )(
this->data + wr_position)) = len;
wr_position +=
sizeof(len);
this->len = wr_position;
memcpy(
this->data + wr_position,ss,len);
wr_position += len;
this->len = wr_position;
return *
this; }
messageblock& messageblock::
operator >>(
char &value)
value = *((
char* )(
this->data + rd_position ));
rd_position +=
sizeof(
char);
return *
this; }
messageblock& messageblock::
operator >>(
short &value)
value = *((
short* )(
this->data + rd_position ));
rd_position +=
sizeof(
short);
return *
this; }
messageblock& messageblock::
operator >>(
int &value)
value = *((
int* )(
this->data + rd_position));
rd_position +=
sizeof(
int);
return *
this; }
messageblock& messageblock::
operator >>(
char* ss)
rd_position +=
sizeof(len);
memcpy(ss,
this->data + rd_position,len);
ss[len] =
'\0';
rd_position += len;
return *
this; }
char* messageblock::wr_ptr()
char* messageblock::rd_ptr()
int messageblock::capacity()
void messageblock::set_len()
int messageblock::get_len()
需要說明的幾點:
1. linux伺服器一般都是小端的設計,但是flash在使用bytearray的時候就要注意大端小端的使用了。
2. 這樣的類不是一次能設計好的,需要在後續的開發過程中持續的改進。
伺服器訊息推送
客戶端定時向伺服器傳送ajax請求,伺服器接到請求後馬上返回響應資訊並關閉連線 優點 後端程式編寫比較容易 缺點 求中有大半是無用,浪費頻寬和伺服器資源 客戶端向伺服器傳送ajax請求,伺服器接到請求後hold住連線,直到有新訊息才返回響應資訊並關閉連線,客戶端處理完響應資訊後再向伺服器傳送新的請求...
高效能伺服器設計1
先後檢視了 haproxy l7sw 和 lighttpd 的相關原始碼,無一例外,他們一致認為多路復用是效能最好的伺服器架構。事實也確實應該如此,程序的出現一方面就是為了儲存任務的執行上下文從而簡化應用程式設計,如果程式的邏輯結構不是很複雜,那麼用整個程序控制塊來儲存執 行上下文未免有些大材小用,...
Socket 伺服器設計核心 傳送訊息的快取
伺服器對全域性傳送訊息必須有個快取。原因如下 假設伺服器的運算瓶頸是每秒鐘傳送100個資訊 如果這個時候伺服器本身產生的傳送訊息資料遠遠大於了這個數量,會導致伺服器宕機,即使不宕機也執行出現異常。而且有可能突然間訪問量暴增,如果在socket這一層面可以阻止過高的訪問量,那麼剩下的就是運算瓶頸。這2...