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;

Napisz komentarz

You must be logged in to post a comment.