19
sty
Turbo Fundusz
Napisany przezKiniu
Ostatni program na zaliczenie :( Aż się łezka w oku kręci… W zasadzie program jest bardzo prosty, ale zastosowaliśmy (bo pisaliśmy go we trójkę, popijając akademickie przysmaki) parę ciekawych rozwiązań: wielowątkowość, bazę SQL, łączenie przez Sockety i pobieranie najnowszego notowania, parsowanie HTML, rysowanie po Canvasie… A skąd się wziął pomysł na przycisk o takiejże nazwie? To długa historia…
Kilka ciekawszych fragmentów programu.
Pobranie najnowszego notowania funduszu
SELECT f.id fundusz_id, nazwa, wartosc, max_data FROM fundusz f LEFT JOIN ( SELECT DISTINCT fundusz_id, (SELECT MAX(DATA) FROM notowanie WHERE fundusz_id = n.fundusz_id) max_data, (SELECT wartosc FROM notowanie WHERE fundusz_id = n.fundusz_id AND DATA = max_data) wartosc FROM `notowanie` n ) t1 ON f.id = t1.fundusz_id
Łączenie się przez Socket
try { String host = "fundusze.wp.pl"; Socket nowyS = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); String request = "GET /typ,0,notowania.html HTTP/1.1\r\nHost:" + host + "\r\nConnection: Close\r\n\r\n"; Byte[] requestBytes = Encoding.ASCII.GetBytes(request); int bytes = 0; String page = ""; Byte[] bytesReceived = new Byte[256]; nowyS.Connect(host, 80); if (nowyS.Connected) { nowyS.Send(requestBytes); do { bytes = nowyS.Receive(bytesReceived, bytesReceived.Length, 0); page = page + Encoding.ASCII.GetString(bytesReceived, 0, bytes); } while (bytes > 0); } nowyS.Close(); dane = page; } catch (SocketException e) { MessageBox.Show("Błąd połączenia"); }
Parsowanie dokumentu
strona = strona.Substring(strona.IndexOf("<table class=\"tab\">")); strona = strona.Substring(0, strona.IndexOf("</table>")); string[] tab = strona.Split('\n'); int krok = 0; // 0 - szukam nazwy funduszu // 1 - szukam waluty // 2 - szukam wartosci string nazwa = ""; double wartosc = 0; List lista = new List(); for (int i = 0; i < tab.Length; i++) { switch(krok) { case 0: if (tab[i].IndexOf("checkbox") > -1) { nazwa = tab[i].Substring(tab[i].IndexOf("html\">") + 6); nazwa = nazwa.Substring(0, nazwa.IndexOf(">")); krok = 1; } break; case 1: if (tab[i].IndexOf("class=\"cas\"") > -1) { if (tab[i].IndexOf("PLN") > -1) krok = 2; else krok = 0; } break; case 2: if (tab[i].IndexOf("class=\"rt\"") > -1) { tab[i] = tab[i].Substring(15); tab[i] = tab[i].Substring(0, tab[i].IndexOf('<')); wartosc = Double.Parse(tab[i]); lista.Add(new Notowanie(-1, nazwa, wartosc, DateTime.Now.ToString())); krok = 0; } break; default: break; } } return lista;