diff --git a/examples/proto_debuger/base_form.cpp b/examples/proto_debuger/base_form.cpp index 4c9980de..0d6289a2 100644 --- a/examples/proto_debuger/base_form.cpp +++ b/examples/proto_debuger/base_form.cpp @@ -253,23 +253,24 @@ LRESULT BasicForm::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) if (ui::EventType::kEventSelect == ev->Type) { wprintf(L"%s\r\n", dynamic_cast (ev->pSender)->GetText().c_str()); printf("GetCurSel %d\r\n", mRightSide->GetCurSel()); - } - WebsocketClientForm* p = mWebsocketClientForm[dynamic_cast (ev->pSender)->GetText()]; - if (p != nullptr) { - printf("GetCurSel %d\r\n", mRightSide->GetCurSel()); - p->SetAutoDestroy(true); - if (mRightShow != nullptr) { - mRightShow->SetVisible(false); - p->SetVisible(true); - mRightShow = p; - wprintf(L"%s", p->GetName()); - mRightSide->SelectItem(p->GetName()); - } - else { - wprintf(L"%s", p->GetName()); - p->SetVisible(true); - mRightSide->SelectItem(p->GetName()); - mRightShow = p; + + WebsocketClientForm* p = mWebsocketClientForm[dynamic_cast (ev->pSender)->GetText()]; + if (p != nullptr) { + printf("GetCurSel %d\r\n", mRightSide->GetCurSel()); + p->SetAutoDestroy(true); + if (mRightShow != nullptr) { + mRightShow->SetVisible(false); + p->SetVisible(true); + mRightShow = p; + wprintf(L"%s", p->GetName()); + mRightSide->SelectItem(p->GetName()); + } + else { + wprintf(L"%s", p->GetName()); + p->SetVisible(true); + mRightSide->SelectItem(p->GetName()); + mRightShow = p; + } } } return true; @@ -282,14 +283,14 @@ LRESULT BasicForm::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) ui::TreeNode* node = new ui::TreeNode; mMonitor->GetRootNode()->GetChildNode(6)->AddChildNode(node); - auto key = info->ip; + auto key = info->ip + std::to_wstring(info->port); node->SetText(key); node->SetClass(L"listitem"); if (mWebsocketServerForm.find(info->ip) == mWebsocketServerForm.end()) { WebsocketServer* server = (WebsocketServer*)lParam; - auto form = new WebsocketServerForm(this, wstring2string(info->ip), server); + auto form = new WebsocketServerForm(this, wstring2string(key), server); form->SetChildLayoutXML(L"basic/tcp_server_form.xml"); form->SetName(key); @@ -303,24 +304,25 @@ LRESULT BasicForm::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) if (ui::EventType::kEventSelect == ev->Type) { wprintf(L"%s\r\n", dynamic_cast (ev->pSender)->GetText().c_str()); printf("GetCurSel %d\r\n", mRightSide->GetCurSel()); - } - WebsocketServerForm* p = mWebsocketServerForm[dynamic_cast - (ev->pSender)->GetText()]; - if (p != nullptr) { - printf("GetCurSel %d\r\n", mRightSide->GetCurSel()); - p->SetAutoDestroy(true); - if (mRightShow != nullptr) { - mRightShow->SetVisible(false); - p->SetVisible(true); - mRightShow = p; - wprintf(L"%s", p->GetName()); - mRightSide->SelectItem(p->GetName()); - } - else { - wprintf(L"%s", p->GetName()); - p->SetVisible(true); - mRightSide->SelectItem(p->GetName()); - mRightShow = p; + + WebsocketServerForm* p = mWebsocketServerForm[dynamic_cast + (ev->pSender)->GetText()]; + if (p != nullptr) { + printf("GetCurSel %d\r\n", mRightSide->GetCurSel()); + p->SetAutoDestroy(true); + if (mRightShow != nullptr) { + mRightShow->SetVisible(false); + p->SetVisible(true); + mRightShow = p; + wprintf(L"%s", p->GetName()); + mRightSide->SelectItem(p->GetName()); + } + else { + wprintf(L"%s", p->GetName()); + p->SetVisible(true); + mRightSide->SelectItem(p->GetName()); + mRightShow = p; + } } } return true; @@ -650,6 +652,11 @@ LuaBindInterface* BasicForm::FindCurrentFormByLuaPointer(lua_State* pointer) return (LuaBindInterface*)itr->second; } } + for (auto itr = mWebsocketServerForm.begin(); itr != mWebsocketServerForm.end(); itr++) { + if (itr->second->LuaVM()->VM() == pointer) { + return (LuaBindInterface*)itr->second; + } + } return nullptr; } diff --git a/examples/proto_debuger/websocket_server.cpp b/examples/proto_debuger/websocket_server.cpp index b2ecb787..40500322 100644 --- a/examples/proto_debuger/websocket_server.cpp +++ b/examples/proto_debuger/websocket_server.cpp @@ -10,7 +10,11 @@ void on_new_connection(WebsocketServer* s, websocketpp::connection_hdl hdl){ auto host = con->get_host(); auto uri = con->get_uri(); auto resource = con->get_resource(); - std::cout<m_on_connection) + s->m_on_connection(addr.to_string(), + socket.remote_endpoint().port()); } @@ -20,6 +24,13 @@ void on_connection_close(WebsocketServer* s, websocketpp::connection_hdl hdl){ WsServer::connection_ptr con = s->m_server->get_con_from_hdl(hdl); auto socket = con->get_raw_socket().native_handle(); s->m_clients.erase(socket); + auto addr = con->get_socket().remote_endpoint().address(); + auto host = con->get_host(); + auto uri = con->get_uri(); + auto resource = con->get_resource(); + + if (s->m_on_close) + s->m_on_close(addr.to_string(), socket.remote_endpoint().port()); } // Define a callback to handle incoming messages @@ -27,7 +38,17 @@ void on_message(WebsocketServer* s, websocketpp::connection_hdl hdl, message_ptr std::cout << "on_message called with hdl: " << hdl.lock().get() << " and message: " << msg->get_payload() << std::endl; + WsServer::connection_ptr con = s->m_server->get_con_from_hdl(hdl); + auto socket = con->get_raw_socket().native_handle(); + s->m_clients[socket] = hdl; + auto addr = con->get_socket().remote_endpoint().address(); + auto host = con->get_host(); + auto uri = con->get_uri(); + auto resource = con->get_resource(); + if (s->m_on_message) + s->m_on_message(addr.to_string(), + socket.remote_endpoint().port(), msg->get_payload()); // check for a special command to instruct the server to stop listening so // it can be cleanly exited. /* @@ -45,8 +66,19 @@ void on_message(WebsocketServer* s, websocketpp::connection_hdl hdl, message_ptr */ } +std::string WebsocketServer::Url() +{ + return m_url; +} + +uint32_t WebsocketServer::Port() +{ + return m_port; +} + WebsocketServer::WebsocketServer(std::string server,uint32_t port){ m_port = port; + m_url = server; m_server = new WsServer; m_thread = new std::thread([this](){ // Set logging settings @@ -97,3 +129,21 @@ int WebsocketServer::SendDataAllClient(const char* dat,int len, return 0; } +void WebsocketServer::SetOnNewConnectionHanlder(OnNewConnectionHanlder handler) +{ + if (handler) + m_on_connection = handler; +} + +void WebsocketServer::SetOnConnectionCloseHanlder(OnConnectionCloseHanlder handler) +{ + if(handler) + this->m_on_close = handler; +} + +void WebsocketServer::SetOnMessageHanlder(OnMessageHanlder handler) +{ + if (handler) + this->m_on_message = handler; +} + diff --git a/examples/proto_debuger/websocket_server.h b/examples/proto_debuger/websocket_server.h index 36fb861f..a2527e9d 100644 --- a/examples/proto_debuger/websocket_server.h +++ b/examples/proto_debuger/websocket_server.h @@ -18,19 +18,30 @@ typedef WsServer::message_ptr message_ptr; class WebsocketServer { public: + typedef std::function OnNewConnectionHanlder; + typedef std::function OnConnectionCloseHanlder; + typedef std::function OnMessageHanlder; + + std::string Url(); + uint32_t Port(); WebsocketServer(std::string server,uint32_t port); friend void on_new_connection(WebsocketServer* s, websocketpp::connection_hdl hdl); friend void on_message(WebsocketServer* s, websocketpp::connection_hdl hdl, message_ptr msg); friend void on_connection_close(WebsocketServer* s, websocketpp::connection_hdl hdl); int SendData(uint32_t,const char *data,int len,websocketpp::frame::opcode::value); int SendDataAllClient(const char *data,int len,websocketpp::frame::opcode::value); - + void SetOnNewConnectionHanlder(OnNewConnectionHanlder); + void SetOnConnectionCloseHanlder(OnConnectionCloseHanlder); + void SetOnMessageHanlder(OnMessageHanlder); private: std::string m_url; // 地址 uint32_t m_port; // url WsServer *m_server; std::thread *m_thread; std::mutex m_mutex; + OnNewConnectionHanlder m_on_connection; + OnConnectionCloseHanlder m_on_close; + OnMessageHanlder m_on_message; std::map m_clients; }; diff --git a/examples/proto_debuger/websocket_server.lua b/examples/proto_debuger/websocket_server.lua new file mode 100644 index 00000000..24d4ff79 --- /dev/null +++ b/examples/proto_debuger/websocket_server.lua @@ -0,0 +1 @@ +require("string") local file = io.open("writetest.txt", "w+") function OnWebSocketDataServer (addr,port,message) showdata("OnWebSocketDataServer " .. message.."\r\n") end function OnWebsocketNewConnection(addr,port) showdata("OnWebsocketNewConnection " .. addr.."\r\n") end function OnWebsocketCloseConnection(addr,port) showdata("dfasdfsddfasda" .. addr.."\r\n") end \ No newline at end of file diff --git a/examples/proto_debuger/websocket_server_form.cpp b/examples/proto_debuger/websocket_server_form.cpp index 3442a829..ffb7e1a5 100644 --- a/examples/proto_debuger/websocket_server_form.cpp +++ b/examples/proto_debuger/websocket_server_form.cpp @@ -3,15 +3,13 @@ #define WEBSOCKET_SERVER_LUA "websocket_server.lua" -WebsocketServerForm::WebsocketServerForm(ui::Window* hwnd, string url, WebsocketServer* server) +WebsocketServerForm::WebsocketServerForm(ui::Window* hwnd, string url, + WebsocketServer* server) { if (nullptr != hwnd) { this->SetWindow(hwnd, nullptr, false); } m_server = server; - if (nullptr != server) { - - } mLua = new LuaDelegate; mLuaFile.open(WEBSOCKET_SERVER_LUA); @@ -31,6 +29,7 @@ WebsocketServerForm::WebsocketServerForm(ui::Window* hwnd, string url, Websocket void WebsocketServerForm::Init() { ui::ChildBox::Init(); + m_label_1 = dynamic_cast(FindSubControl(L"server_info")); m_rich_edit_1 = dynamic_cast(FindSubControl(L"server_recv_edit")); m_rich_edit_2 = dynamic_cast(FindSubControl(L"lua_script_edit")); @@ -40,6 +39,26 @@ void WebsocketServerForm::Init() m_rich_edit_2->SetText(string2wstring(mLuaScript)); + + m_label_1->SetText(string2wstring(this->m_server->Url()) + L":" + + std::to_wstring(m_server->Port())); + if (nullptr != m_server) { + m_server->SetOnConnectionCloseHanlder([this](std::string addr, uint32_t port) { + this->mLua->CallFuntion("OnWebsocketCloseConnection", + addr, int(port)); + }); + m_server->SetOnNewConnectionHanlder([this](std::string addr, uint32_t port) { + this->mLua->CallFuntion("OnWebsocketNewConnection", + addr, int(port)); + }); + m_server->SetOnMessageHanlder([this](std::string addr, uint32_t port, std::string message) + { + std::cout<<"SetOnMessageHanlder\r\n"; + std::cout << addr << port << message<<"\r\n"; + this->mLua->CallFuntion("OnWebSocketDataServer", addr,int(port),message); + }); + } + m_websocket_send_edit = dynamic_cast(FindSubControl(L"server_send_edit")); m_btn_send_data = dynamic_cast(FindSubControl(L"btn_send_data")); m_check_box_2 = dynamic_cast(FindSubControl(L"check_time_send")); @@ -48,6 +67,11 @@ void WebsocketServerForm::Init() m_btn_save_lua = dynamic_cast(FindSubControl(L"btn_save_lua")); m_btn_close_form = dynamic_cast(FindSubControl(L"btn_close_uart")); + if (nullptr != m_btn_close_form) { + m_btn_close_form->AttachClick([this](ui::EventArgs *ev) { + + return true; + }); if (nullptr != m_btn_save_lua) m_btn_save_lua->AttachClick( [this](ui::EventArgs* ev) {