MULTIPLATFORMNÍ PROGRAMOVÁNÍ – Přednáška č.8
wxWidgets – Streamové a socketové operace
Knihovna wxWidgets
Streamové a socketové operace
MULTIPLATFORMNÍ PROGRAMOVÁNÍ – Přednáška č.8
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
MULTIPLATFORMNÍ PROGRAMOVÁNÍ – Přednáška č.8
wxWidgets – Streamové a socketové operace
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
MULTIPLATFORMNÍ PROGRAMOVÁNÍ – Přednáška č.8
wxFileStream
wxWidgets – Streamové a socketové operace
wxStreamBase
wxInputStream
wxStreamBuffer
wxOutputStream
wxFileInputStream
wxFileOutputStream
wxMemoryInputStream
wxMemoryOutputStream
wxSocketInputStream
wxSocketOuputStream
wxZipInputStream
wxFilterInputStream
wxFilterOutputStream
wxZlibInputStream
wxZlibOutputStream
wxTextInputStream
wxTextOutputStream
MULTIPLATFORMNÍ PROGRAMOVÁNÍ – Přednáška č.8
wxWidgets – Streamové a socketové operace
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()
MULTIPLATFORMNÍ PROGRAMOVÁNÍ – Přednáška č.8
wxWidgets – Streamové a socketové operace
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()
MULTIPLATFORMNÍ PROGRAMOVÁNÍ – Přednáška č.8
wxWidgets – Streamové a socketové operace
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; }
MULTIPLATFORMNÍ PROGRAMOVÁNÍ – Přednáška č.8
wxWidgets – Streamové a socketové operace
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+" "); }
MULTIPLATFORMNÍ PROGRAMOVÁNÍ – Přednáška č.8
wxWidgets – Streamové a socketové operace
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()); }
MULTIPLATFORMNÍ PROGRAMOVÁNÍ – Přednáška č.8
wxWidgets – Streamové a socketové operace
Aplikace ve wxWidgets Program demonstruje použití streamů pro přístup k souborům uloženým na disku
MULTIPLATFORMNÍ PROGRAMOVÁNÍ – Přednáška č.8
wxWidgets – Streamové a socketové operace
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
MULTIPLATFORMNÍ PROGRAMOVÁNÍ – Přednáška č.8
wxWidgets – Streamové a socketové operace
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
MULTIPLATFORMNÍ PROGRAMOVÁNÍ – Přednáška č.8
wxWidgets – Streamové a socketové operace
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
MULTIPLATFORMNÍ PROGRAMOVÁNÍ – Přednáška č.8
wxWidgets – Streamové a socketové operace
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()
MULTIPLATFORMNÍ PROGRAMOVÁNÍ – Přednáška č.8
wxWidgets – Streamové a socketové operace
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()
MULTIPLATFORMNÍ PROGRAMOVÁNÍ – Přednáška č.8
wxWidgets – Streamové a socketové operace
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); }
MULTIPLATFORMNÍ PROGRAMOVÁNÍ – Přednáška č.8
wxWidgets – Streamové a socketové operace
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; }
MULTIPLATFORMNÍ PROGRAMOVÁNÍ – Přednáška č.8
wxWidgets – Streamové a socketové operace
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; }
MULTIPLATFORMNÍ PROGRAMOVÁNÍ – Přednáška č.8
wxWidgets – Streamové a socketové operace
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);
MULTIPLATFORMNÍ PROGRAMOVÁNÍ – Přednáška č.8
wxWidgets – Streamové a socketové operace
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(); }
MULTIPLATFORMNÍ PROGRAMOVÁNÍ – Přednáška č.8
wxWidgets – Streamové a socketové operace
Aplikace ve wxWidgets Program demonstruje použití socketových tříd pro zajištění komunikace po síti