此程序基于XEngine实现.包含websocket 客户端和服务器例子
可以使用此代码方便的开发基于websocket的应用程序或者服务器
默认提供的是服务器.你可以通过一些websocket测试网站进行测试,比如,随便搜索百度一个测试网站http://coolaf.com/tool/chattest.然后填入你的ip地址加端口,比如我的是ws://192.168.1.2:5000/ 点击链接,提示成功,然后就可以发送数据了
提供的开发包包含网络服务和websocket库,你也可以自己实现网络相关程序,使用我们提供的websocket库
直接调用我们API非常方便,直接启动即可,下面将启动一个监听5000端口的websocket服务器
int main()
{
WSADATA st_WSAData;
WSAStartup(MAKEWORD(2, 2), &st_WSAData);
memset(tszClientAddr, '\0', sizeof(tszClientAddr));
if (!NetCore_TCPIocp_StartEx(&xhToken, 5000, 100, 2))
{
printf("%lX\n", NetCore_GetLastError());
return 0;
}
NetCore_TCPIocp_RegisterCallBackEx(xhToken, NetCore_CB_Login, NetCore_CB_Recv, NetCore_CB_Close);
RfcComponents_WSPacket_Init(10000, FALSE, 4);
CreateThread(NULL, 0, NetCore_Thread, NULL, 0, NULL);
while (1)
{
Sleep(1000);
}
WSACleanup();
return 0;
}
启动后在接受数据的回调函数里面处理websocket数据,这里需要判断下blogin用户是否登录,因为websocket有一次握手操作,所以我们需要处理下握手操作,然后通过RfcComponents_WSPacket_Post 吧接受到的数据报投递到websocket库里面 让这个库来处理websocket的数据.
void __stdcall NetCore_CB_Recv(LPCSTR lpszClientAddr, SOCKET hSocket, LPCSTR lpszRecvMsg, int nMsgLen, LPVOID lParam)
{
printf("NetCore_CB_Recv:%s-%d\n", lpszClientAddr, nMsgLen);
BOOL bLogin = FALSE;
RfcComponents_WSPacket_GetLogin(lpszClientAddr, &bLogin);
if (bLogin)
{
if (!RfcComponents_WSPacket_Post(lpszClientAddr, lpszRecvMsg, nMsgLen))
{
printf("RfcComponents_WSPacket_Post:%lX\n", WSFrame_GetLastError());
}
}
else
{
int nSDLen = nMsgLen;
TCHAR tszHandsBuffer[1024];
memset(tszHandsBuffer, '\0', sizeof(tszHandsBuffer));
RfcComponents_WSConnector_HandShake(lpszRecvMsg, &nSDLen, tszHandsBuffer);
NetCore_TCPIocp_SendEx(xhToken, lpszClientAddr, tszHandsBuffer, nSDLen);
RfcComponents_WSPacket_SetLogin(lpszClientAddr);
}
}
最后,我们只需要取出包即可.取出的包是一个完整的websocket数据包.我们启动一个线程来一直获取是否有可以处理的websocket数据,下面的代码,tszMsgBuffer 就是表明要处理的数据缓冲区,nMsgLen缓冲区大小
DWORD WINAPI NetCore_Thread(LPVOID lParam)
{
while (TRUE)
{
if (RfcComponents_WSPacket_WaitEvent(1))
{
int nMsgLen = 20480;
ENUM_XENGINE_RFCOMPONENTS_WEBSOCKET_OPCODE enOPCode;
TCHAR tszMsgBuffer[20480];
memset(tszMsgBuffer, '\0', sizeof(tszMsgBuffer));
list<RFCCOMPONENTS_WSPKT_CLIENT> stl_ListClient;
RfcComponents_WSPacket_GetPool(1, &stl_ListClient);
list<RFCCOMPONENTS_WSPKT_CLIENT>::const_iterator stl_ListIterator = stl_ListClient.begin();
for (;stl_ListIterator != stl_ListClient.end();stl_ListIterator++)
{
for (int i = 0;i < stl_ListIterator->nPktCount;i++)
{
if (RfcComponents_WSPacket_Get(stl_ListIterator->tszClientAddr, tszMsgBuffer, &nMsgLen, &enOPCode))
{
printf("%s %d:%s\n", stl_ListIterator->tszClientAddr, nMsgLen, tszMsgBuffer);
}
}
}
}
Sleep(1);
}
return 0;
}
当然,你也可以给这个客户端发送数据,RfcComponents_WSCodec_EncodeMsg 这个函数用于编码要发送的数据,用这个函数来把数据编码成websocket格式
if (RfcComponents_WSCodec_EncodeMsg("123456", tszMsgBuffer, &nRVLen, ENUM_XENGINE_RFCOMPONENTS_WEBSOCKET_OPCODE_TEXT))
{
if (NetCore_TCPIocp_SendEx(xhToken, lpszClientAddr(ip:port),tszMsgBuffer, nRVLen))
{
printf("NetClient_TCPSelect_SendMsg:%d\n", nRVLen);
}
}
这里提供了一份完整的代码包,你可以直接下载测试:https://download.csdn.net/download/aaadddzxc/15203652