wxWidgets之网络编程,服务端设计

#include "wx/wxprec.h" #include "wx/wx.h" #include "wx/socket.h" class MyApp : public wxApp { public: virtual bool OnInit(); }; class MyFrame : public wxFrame { public: MyFrame(); ~MyFrame(); void OnQuit( wxCommandEvent& event ); void OnAbout( wxCommandEvent& event ); void OnServerEvent( wxSocketEvent& event ); void OnSocketEvent( wxSocketEvent& event ); void Test1( wxSocketBase *sock ); void Test2( wxSocketBase *sock ); void Test3( wxSocketBase *sock ); void UpdateStatusBar(); protected: private: wxSocketServer *m_server; wxTextCtrl *m_text; wxMenu *m_menuFile; wxMenuBar *m_menubar; bool m_busy; int m_numClients; DECLARE_EVENT_TABLE() }; enum{ SERVER_QUIT = wxID_EXIT, SERVER_ABOUT = wxID_ABOUT, SERVER_ID = 100, SOCKET_ID }; BEGIN_EVENT_TABLE( MyFrame, wxFrame ) EVT_MENU( SERVER_QUIT, MyFrame::OnQuit ) EVT_MENU( SERVER_ABOUT, MyFrame::OnAbout ) EVT_SOCKET( SERVER_ID, MyFrame::OnServerEvent ) EVT_SOCKET( SOCKET_ID, MyFrame::OnSocketEvent ) END_EVENT_TABLE() IMPLEMENT_APP( MyApp ) bool MyApp::OnInit() { MyFrame *frame = new MyFrame(); frame->Show( true ); SetTopWindow( frame ); return true; } MyFrame::MyFrame() : wxFrame( (wxFrame *)NULL, wxID_ANY, wxT( "服务端测试!" ), wxDefaultPosition, wxSize( 300, 200 ) ) { // SetIcon(); m_menuFile = new wxMenu(); m_menuFile->Append( SERVER_ABOUT, wxT( "关于(&A)" ), wxT( "" ) ); m_menuFile->AppendSeparator(); m_menuFile->Append( SERVER_QUIT, wxT( "退出(&X)/tAlt+X" ), wxT( "" ) ); m_menubar = new wxMenuBar(); m_menubar->Append( m_menuFile, wxT( "文件(&F)" ) ); SetMenuBar( m_menubar ); CreateStatusBar( 2 ); m_text = new wxTextCtrl( this, wxID_ANY, wxT( "" ), wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE | wxTE_READONLY ); wxIPV4address addr; addr.Service( 3000 ); m_server = new wxSocketServer( addr ); if ( ! m_server->Ok() ) { m_text->AppendText( wxT( "监听特定端口失败!/n/n" ) ); return ; } else { m_text->AppendText( wxT( "服务器正在监听.../n/n" ) ); } m_server->SetEventHandler( *this, SERVER_ID ); m_server->SetNotify( wxSOCKET_CONNECTION_FLAG ); m_server->Notify( true ); m_busy = false; m_numClients = 0; UpdateStatusBar(); } MyFrame::~MyFrame() { delete m_server; } void MyFrame::OnQuit( wxCommandEvent& WXUNUSED( event ) ) { Close(true); } void MyFrame::OnAbout( wxCommandEvent& event ) { wxMessageBox( wxT("wxSocket demo: 服务端/n(c) 2009 R.L/n" ), wxT( "关于服务端" ), wxOK | wxICON_INFORMATION, this ); } void MyFrame::Test1(wxSocketBase *sock) { unsigned char len; char *buf; m_text->AppendText( wxT( "测试一开始.../n" ) ); sock->SetFlags( wxSOCKET_WAITALL ); sock->Read( &len, 1 ); buf = new char[len]; sock->Read( buf, len ); m_text->AppendText( wxT( "取得数据,发送出去.../n" ) ); sock->Write( buf, len ); delete []buf; m_text->AppendText( wxT( "测试一结束!/n" ) ); } void MyFrame::Test2( wxSocketBase *sock ) { wxString s; wxChar *buf = new wxChar[1024]; wxUint32 len; m_text->AppendText( wxT( "测试二开始.../n" ) ); // 阅读消息 len = sock->ReadMsg( buf, 1024 * sizeof( wxChar ) ).LastCount(); s.Printf( wxT( "客户端: %s/n" ), buf ); m_text->AppendText( s ); m_text->AppendText( wxT( "将数据发送回去。/n" ) ); // 将其写回 sock->WriteMsg( buf, len ); delete[] buf; m_text->AppendText( wxT( "测试二结束!/n/n" ) ); } void MyFrame::Test3( wxSocketBase *sock ) { unsigned char len; char *buf; m_text->AppendText( wxT( "测试三开始.../n" ) ); sock->SetFlags( wxSOCKET_WAITALL ); // 读取长度 sock->Read( &len, 1 ); buf = new char[len * 1024]; // 读取数据 sock->Read( buf, len * 1024 ); m_text->AppendText( wxT( "取得数据,将其发回。/n" ) ); // 将其写回 sock->Write( buf, len * 1024 ); delete[] buf; m_text->AppendText( wxT( "测试三结束!/n/n" ) ); } void MyFrame::OnServerEvent( wxSocketEvent& event ) { wxString s = wxT( "OnServerEvent: " ); wxSocketBase *sock; switch(event.GetSocketEvent()) { case wxSOCKET_CONNECTION : s.Append( wxT("wxSOCKET_CONNECTION/n") ); break; default : s.Append( wxT("不可预知的事件!/n") ); break; } m_text->AppendText( s ); sock = m_server->Accept( false ); if ( sock ) { m_text->AppendText( wxT( "接到一个新的客户端的连接!/n/n" ) ); } else { m_text->AppendText( wxT( "错误: 不能建立新的连接!/n/n" ) ); return; } sock->SetEventHandler( *this, SOCKET_ID ); sock->SetNotify( wxSOCKET_INPUT_FLAG | wxSOCKET_LOST_FLAG ); sock->Notify( true ); m_numClients++; UpdateStatusBar(); } void MyFrame::OnSocketEvent( wxSocketEvent& event ) { wxString s = wxT( "OnSocketEvent: " ); wxSocketBase *sock = event.GetSocket(); // 打印消息 switch(event.GetSocketEvent()) { case wxSOCKET_INPUT : s.Append( wxT( "wxSOCKET_INPUT/n" ) ); break; case wxSOCKET_LOST : s.Append( wxT( "wxSOCKET_LOST/n" ) ); break; default : s.Append( wxT( "不可预知的时间!/n" ) ); break; } m_text->AppendText( s ); // 现在处理事件 switch(event.GetSocketEvent()) { case wxSOCKET_INPUT: { sock->SetNotify( wxSOCKET_LOST_FLAG ); // 开始运行哪一个test unsigned char c; sock->Read( &c, 1 ); switch (c) { case 0xBE: Test1(sock); break; case 0xCE: Test2(sock); break; case 0xDE: Test3(sock); break; default: m_text->AppendText( wxT( "从客户端收到不可预知的测试ID/n/n" ) ); } // 使输入事件再次变得有效。 sock->SetNotify( wxSOCKET_LOST_FLAG | wxSOCKET_INPUT_FLAG ); break; } case wxSOCKET_LOST: { m_numClients--; m_text->AppendText( wxT( "删除Socket。/n/n" ) ); sock->Destroy(); break; } default: ; } UpdateStatusBar(); } void MyFrame::UpdateStatusBar() { wxString s; s.Printf( wxT( "%d 个客户端连接。" ), m_numClients ); SetStatusText( s, 1 ); }

你可能感兴趣的:(编程,网络,server,socket,测试,delete)