Knihovna wxwidgets Streamové a socketové operace
Streamové operace ve wxwidgets Co je to stream? Třída poskytující standardní rozhraní pro čtení a ukládání dat Nezáleží na původu a formátu dat Třída obsahuje sadu funkcí pro čtení a zápis dat a pro nastavování pozice v souboru dat Pomocí streamů lze pracovat s daty umístěnými v: souborech na disku paměti na síti socketu komprimovaném souboru
Streamové operace ve wxwidgets Streamy jsou v knihovně wxwidgets zapouzdřeny pomocí systému tříd. Struktura streamových tříd: wxstreambase, wxstreambuffer, wxfilestream wxinputstream wxfileinputstream wxmemoryinputstream wxsocketinputstream wxzipinputstream wxfilterinputstream, wxzlibinputstream wxoutputstream wxfileoutputstream wxmemoryoutputstream wxsocketoutputstream WxFilterOutputStream, wxzliboutputstream
wxfilestream wxstreambase wxstreambuffer wxinputstream wxoutputstream wxfileinputstream wxfileoutputstream wxmemoryinputstream wxmemoryoutputstream wxsocketinputstream wxsocketouputstream wxzipinputstream wxfilterinputstream wxfilteroutputstream wxzlibinputstream wxzliboutputstream wxtextinputstream wxtextoutputstream
Funkce pro práci se streamy Input streamy: wxinputstream GetC(), Peek() Read(void* buf, size_t len), Read(wxOutputStream& out) LastRead() SeekI(), TellI() Eof() Output streamy: wxoutputstream PutC() Write(void* buf, size_t len), Write(wxOutputStream& out) LastWrite() SeekO(), TellO()
Třídy pro textový vstup/výstup Vstup textu: wxtextinputstream Read8(), Read16(), Read32(), ReadDouble() ReadLine(), ReadString(), ReadWord() SetStringSeparator() Výstup textu: wxtextoutputstream Write8(), Write16(), Write32() SetMode(), GetMode() wxeol_native, wxeol_dos, wxeol_unix, wxeol_mac WriteDouble() WriteString()
Příklad použití streamů pro souborové operace Vytvoření textového souboru na disku a jeho naplnění daty // vytvoření výstupního souborového streamu wxfileoutputstream fout("data.txt"); // test, zda proběhlo vytvoření streamu v pořádku if(fout.ok()) // vytvoření textového streamu pro textový výstup do datového souboru wxtextoutputstream textout(fout); // nastavení koncù řádků dle operačního systému textout.setmode(wxeol_dos); // výpis textu do souboru textout.writestring("do souboru uložíme 10 čísel typu Uint16:\n"); // uložení deseti 16ti bitových čísel do souboru wxuint16 number = 0; for(int i = 0; i < 10; i++) number++; textout.write16(number); textout.writestring("\n"); } // výstup textu pomocí standardního streamového operátoru << textout << "Tento řetězec byl uložen pomocí operátoru '<<'" << endl; }
Příklad použití streamů pro souborové operace Načtení textového souboru z disku // načtení dat ze souboru a jejich vložení do mema wxfileinputstream fin("data.txt"); // test, zda proběhlo vytvoření streamu v pořádku if(fin.ok()) // vytvoření textového streamu pro čtení ze souboru wxtextinputstream textin(fin); // načtení textu ze souboru a výpis textu do mema myframe->memo->appendtext(textin.readline()+"\n"); // načtení deseti čísel ze souboru a jejich výpis do mema wxuint16 number; wxstring out; for(int i = 0; i < 10; i++) number = textin.read16(); out.printf("%d\n", number); myframe->memo->appendtext(out); } // načtení textu ze souboru a výpis textu do mema while(!fin.eof()) textin >> out; myframe->memo->appendtext(out+" "); }
Příklad použití streamů pro souborové operace Zápis dat do komprimovaného souboru // vytvoření výstupního souborového streamu wxfileoutputstream fcout("compresseddata.txt"); // test, zda proběhlo vytvoření streamu v pořádku if(fcout.ok()) // vytvoření streamu pro uložení komprimovaného souboru wxzliboutputstream compout(fcout, 6); // uložení obsahu mema do komprimovaného souboru wxstring data = myframe->memo->getvalue(); compout.write((void*)data.getdata(), data.len()); }
Aplikace ve wxwidgets Program demonstruje použití streamů pro přístup k souborům uloženým na disku
Socketové objekty a operace Socketové operace a objekty slouží k zajištění komunikace mezi aplikacemi prostřednictvím síťového propojení (LAN, Internet, ) a s jejich pomocí lze velmi jednoduše vytvářet aplikace Client/Server Server Client 1 Client 2 Client n
Socketové objekty a operace Socketové operace jsou v knihovně wxwidgets zapouzdřeny v několika základních třídách: wxsocketbase wxsocketclient wxprotocol wxftp wxhttp wxsocketserver wxsocketevent wxurl
Základní třída wxsocketbase Funkce pro vytváření socketů Obsahuje velké množství funkcí pro: Vytváření socketu Zjišťování stavu socketu Základní I/O funkce I/O funkce I/O funkce s čekáním Funkce pro nastavení chování I/O operací Obsluhu událostí socketu wxsocket_connection wxsocket_lost wxsocket_input wxsocket_output
Třída wxsocketserver Třída slouží jako komunikační server Umožňuje akceptovat příchozí požadavky na spojení Pomocí členských funkcí své mateřské třídy wxsocketbase a systému socketových událostí umožňuje komunikovat s připojenými klienty Při vytváření serveru specifikujeme jeho adresu (IP) a port, pomocí něhož budeme se serverem komunikovat wxipv4address Hostname() Service() LocalHost()
Třída wxsocketclient Třída slouží jako klient při komunikaci klient/server Umožňuje vyhledávat servery a připojovat se k nim Pomocí členských funkcí své mateřské třídy wxsocketbase a systému socketových událostí umožňuje komunikovat se serverem Při vytváření klienta specifikujeme jeho adresu (IP) a port, pomocí něhož budeme komunikovat se serverem wxipv4address Hostname() Service() LocalHost()
Příklad socketů - Server Vytvoření serveru a správce socketových událostí wxsocketserver *m_server; // vytvoření adresy serveru (není-li specifikováno jinak, je to localhost wxipv4address addr; // určení čísla komunikačního portu addr.service(3000); // vytvoření socketového serveru m_server = new wxsocketserver(addr); // test na uspěšnost vytvoření server if (m_server->isok()) // nastavení správce událostí serverových událostí m_server->seteventhandler(*this, SERVER_ID); // budeme reagovat na událost příchozího požadavku na připojení m_server->setnotify(wxsocket_connection_flag); // povolení správce událostí m_server->notify(true); }
Příklad socketů Server (2) Vytvoření serveru a správce socketových událostí // obsluhy socketových událostí void OnServerEvent(wxSocketEvent& event); void OnSocketEvent(wxSocketEvent& event); BEGIN_EVENT_TABLE(MyFrame, wxframe) EVT_SOCKET(SERVER_ID, MyFrame::OnServerEvent) EVT_SOCKET(SOCKET_ID, MyFrame::OnSocketEvent) END_EVENT_TABLE() // obsluha události serveru void MyFrame::OnServerEvent(wxSocketEvent& event) wxsocketbase *sock; switch(event.getsocketevent()) case wxsocket_connection: sock = m_server->accept(false); sock->seteventhandler(*this, SOCKET_ID); sock->setnotify(wxsocket_input_flag wxsocket_lost_flag); sock->notify(true); break; }
Příklad socketů Server (3) Vytvoření serveru a správce socketových událostí // událost socketu void MyFrame::OnSocketEvent(wxSocketEvent& event) unsigned char c; // můžeme mít libovolný počet soketů musím získat ukazatel na ten pravý wxsocketbase *sock = event.getsocket(); // Reakce na události socketu switch(event.getsocketevent()) case wxsocket_input : // provedu operace čtení dat // zakážu další udásti příchodu dat (až do zpracování současných dat) sock->setnotify(wxsocket_lost_flag); sock->read(&c, 1); // znovu povolím událost příchodu dat sock->setnotify(wxsocket_lost_flag wxsocket_input_flag); break; case wxsocket_lost : // provedu operace při ztrátě spojení sock->destroy(); break; }
Příklad socketů Klient Vytvoření klienta a jeho připojení na server wxsocketclient *m_sock; // obsluha událostí socketu void OnSocketEvent(wxSocketEvent& event); BEGIN_EVENT_TABLE(MyFrame, wxframe) EVT_SOCKET(SOCKET_ID, MyFrame::OnSocketEvent) END_EVENT_TABLE() // vytvoření soketu m_sock = new wxsocketclient(); // Nastavení správce událostí soketu m_sock->seteventhandler(*this, SOCKET_ID); // budeme podporovat události připojení k serveru, příchozích dat a ztráty spojení m_sock->setnotify(wxsocket_connection_flag wxsocket_input_flag wxsocket_lost_flag); m_sock->notify(true);
Příklad socketů Klient (2) Vytvoření klienta a jeho připojení na server // otevření spojení wxipv4address addr; addr.hostname(hostname); addr.service(3000); m_sock->connect(addr, FALSE); m_sock->waitonconnect(10); // čekám 10s, zda se zdaří připojení if (m_sock->isconnected()) // spojení bylo úspěšně otevřeno } else // nezdařilo se spojení se serverem m_sock->close(); }
Aplikace ve wxwidgets Program demonstruje použití socketových tříd pro zajištění komunikace po síti