You are on page 1of 40

Visoka tehnička škola -Niš

Seminarski rad
Osnovni pojmovi vizuelnog programiranja u
programskom jeziku Visual C# 2008

Predmet : NET programiranje

Mentor : Student :
mr Zoran Veličković Nikola Lukić
br.indeksa R-48

1
Sadržaj :

1.Uvod………………………………………………………….1
1.1.Opsti uvod...........................................................................1
1.2.Opis teme rada....................................................................2
2.1. Vežba 1 : Osnove rada u konzoli…………………..…….3
2.1.1. Cilj vežbe........................................................................3
2.1.2 Zadatak vežbe..................................................................3
2.1.3 Realizacija vežbe.............................................................3
2.2.Vežba 2: Rad sa uslovnom petljom grananja....................5
2.2.1. Cilj vežbe........................................................................5
2.2.2 Zadatak vežbe..................................................................5
2.2.3 Realizacija vežbe.............................................................5
2.3.Vežba 3: Kreiranje padajućeg menija...............................8
2.3.1. Cilj vežbe........................................................................8
2.3.2. Zadatak vežbe.................................................................8
2.3.3. Realizacija vežbe............................................................8
2.4.Vežba 4 : Osnove rada sa klasama……….….….………10
2.4.1. Cilj vežbe.........................................................................10
2.4.2. Zadatak vežbe..................................................................10
2.4.3. Realizacija vežbe.............................................................10
2.5.Vežba 5: Rad sa tajmer (timer) kontrolom…..……….…12
2.5.1.. Cilj vežbe........................................................................12
2.5.2. Zadatak vežbe..................................................................12
2.5.3. Realizacija vežbe.............................................................12
2.6. Vežba 6 : Rad sa tekstualnim fajlovima ….………….….17
2.6.1. Cilj vežbe........................................................................17
2.6.2 Zadatak vežbe..................................................................17
2.6.3 Realizacija vežbe.............................................................17
2.7.Vežba 7 : Rad sa Grafičkim interfejsom ……….…….…20
2.7.1. Cilj vežbe.........................................................................20
2.7.2. Zadatak vežbe..................................................................20
2.7.3. Realizacija vežbe.............................................................20
2.8.Vežba 8 : Osnove internet programiranja…………......…24
2.8.1. Cilj vežbe.........................................................................24
2.8.2. Zadatak vežbe....................................................................24
2.8.3.1. Realizacija vežbe (Server deo) ......................................24
2.8.3.2..Realizacija vežbe (Klijent deo)……………..….………31
3. Zaključak……………..…..…………………………..….…….36
4. Dokumentacija .……………….………..………………….…….……37

2
1.Uvod

1.1.Opsti uvod

U ovom radu bavićemo se isključivo programskim jezikom Microsoft Visual


C# 2008 (Express Edition). Express Edition je besplatna licencirana vezija ovog
programskog jezika. Ono što izdvaja ovaj programski jezik jeste to da se u njemu mogu
pisati konzolne (DOS) aplikacije, windows aplikacije, aplikacije za web i klase. Ovu
osobinu je nasledijo od izvrsnog širokog koncepta jezika Visual C++. C# (Csharp) je
objektno orijentisan jezik i kao svaki drugi takav sistem sastoji se iz više različitih
objekata koji mogu imati iste slične ili potpuno specifične osobine. Te osobine se
nazivaju i atributima. Pored osobina objekti imaju i svoju funkcionalnost (skup
funkcija) koju navivamo metodama.
Možemo reći da se programiranje korišćenjem objekno orijentisane paradigme
sastoji od sledecih koraka :

-Identifikovanja objekta
-Identifikovanja atributa objekata kao i njihovih vrednosti
-Identifikovanje funkcionalnosti objekta
-Klasifikacija objekata prema atributima i funkcionalnosti u kategorije ili klase .
-Rezultat klasifikacije je definicija klase
-Identifikovawe komunikacije između objekata

Pojavom windows aplikacija i operativnog sistema tj. windows programiranja i


razvojem objektno orijentisane paradigme nastao je novi razvojni sistem koji pruža
mogućnosti brzog razvijanja aplikacija. Aplikacija se posmatra kao interfejs sastavljen
od više formi na kojima se nalaze kontrole. Korisnik pokreće aplikaciju koja očekuje
od korisnika akciju tj. izazvan događaj.(eng. Event). Ovaj način programiranja naziva
se programiranje vođeno događajima.

Prava pristupa ko može i kom podatku pristupa određuje se modifikatorima


pristupa :

-private
-public
-protected
-protected internal
-internal

Ako niko spolja netreba da prisupi članu klase onda se on def. kao privatni. Da
treba biti dostupan svima onda je definisan kao javan. Zaštićeni član je dostupan samo
unutar svoje matične klase. Internal ili interni član je dostupan samo unutar tog
programa.[2]

3
1.2.Opis teme rada

Rad se sastoji od 8 vežbi od kojih se svaka sastoji od sledeće forme :

- Cilj vežbe (sadržaće šta smo postigli u datoj vežbi).


- Zadatak vežbe (u kom će biti opisano u kratkim crtama šta se generalno zahteva u
datoj vežbi).
- Realizacija vežbe (razvrstana po koracima sa izvornim kodom date vežbe ,
opisom u vidu komentara i slika) .

Teme koje se provlače kroz ovoj rad biće usklađene sa početničkim znanjima
o vizuelnom programiranju. Od prve do osme vežbe obradićemo konzolne DOS
aplikacije, klase, uslovne petlje ili selekcije, grafičkog interfejsa, klijent server
aplikaciju. U polju realizacije vežbe ispod svakog zadatka postojaće izvorni kod po
principu primera. Npr. u zadatku piše da treba nacrtati kvadrat pomoću četiri linija
u polju za izvorni kod biće napisan kod kako nacrtati dve linije. U suštini najveći
deo biti detaljno obisan. Takođe u polju realizacije nalaziće se i slike formi kao
pomoć kako bi trebalo izvesti određeni zadatak. Izvorni kod sadrži komentare koji
direkno za svaku ključnu liniju koda opisuju istu. Pažnja je skrenuta i na sintaksu
jezika tako za razliku od Visual Basic-a programski jezik C# pravi razliku između
malih i velikih slova tako da mala nepažnja dovodi do greške. Vežbe su
raspoređene po principu od osnovnijeg ka složenijem primeru.

Da bi tekst bio što koncizniji uveo sam par pravila :


-Ako se u tekstu pominju imena formi i objekta onda su sa svojstvom italic npr.
Glavnaforma. Što znači da forma u projektu nosi takvo ime.
-Kad su u pitanju same vrednosti promenjivih onda su to bold italic slova. Npr.
ovojesifra .Primetili ste da nisam koristijo slovo š u reči šifra jer je mnogo teže
pisati kod sa ćiriličnim pismom nego u latiničnom. Jer ćirilična slova zauzimaju
mesto glavnih karaktera koji se koriste u sintaksi C# programskog jezika.
U zadnjoj vežbi obrađena je oblast internet programiranja. Radi se o temi
Klijent-Server aplikacija. Zbog kompleksnosti zadatka izvorni kod biće apsolutno
kompletan i ispisan komentarina kako bi što bolje bio objašnjen. Zaključno sa 8.
vežbom prešli smo sve važnije oblasti i obradili nekoliko zanimljivih zadataka.

4
2.1. Vežba 1 : Osnove rada u konzoli
(Dos ili MsPrompt prozor)

2.1.1.Cilj vežbe :

Upoznavanje sa sintaksom programskog jezika C#. Dodeljivanje vrednosti


promenjivim i prikaz na ekranu istih.

2.1.2.Zadatak vežbe :

Zahtev za unos podataka i prikaz istih na ekranu.

2.1.3.Realizacija vežbe :

Korak 1: Otvoriti novi projekat tipa konzola aplikacija sa nazivom Vezba1.


Definisati promenjivu Student i brtel tipa string. Napisati algoritam za unos imena
studenta, broj telefona i prikazati unete podatke na ekranu kao na slici 1.

Slika 1.1

5
Izvorni kod :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Vezba1
{
class Program
{
static void Main(string[] args)
{
string Student, brtel; // Def dve promenjive u jednoj liniji
Console.WriteLine("********************************");
Console.WriteLine("* Visoka tehnicka skola nis c# *");
Console.WriteLine("********************************");
// Pokupiti podatke , unos
Console.Write("Ime studenta : ");
Student = Console.ReadLine();
Console.Write("Broj telefona: ");
brtel = Console.ReadLine();
Console.WriteLine();
// Prikazati unete podatke
Console.WriteLine("====================================");
Console.WriteLine("-/- Podaci su uneti i prikazani -/-");
Console.WriteLine("====================================");
Console.Write("Student : ");
Console.WriteLine(Student );
Console.Write("Broj telefona : ");
Console.WriteLine(brtel );
Console.WriteLine("====================================\n");
Console.ReadLine();}}}
// Kraj izvornog koda Vezbe1

Dodatni primer naprednog programirawa u konzoli c# :


using System;
using System.Threading;

public class VremenskiTest {


public class Mojaposla {
public int brojpomavljanja=1;
public void Pokreni() {
for(int i=0;i<brojpomavljanja ;i++) {
Thread.Sleep(1000);
Console.WriteLine(Thread.CurrentThread.Name);
}
}
}
public static void Main(string[] args) {
Mojaposla mojaposla1 = new Mojaposla ();
mojaposla1.brojponavljanja =5;
Thread thread = new Thread(new ThreadStart(mojaposla1.Pokreni ));

6
thread.Name = "Prosla je sekunda.....";
thread.Start();
}}
2.2.Vežba 2 : Rad sa uslovnom petljom (grananje ili selekcija)

2.2.1.Cilj vežbe :

Upoznavanje sa formama i njenih osnovnih osobina, prenošenje vrednosti iz


forme u formu. U primeru je obrađena IF struktura sa jednim i dva uslova korišćenjem
operatora za rad sa bitovima. Videli smo kako od unete vrednosti zavisi dalji tok
programa.

2.2.2.Zadatak vežbe :

Napisati program koji zahteva unos imena i šifre (log in) da bi se prikazala
forma. Na novoj formi realizovati zahtev za unos dve šifre da bi se prikazala treća
forma. Ovaj zadatak realizovati pomoću tekst boksova i komandnih dugmeta.

2.2.3.Realizacija vežbe :

Korak 1 : Otvoriti projekat windows aplikacija pod imenom Vežba2. Pored


Forma1 insertovati formu Forma2 i Forma3.

Korak 2: U formi Forma1 postaviti sledeće objekte: Dva objekta tekstboks sa


imenima - Ime , Šifra. Jedno komandno dugme dugme sa imenom - Proveri i natpisom
Proveri. Uneti objekte label za opis tekstualnih boksova.

Korak 3 : Realizovati u polju koda dugmeta Proveri pomoću IF petlje


algoritam koji proverava tačnost unete vrednosti u tekstboks Šifra sa vrednošću
ovoješifra. U slučaju da je uneta vrednost u textbox Šifra ovoješifra prikazati formu
Forma2 i sakriti formu Forma1. U slučaju da vrednost nije istinita prikazati poruku :
-Uneta šifra je pogrešna!!!- ..Kao na slici 1.1.

7
Slika1.1 . Slučaj da je sifra pogrešna (Forma1)

Izvorni kod :
private void proveri_Click(object sender, EventArgs e)
{
if (sifra.Text == "ovojesifra")
{ // uslov je ispunjen u tekst boks sifra uneto je "ovojesifra"
// i prikazace se forma Forma3
Forma2 frm2 = new Forma2();
frm2.Tag = this.Ime.Text;
frm2.Show();
this.Hide ();
}
else
{//slucaj da sifra nije uneta ispravna pojavljuje se poruka u msgboksu
MessageBox.Show("Uneta sifra je pogresna!!!");
}}

Korak 4 : U formi Forma2 postaviti sledeće objekte :

-Tri kontrole tekstboks sa imenima - Ime , Šifra1 , Šifra2


-Jedno komandno dugme sa imenom - Proveri i natpisom Proveri
-Kao i dugme za prekid aplikacije.

Slika1.2 Forma Forma2

Korak 5 : Realizovati u polju koda dugmeta Proveri pomoću uslovne petlje

8
algoritam koji proverava tačnost unete vrednosti u teksboks Šifra1 sa vrednoću
ovoješifra1 i u tekstboks Šifra2 sa vrednoću ovoješifra2. Ako su obe vrednosti ispunile
tačnost prikazati formu Forma3 i sakriti formu Forma2.

Korak 6 : Obezbediti da se svojstvo tekst forme Forma3 pri učitavanju promeni


u vrednost Ime.text iz forme Forma1 i isto tako za Ime.text iz forme Forma2.

Slika 1.3 Konačna forma Forma3

Izvorni kod :

private void Proveri_Click(object sender, EventArgs e)


{
if (Sifra1.Text == "ovojesifra1" && Sifra2 .Text == "ovojesifra2")
{ // uslov je ispunjen u tekst boks sifra1 uneto je "ovojesifra1"
// i u tekst boks sifra2 uneto je ovojesifra2
// i prikazace se forma Forma3
Forma3 frm3 = new Forma3();
frm3.Tag = this.Ime.Text;//ovom linijom obezbedjujemo da se u forma3
// u svojstu text pojavi vrednost uneta u ime.text iz forme2
frm3.Show(); // prikazi formu3
this.Close(); // Zatvoriti formu2
}
else
{//slucaj da sifra nije uneta ispravna pojavljuje se poruka u msgboksu
MessageBox.Show("Uneta sifra je pogresna!!!");
}
}
private void button1_Click(object sender, EventArgs e)
{
Application.Exit();{//Kraj celog programa
}

9
2.3.Vežba 3 : Kreiranje padajućeg menija

2.3.1.Cilj vežbe :

Upoznavanje svojstva forme, pokazati prednosti kod korišćenja padajućeg


menija. Pokazati da jedno svojstvo možemo postaviti na više načina (ili usled
učitavanja forme ili usled promene nekog drugog svojstva).

2.3.2.Zadatak vežbe :

Kreirati padajući meni na formi preko kojeg biramo koje će se nove forme
prikazati. Pokazati modalni i nemodalni prikaz formi. Koristiti skraćenice tastature.
Manuelno i automacki maksimizirati nove forme.

2.3.3.Realizacija vežbe :

Korak 1 : Otvoriti projekat windows aplikacija pod imenom Vežba3 i


preimenovati Form1 u Glavnaforma. Realizovati na glavnoj formi sledeću strukturu
padajućeg menija :

1. Koreni meni : Prikazati1, podmeni:(Forma 1 , Forma 2 , Kraj programa )


2. Koreni meni : Prikazati2, podmeni:(Forma3 , Forma 4 )

Slika1. Prikaz padajućeg menija

10
Korak 2 : Kreirati za svaku stavku padajućeg menija istoimenu formu sem za Kraj
programa za koju treba napisati kod prekida aplikacije.

Korak 3 : Forme iz stavke menija Prikazati1 prikazati u modalnom obliku a


sve ostale forme prikazati u nemodalnom obliku.

Izvorni kod :
private void forma1ToolStripMenuItem_Click(object sender, EventArgs e)
{
Forma1 frm1 = new Forma1();
frm1.ShowDialog();//modalni prikaz forme1
}
private void forma2ToolStripMenuItem_Click(object sender, EventArgs e)
{ // Modalni prikaz forme2 , metoda ShowDialog()
Forma2 frm2 = new Forma2();
frm2.ShowDialog();
}
private void forma3ToolStripMenuItem_Click(object sender, EventArgs e)
{ // Nemodalni prikaz nove forme pomoću metode Show
Forma3 frm3 = new Forma3();
frm3.Show();
}
private void forma4ToolStripMenuItem_Click(object sender, EventArgs e)
{ // Nemodalni prikaz nove forme
Forma4 frm4 = new Forma4();
frm4.Show();
}

Korak 4 : Postaviti skraćenice sa tastature kombinacijom ALT + podvučeno


slovo iz stavke menija.

Korak 5 : Formama Forma3 i Forma4 postaviti WindowState osobinu na


vrednost Maximazed i to za formu Forma3 u okviru događaja Forma3_load() a za
formu Forma4 preko dugmeta button1 i Click događaja.

Izvorni kod :
private void Forma3_Load(object sender, EventArgs e)
{//postavljamo vrednost za maksimiziranje forme i to u dogadjaju
//form_load

this.WindowState = FormWindowState.Maximized;
}

private void button1_Click(object sender, EventArgs e)


{// po pritisku na dugme forma Forma4 se razvlaci po celom ekranu
this.WindowState = FormWindowState.Maximized;

11
2.4.Vežba 4 : Osnove rada sa klasama

2.4.1.Cilj vežbe :

Pokazati kako se generiše jedna javna klasa dodeljujući joj promenjive


koristeći sve vrste modifikatora pristupa. Napisati konstruktor, funkciju i podfunkciju.
Pozvali smo jednu podrutinu. Klase nisu vidljivi objekti kao što su to forme, mogu se
pozivati iz drugih programa ako su definisane kao javne. Mi smo našu klasu pokrenuli
preko konzole tj. njene glavne funkcije. Videli smo da svaka klasa mora imati samo
jednu glavnu funkciju.

2.4.2.Zadatak vežbe :

Napisati klasu koja sadrži dodeljene promeljive svih vrsta modifikatora


pristupa. Napisati minimum jedan konstruktor sa jednim argumentum. Napisati jednu
funkciju sa povratnom vrednošću. Napisti primer dodeljivanja vrednosti definisanim
promenjivim i prikazati na ekranu. Iz glavnog programa pozvati jednu podfunkciju.
Realizovati prikaz kao na slici 1.1.

2.4.3.Realizacija vežbe :

Korak 1 : Otvoriti novi projekat tipa Class i generisati javnu klasu Produkt i u
njoj sledeće promenjive :

public string napravljen;


protected internal string model;
internal string boja ;
protected int konjskasnaga = 150;
private int GodinaPro;

Napisati javnu funkciju tipa int sa imenom DajmiGodPro() sa povratnom


vrednošću GodinaPro .
Napisati konstruktor PostaviGodPro(int godina) u kome dodeljujemo vrednost
this.GodinaPro = godina ;
public void PostaviGodPro(int godina)
{
this.GodinaPro = godina ; //konstruktor
}
public int Dajmigodpro()

12
{
return GodinaPro ; //dobiti podatak o god proizvodnji
} //Funkcija mora imati makar jednu povratnu vrednost

Napisati podrutinu public void Start() , koji štampa “ Motor uključen , pritisni
enter za kraj”
Korak 2 : Generisati klasu class MainClass i u njoj napisati glavnu funkciju
public static void Main(). U glavnoj funkciji postaviti sledeće vrednosti i napisati kod
za prikaz dodeljenih vrednosti:

Produkt produktAuto = new Produkt();


produktAuto.napravljen = "Zastava Kragujevac";
produktAuto.model = "Yugo koral";
produktAuto.boja = "black";
produktAuto.PostaviGodPro (1985);
System.Console.WriteLine("Napravljen od strane firme" +
produktAuto.napravljen);
System.Console.WriteLine("Oznaka Modela = " + produktAuto.model);
System.Console.WriteLine("Boja automobila = " + produktAuto.boja);
System.Console.WriteLine("Gidina proizvodnje = " +
produktAuto.Dajmigodpro());
produktAuto.Start();
System.Console.ReadLine();

Korak 3: Aplikaciju pokrenuti kao konzolu i prikazati gore navedene vrednosti.


Pozvati podrutinu Start() iz klase Produkt.

Slika 1.1.

Napomena :

Da smo pokušali koristiti u glavnoj funkciji promenjivu konjskasnaga videli bi smo


da nebi bilo dozvoljeno jer je def. kao zaštićena i može se koristiti samo u svojoj
matičnoj klasi.

13
Da smo našu klasu nazvali Produkt1 onda bi linija koda
Produkt produktAUTO = new Produkt(); izgledala kao :
Produkt1 produktAUTO = new Produkt1();

2.5.Vežba 5 : Rad sa tajmer (timer) kontrolom

2.5.1.Cilj vežbe :

Upoznati se sa velikim prednostima korišćenja kontrole tajmer. Naučiti


pozivanje ugrađene funkcije vremena. Pokazati osnove rada sa listboks kontrolom.
Kako manipulisati sistemskim datumom i vremenom dodeljivanjem njihove vrednosti
promenjivima.

2.5.2.Zadatak vežbe :

Napisati aplikaciju (koristeći strukturu padajućeg menija) koja prikazuje vreme,


realizuje štopericu i princip odbrojavanja od zadatog vremena do nule.

2.5.3.Realizacija vežbe :

Korak 1 : Otvoriti projekat windows aplikacija pod imenom Vežba3 I


preimenovati Form1 u Glavnaforma. Realizovati na glavnoj formi sledeću strukturu
padajućeg menija :

1.Koreni meni : Izaberi, podmeni :(Prikaži vreme i datum ,štoperica ,Odbrojavanje,


Kraj programa).

Preko stavki menija aktivirati (modalno) nove forme i to za :


-Prikaži vreme i datum : formu pod imenom Vreme .
-Odbrojavawe : formu pod imenom Odbrojavanje.
-Štoperica : formu pod imenom Stoperica .

Korak 2 : Formi Vreme postaviti sledeće kontrole : 1 Tajmer , 1 label. Brojaču


postaviti osobinu interval na vrednost 100 i osobinu enabled na true (što znači da će
se njegova podfunkcija izvršavati svakih 100 mili sekundi). Obezbediti prikaz vremena
preko vrednosti kontrole label1.text. Kao na slici 1.1..

14
Slika1.1.Prikaz vremena
Izvorni kod :

private void timer1_Tick(object sender, EventArgs e)


{// ovde obezbedjujemo da nam se pojavi vreme i datum zajedno
// ~Koristili smo metodu ToString da bi mogli da dodelimo
// vrednost objektu label1
label1.Text = DateTime.Now.ToString();}

Korak 3 : U formi Odbrojavanje postaviti sledeće kontrole :


- 3 tekstboksa, 2 komandna dugmeta, 3 label kontrole i timer1(enabled = false).
Definisati privatne promenjive sekunde, minuti i sati tipa integer. Postaviti
Timer1.interval = 1000. Preko komandnog dugmeta 1 aktivirati vremenski brojač
preko kojeg se vrši odbrojavanje do nule. Tekstboksove koristiti kao vizuelni prikaz
stanja odbrojavanja. Kad vrednosti sekunde, minuti i sati postignu vrednost nula
aktivirati poruku : „Vreme je isteklo!!!“.

Slika 1.2 Zadali smo željeno vreme

15
Slika 1.3 Zadato vreme je isteklo pojavljuje se poruka

Izvorni kod :
private int sekunde;//neophodno je definisati promenjive tipa integer
private int minuti; // radi korišćenja ugrađene klase datetime
private int sati;
private void timer1_Tick(object sender, EventArgs e)
{
if (sekunde == 0 & minuti == 0 & sati == 0)
{
timer1.Enabled = false; // kad se ispuni uslov tajmer prestaje sa
MessageBox.Show("Vreme je isteklo");//radom I pojavljuje se poruka
}
if (sekunde == 0 & minuti == 0 & sati != 0)
{ // relacioni operator != znači nejednak
sati--;//Dekrement sati jer su sekunde I minuti istekli
// a sati ima još
textBox3.Text = sati.ToString();
minuti = 59; //rasitnili smo jedan sat
sekunde = 59;
textBox2.Text = minuti.ToString();//dodeljivanje vrednosti radi
//prikaza vrednosti promenjivih tipa string
textBox1.Text = sekunde.ToString();
}
if (sekunde == 0 & minuti != 0)
{
minuti--; //sati su istekli ,sekunde su istekle
//ali minuta ima jos
textBox2.Text = minuti.ToString ();
sekunde = 59;
textBox1.Text = sekunde.ToString ();
}
sekunde--;//ostale su još sekunde za odbrojavanje
textBox1.Text = sekunde.ToString();
}
private void button1_Click(object sender, EventArgs e)

16
{
timer1.Enabled = true;
sekunde = System.Int32.Parse(this.textBox1.Text);
//dodeljivanje vrednosti promenjivim kreće odbrojavanje Metoda
parse //omogućuje da se vrednosti tekst boksova orijentišu na tip
integer
minuti = System.Int32.Parse(this.textBox2.Text);
sati = System.Int32.Parse(this.textBox3.Text);
}
private void button2_Click(object sender, EventArgs e)
{ sekunde = 0 ;
minuti = 0 ;
sati = 0;
//Isključuje se tajmer , vrednosti se vraćaju na nulu
textBox1.Text = sekunde.ToString();
textBox2.Text = minuti.ToString();
textBox3.Text = sati.ToString();
timer1.Enabled = false;
}

Korak 4 : U formi Stoperica postaviti sledeće kontrole : 3 komandna dugmeta,


1 tajmer , 1 listboks i 4 label kontrole. Definisati 4 promenjive tipa int i to sledeće :
desetinke , sekunde , minute i sati. Ove promenjive prikazivati preko 4 label kontrola.
Prvo komandno dugme koristiti za zabeležavanje trenutnog prošlog vremena i to u
listboksu, drugo dugme za inicijalizaciju promenjivih tj. postavljanje vrednosti na 0 i
pokretanje tajmera u kom treba realizovati algoritam stoperice. Treće dugme iskoristiti
za gašenje tajmera i prekid rada stoperice. Projekat realizovati kao na slici 1.4..

Slika1.4. Po pritisku na dugme start počinje je brojanje vremena

17
Izvorni kod :

private void button2_Click(object sender, EventArgs e)


{//Očistiti listboks ,sve vrednosti promnjivih
listBox1.Items.Clear();
sati = 0;
sekunde = 0;
minuti = 0;
label1.Text = "0";
label2.Text = "0";
label3.Text = "0";
timer1.Enabled = true;
}
private void button1_Click(object sender, EventArgs e)
{// pritisak na dugme unosimo trenutne vrednosti promenjivih
listBox1.Items.Add(label3.Text + " sati " + label2.Text + " minuta "
+ label1.Text + " sekunda " + label4 .Text + " desetinki ");
}
private void button3_Click(object sender, EventArgs e)
{// prekid rada stoperice
timer1.Enabled = false;
}

private void timer1_Tick(object sender, EventArgs e)


{
if (desetinke > 8) // zaostatak od dve desetinke iz razloga
{ // sto iteracija petlje zahteva neko malo vreme
sekunde++;
desetinke = 0;
}
if (sekunde > 59)
{
minuti++;
sekunde = 0;
}
if (minuti > 59)
{
sati++;
minuti = 0;
}
desetinke++;
label4.Text = desetinke.ToString();
label1.Text = sekunde.ToString();
label2.Text = minuti.ToString();
label3.Text = sati.ToString();
}

18
2.6. Ve`ba 6 : Rad sa tekstualnim
fajlovima

2.6.1.Cilj vežbe :

Ostvarivanje programa koji radi sa tekstualnim fajlovima i to čitanje i upis red


po red. Naučiti korišćenje ugrađene klase StreamWriten i StreamReader. Ovaj primer
nam daje dalje ideje kao što su organizovanje podataka po rednom broju linije upisa.
Tako možemo od tekstualnog fajla napraviti bazu podataka.

2.6.2.Zadatak vežbe :

Napraviti aplikaciju koja vrši unos po principu linija po linija u tekstualni fajl i
po istom principu vrši čitanje iz fajla.

2.6.3.Realizacija vežbe :

Korak 1: Otvoriti projekat vindovs aplikacija pod imenom Vežba8 i


preimenovati Form1 u Glavnaforma. Pored već definisanih biblioteka koje koristi
obično windows aplikacija dodati i biblioteku using System.IO; Preko nje možemo
koristiti klasu StreamWriten i StreamReader. Realizovati na glavnoj formi sledeću
strukturu padajućeg menija :

1.Koreni meni : Izaberi, podmeni: (Zapisivanje u tekstualni fajl, Čitanje iz


tekstualnih fajlova, Kraj programa).

19
Kreirati dodatne forme Unos, Citanje i prikazati ih modalno preko stavki
padajućeg menija .

Korak 2: Tekstualni fajl koji ćemo koristiti i za unos i za čitanje nazvaćemo


filetext.txt (nemoramo ga kreirati mi ,samo pozivanje metode pisanja kreiraće
tekstualni fajl). U formi Unos insertovati 2 tekstboksa i jedno komandno dugme sa
natpisom Unesi. Na pritisak dugmeta zapisati u tekstualni fajl sledeće linije :

Uneta je prva linija .


Uneta je druga linija.

Ispisati i treću i četvrtu liniju i to sadržajem tekstualnih boksova. Obezbediti da


nakon pritiska na dugme i unosa u tekstualni fajl sadržaj tekstboksova bude izbrisan.
Realizovati formu kao na slici 1.1..

Slika 1.1.Dugme još uvek nije pritisnuto

[3] Izvorni kod :

private void button1_Click(object sender, EventArgs e){


StreamWriter streamWriter1 = new StreamWriter("filename.txt");
// definisemo klasu i ime fajla
streamWriter1.WriteLine("Uneta je prva linija ");

20
streamWriter1.WriteLine("uneta je druga linija .");
streamWriter1.WriteLine(textBox1.Text);
streamWriter1.WriteLine(textBox2.Text);
if (streamWriter1 != null)
streamWriter1.Close();// zatvaranje klase i fajla
textBox1.Text = "";// brisanje sadrzaja
textBox2.Text = "";}

Korak 3 : U formi Citanje insertovati kontrolu listbox1 i jedno komandno


dugme sa natpisom Čitaj. Na pritisak dugmeta pročitati sadržaj iz tekstualnog fajla i
prikazati preko kontrole listboks kao na slici 1.2.

[3] Izvorni kod :

private void button1_Click(object sender, EventArgs e)


{StreamReader sr = new StreamReader("fileName.txt");
string line;
listBox1.Items.Clear();
while ((line = sr.ReadLine()) != null)
{listBox1.Items.Add(line);}
if (sr != null) sr.Close();}

21
Slika 1.2. Prikaz sadržaja tekstualnog fajla

2.7. Vežba 7 : Rad sa Grafičkim interfejsom

2.7.1.Cilj vežba :

Naučiti kreiranje i koričćenje objekta klase Graphics. Definisanje objekata Pen


(olovka) kako bi smo izcratli geometriske figure po formi. Pokazati šta je sve potrebno
radi pozivanja metode crtanja.

2.7.2.Zadatak vežbe :

Ostvariti na jednoj formi mogućnost izcrtavanja kvadrata pomoću četiri linija ,


pravougaonika , elipse i poligona.

2.7.3.Realizacija vežbe :

Korak 1 : Otvoriti projekat vindovs aplikacija pod imenom Vežba6 i


preimenovati formu Form1 u Grafika..Postaviti 4 komandnih dugmeta u gorwem delu
forme u jedan red jedan do drugog. Postaviti svojstvo forme Grafika
FormBorderStyle na vrednost FixedToolWindows. Postaviti veličinu naše forme na
vrednost 365,240 (širina i dužina opcija Size). Definisati promenjivu private int biraj;
preko koje switch case struktura određuje koji će objekat biti izcrtan. Imamo 4 slučaja
tako da ćemo promeniti svojstvo teks komandnim dugmadima u kvadrat pomoću linija,
pravougaonik, elipsa, poligon. Preko komandnih dugmadi postavnjati vrednost
promenjive biraj i to neka budu 1,2,3 i 4 za sva 4 slučaja .

22
Korak 2: Izcrtati sa 4 linije kvadrat koristeći za koordinate svih tačaka samo
sledeće vrednosti 50 ,200 . Kao na slici 1.1.

Slika 1.1.Iscrtali smo pravougaonik

[2] Izvorni kod :


private void button1_Click(object sender, EventArgs e)
{
biraj = 1; // Sta ce se crtati ? 1 - cetiri linije koje grade kvadrat
// 2 - pravougaonik itd.
this.Paint += new
System.Windows.Forms.PaintEventHandler(this.Grafika_Paint);
// poziv na dogadjaj crtanja
this.Refresh();// bez ovoga nemozemo videti izcrtavanje po formi

}
private void Grafika_Paint(object sender,
System.Windows.Forms.PaintEventArgs e)
{
switch (biraj)
{
case 1:
Graphics linija = e.Graphics;

Pen p = new Pen(Color.Black, 10);


linija.DrawLine(p, 50, 50, 50,200);
linija.DrawLine(p, 50, 50, 200, 50);
linija.DrawLine(p, 200, 50, 200, 200);
linija.DrawLine(p, 200, 200, 50, 200);
break;

Korak 3: Izcrtati pravougaonik na formi kao na slici 1.2.

23
Slika 1.2. Pravougaonik crvene boje

[2] Izvorni kod :


//ove linije koda idu za slučaj 2 u SWITCH CASE strukturi
Graphics pravou = e.Graphics;
Pen p1 = new Pen(Color.Red, 5);
pravou.DrawRectangle(p1, 17, 50, 200, 75);

Korak 4: Izcrtati elipsu po formi .

Slika 1.3 Elipsa

[2] Izvorni kod :


//ove linije koda ubaciti za case 3:
Graphics elipsa = e.Graphics;
Pen p2 = new Pen(Color.Silver, 10);
elipsa.DrawEllipse(p2, 20, 75, 200, 100);

24
Korak 5: Izcrtati poligon , proizvoqnog izgleda ali da bude vidljiv i bez
presecanja kao na slici 1.4.. Oblik zavisi od izbora tačaka koje uzimamo .

Slika 1.4.Poligon

[2] Izvorni kod :


//ove linije koda ubaciti za case 4:
//Color.Black , 20 određuje boju I debljinu olovke
Pen p3 =new Pen (Color .Black ,20);
SolidBrush cetka = new SolidBrush (Color .Blue );
Graphics poli = e.Graphics;
Point [] tacke = {
new Point (90,190),
new Point (140,90),
new Point (350,40),
new Point (180,210),
new Point (210,180)};
poli.FillPolygon ( cetka , tacke);

25
2.8. Vežba 8 : Osnove internet programiranja

2.8.1.Cilj vežbe :

Prikazati realizaciju klijent server aplikacije sa elementarnim funkcijama koje


omogućavaju konekciju dva računara. Upoznavanje sa ugrađenom klasom TcpClient
i kako se određuje njena funkcionalnost (kao klijent i kao server).

2.8.2.Zadatak vežbe :

U okviru ove vežbe napisati dve odvojene windows aplikacije i to pod nazivom
projekata Klijent deo i Server deo. Server treba da obezbedi prihvatanje više klijenata i
string podataka koji oni šalju. Poruka jednog od klijenata treba proslediti svim ostalim
konektovanim klijentima. Isto tako treba obavestiti sve korisnike o napuštanju jednog
od klijenta ili o konekciji novog klijenta. Otvaranje porta za čekanje nove konekcije
preko dugmeta i događaja klik. Na strani klijenta preko jednog komandnog dugmeta
obezbediti konekciju i diskonekciju. Kad smo na fokusu teksboksa koji služi za unos
podataka koje želimo da šaljemo na pritisak ENTER obezbediti slanje podataka preko
servera svim ostalim klijentima .

26
2.8.3.1.Realizacija vežbe (Server deo)

Korak 1:Otvori novi projekat windows aplikacija pod nazivom Server.


Definisati biblioteke koje ćemo koristiti u ovom projektu. Kreiraj novu klasu pod
nazivom ChatServer.cs. U okviru ove klase napisati izvedenu klasu
StatusChangedEventArgs iz klase EventArgs. Napisati njen konstruktor i funkciju.
Definisati pokazivač funkcija.

[6] Izvorni kod (Sadržaj ChatServer.cs) :

using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Threading;
using System.Collections;

namespace ChatServer
{
public class StatusChangedEventArgs : EventArgs
{
private string EventMsg;

public string EventMessage


{// Funkcija klase
get
{
return EventMsg;
}
set
{
EventMsg = value; }
}
public StatusChangedEventArgs(string strEventMsg)
{//Konstruktor izvedene klase:mora se napisati
EventMsg = strEventMsg;
}}
// def Pokazivaca , sluzi za pozivanje funkcija
public delegate void StatusChangedEventHandler(object sender,
StatusChangedEventArgs e);

Korak 2: Napisati klasu ChatServer u njoj napisati konstruktore i sve pomoćne


funkcije kako bi realizovali zadatak a zatim i klasu Connection. Formu1 kreirati kao na
slici1.1. Preimenovati kontrole kao što je dato u kodu programa (daj tekst boksovima
imena txtLog i txtI , zatim nazovi dugme imenom btnListen ).

27
Slika1.1.Na slici je forma na kojoj je pritisnuto dugme za odvaranje porta

[6] Izvorni kod (Sadržaj ChatServer.cs) :

class ChatServer
{
// Odredji je limit broja korisnika
public static Hashtable htUsers = new Hashtable(30);
// 30 korisnika od jednom
public static Hashtable htConnections = new Hashtable(30);
private IPAddress ipAddress;
private TcpClient tcpClient;
// Dogadjaj koji obavestava formu o konekciji ,diskonekciji i
slanju // poruka
public static event StatusChangedEventHandler StatusChanged;
private static StatusChangedEventArgs e;
// Konstruktor klase Chatserver
public ChatServer(IPAddress address)
{
ipAddress = address;
}
// Nit koja drzi port otvorenim
private Thread thrListener;
// TCP objekt
private TcpListener tlsClient;
// Reci cemo while petnji da ceka na konekciju
bool ServRunning = false;
// Unesi korisnika
public static void AddUser(TcpClient tcpUser, string strUsername)
{
// Unesi korisnika
ChatServer.htUsers.Add(strUsername, tcpUser);
ChatServer.htConnections.Add(tcpUser, strUsername);
// Reci svima ostalima da je novi korisnik tu
SendAdminMessage(htConnections[tcpUser] + " nam se pridružijo !");
}
// Ukloni korisnika

28
public static void RemoveUser(TcpClient tcpUser)
{
if (htConnections[tcpUser] != null)
{
// Korisnik nas je napustio
SendAdminMessage(htConnections[tcpUser] + " nas je napustio !");
//Ukloni podatke o njemu
ChatServer.htUsers.Remove(ChatServer.htConnections[tcpUser]);
ChatServer.htConnections.Remove(tcpUser); }}
//Ova rutina se poyiva kada zelimo probuditi StatusChanged dogadjaj
public static void OnStatusChanged(StatusChangedEventArgs e)
{
StatusChangedEventHandler statusHandler = StatusChanged;
if (statusHandler != null)
{// Pozivati delegata
statusHandler(null, e); }}
// Posalji administrativnu poruku
public static void SendAdminMessage(string Message)
{
StreamWriter swSenderSender;

// Pre svega pokazi je u ovoj aplikaciji


e = new StatusChangedEventArgs("Administrator: " + Message);
OnStatusChanged(e);
// Kreiraj onoliku tabelu koliko imamo korisnika
TcpClient[] tcpClients = new
TcpClient[ChatServer.htUsers.Count];
// izkopiraj klijentu
ChatServer.htUsers.Values.CopyTo(tcpClients, 0);
for (int i = 0; i < tcpClients.Length; i++)
{
// Pokusaj poslati svima
try
{
// Ako je poruka prazna ili nema korisnika prekidaj
if (Message.Trim() == "" || tcpClients[i] == null)
{
continue;
}
// posalji korisnicima poruku
swSenderSender = new StreamWriter(tcpClients[i].GetStream());
swSenderSender.WriteLine("Administrator: " + Message);
swSenderSender.Flush();
swSenderSender = null;
}
catch //Ako ima problema sa korisnikom ukloniti ga
{
RemoveUser(tcpClients[i]);
}}}
// Poslati poruku od jednog korisnika svima ostalima
public static void SendMessage(string From, string Message)
{
StreamWriter swSenderSender;
// Pokazimo u nasoj server aplikaciji taj podatak
e = new StatusChangedEventArgs(From + " Kaze : " + Message);
OnStatusChanged(e);
// Kreiraj onoliku tabelu koliko imamo korisnika

29
TcpClient[] tcpClients = new TcpClient[ChatServer.htUsers.Count];
// izkopiraj klijentu
ChatServer.htUsers.Values.CopyTo(tcpClients, 0);
for (int i = 0; i < tcpClients.Length; i++)
{
// Pokusaj posalji svima poruku
try
{
// Ako je poruka prazna ili nema korisnika prekidaj
if (Message.Trim() == "" || tcpClients[i] == null)
{
continue;
}
// Posalji onima koji su tu
swSenderSender = new StreamWriter(tcpClients[i].GetStream());
swSenderSender.WriteLine(From + " kaze : " + Message);
swSenderSender.Flush();
swSenderSender = null;
}
catch //Ako ima problem sa korisnikom uzbaciti ga
{
RemoveUser(tcpClients[i]);
}}}
public void StartListening()
{ //Postaviti IP
IPAddress ipaLocal = ipAddress;
// Postaviti port
tlsClient = new TcpListener(1106);
// Otvoriti port osluskivanje
tlsClient.Start();
// while strukturom proveravacemo stanje
ServRunning = true;
thrListener = new Thread(KeepListening);
thrListener.Start();
}
private void KeepListening()
{ // Dok je server pokrenut prihvata dolazece zahteve
while (ServRunning == true)
{// Prihvati dolazece zahteve
tcpClient = tlsClient.AcceptTcpClient();
// Kreiraj novu instancu
Connection newConnection = new Connection(tcpClient);
}}}

class Connection
{
TcpClient tcpClient;
// Potrebne klase i promenjive radi slanja poruke
private Thread thrSender;
private StreamReader srReceiver;
private StreamWriter swSender;
private string currUser;
private string strResponse;
// Konstruktor
public Connection(TcpClient tcpCon)
{
tcpClient = tcpCon;

30
// Prihvata klijente i ceka nove
thrSender = new Thread(AcceptClient);
thrSender.Start();
}
private void CloseConnection()
{
// Zatvori objekte
tcpClient.Close();
srReceiver.Close();
swSender.Close();
}
// Prihvatanje klijenta ili korisnika
private void AcceptClient()
{
srReceiver = new
System.IO.StreamReader(tcpClient.GetStream());
swSender = new
System.IO.StreamWriter(tcpClient.GetStream());

// procitaj podatke o klijentu


currUser = srReceiver.ReadLine();

// Dobili smo odgovor od klijenta


if (currUser != "")
{
// Skladišti korisničko ime u hash tabelu
if (ChatServer.htUsers.Contains(currUser) == true)
{
// 0 znači nije konektovan propisno
swSender.WriteLine("0|Ovo korisnicko ime vec postoji.");
swSender.Flush();
CloseConnection();
return;
}
else if (currUser == "Administrator")
{
swSender.WriteLine("0|Ovo korisnicko ime je rezervisano.");
swSender.Flush();
CloseConnection();
return;
}
else
{
// kad posaljemo vrednost 1 znaci da je konekcija uspesna
swSender.WriteLine("1");
swSender.Flush();
// Unesi korisnika i cekaj njegove poruke
ChatServer.AddUser(tcpClient, currUser);
}
}
else
{
CloseConnection();
return;
}
try
{

31
// I dalje cekaj za poruku
while ((strResponse = srReceiver.ReadLine()) != "")
{
// Ako je nepravilna izbaci ga
if (strResponse == null)
{
ChatServer.RemoveUser(tcpClient);
}
else
{
// Posalji svim korisnicima poruku
ChatServer.SendMessage(currUser, strResponse);
}}}
catch
{
// Ako bilo sta nevalja sa ovim korisnikom diskonektuj ga
ChatServer.RemoveUser(tcpClient);
}}}}
Izvorni kod ( kompletan sadržaj koda forme form1.cs):

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Net;
using System.Net.Sockets;
using System.IO;

namespace ChatServer
{
public partial class Form1 : Form
{
private delegate void UpdateStatusCallback(string strMessage);

public Form1()
{
InitializeComponent();
}

private void btnListen_Click(object sender, EventArgs e)


{
// Pokupi vrednost iz txtIP i dodeli ga Ip adresi
IPAddress ipAdresa = IPAddress.Parse(txtIp.Text);
// kreiraj objekat server
ChatServer GlavniServer = new ChatServer(ipAdresa);
// Postaviti da StatusChanged rukuje promenom statusa servera
ChatServer.StatusChanged += new StatusChangedEventHandler(GlavniServer_StatusChanged);
// Postavi port na prisluskivanje
GlavniServer.StartListening();
// Obavesti da je port otvoren
txtLog.AppendText("Port je otvoren,ceka se na zahtev za konekciju\r\n");
}

32
public void GlavniServer_StatusChanged(object sender,
StatusChangedEventArgs e)
{
//Prihvatanje primljenih podataka podataka
this.Invoke(new UpdateStatusCallback(this.UpdateStatus), new object[]
{ e.EventMessage });
}
private void UpdateStatus(string strMessage)
{
// Unesi poruku u tekstualni boks
txtLog.AppendText(strMessage + "\r\n");
}
private void button1_Click(object sender, EventArgs e)
{
Application.Exit();
}}}

2.7.3.2.Realizacija vežbe (Klijent deo)

Korak 1 :Otvori novi projekat windows aplikacija pod nazivom Klijent.


Definisati biblioteke koje ćemo koristiti u ovom projektu. Kreiraj formu forma1 kao na
slici1.2.

33
Slika1.2. Izgled forme Form1

Korak 2 : Pošto smo ubacili 4 tekst boksa i 3 komandna dugmeta potrebno je


izvršiti preimenovanje da bi kod radio u sledeća imena :

button1 preimenovati u btnConnect


button2 preimenovati u Salji
button3 preimenovati u Kraj
textbox1 preimenovati u txtIp
textbox2 preimenovati u txtUser
textbox2 preimenovati u txtLog
textbox2 preimenovati u Poruka

[6] Izvorni kod : (kompletan sadržaj form1.cs)

// Def biblioteka koje koristi projekat


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;

34
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Threading;

namespace ChatClient
{
public partial class Form1 : Form
{
// definisanje korisničkog imena tipa string
private string UserName = "Nepoznat";
private StreamWriter swSender;
private StreamReader srReceiver;
private TcpClient tcpServer;
// Potrebno radi obavestenja forme da je poruka stigla
private delegate void UpdateLogCallback(string strMessage);
// Potrebno da se obavesti forma da je diskonekcija izazvana
// od druge strane (servera)
private delegate void CloseConnectionCallback(string strReason);
private Thread thrMessaging;
private IPAddress ipAddr;
private bool Connected;
public Form1()
{
// Pre izlaska iz aplikacije da se izvrši diskonekcija
Application.ApplicationExit += new EventHandler(OnApplicationExit);
InitializeComponent();
}
// Po izlasku iz aplikacije obezbeđuje diskonekciju
public void OnApplicationExit(object sender, EventArgs e)
{
if (Connected == true)
{
// Ukoliko je status konektovan onda ga diskonektuj
Connected = false;
swSender.Close();
srReceiver.Close();
tcpServer.Close();
}
}
private void btnConnect_Click(object sender, EventArgs e)
{ // preimenijte ime dugmeta za konekciju ! ! !

if (Connected == false)
{ // Ako nismo konektovani pokušaće da se konektuje
// Inicijalizacija konekcije
InitializeConnection();
}
else // Već smo konektovani izvrši diskonekciju
{ Connected = false ;
Connected = false;
swSender.Close();
srReceiver.Close();
tcpServer.Close();
CloseConnection("Kraj konekcije po korisnickom zahtevu.");
}

35
}
private void InitializeConnection()
{
//Dodeliti promenjivoj sadržaj tekstualnog boksa
ipAddr = IPAddress.Parse(txtIp.Text);
// Startovati novi TCP objekat sa serverom
tcpServer = new TcpClient();
tcpServer.Connect(ipAddr, 1106);// IP adresa i Port udaljenog servera
Connected = true;
// Pripremiti formu
UserName = txtUser.Text;
//Podesiti opcije Disable i enable za režim koada smo konektovani
txtIp.Enabled = false;
txtUser.Enabled = false;
Poruka.Enabled = true;
Salji.Enabled = true;
btnConnect.Text = "Disconnect";
// Poslati Korisničko ime serveru
swSender = new StreamWriter(tcpServer.GetStream());
swSender.WriteLine(txtUser.Text);
swSender.Flush();
// Pokrenuti nit za primanje poruka i dolju komunikaciju
thrMessaging = new Thread(new ThreadStart(ReceiveMessages));
thrMessaging.Start();
}
private void ReceiveMessages()
{ // Prihvatiti poruku sa servera
srReceiver = new StreamReader(tcpServer.GetStream());
// Ako je prvi karakter koji je primljen 1 , onda smo uspesno
// konektovani
string ConResponse = srReceiver.ReadLine();
// Ako je prvi poslati karakter 1 to je znak da je konekcija uspešna
if (ConResponse[0] == '1')
{
// Obavestiti formu da smo uspesno konektovani
this.Invoke(new UpdateLogCallback(this.UpdateLog), new object[]
{ "Uspesna konekcija!" });
}
else // Ako prvi karakter nije l već obično 0 onda
nismo // propisno konektovani
{
string Reason = "Nema konekcije! ";
// Ima 3 pokusaja
Reason += ConResponse.Substring(2, ConResponse.Length - 2);
// Obavesti formu za razlog
this.Invoke(new CloseConnectionCallback(this.CloseConnection), new
object[] { Reason });
// Izađi iz ove metode
return;
}
// Uspesno smo konektovani i prihvatamo podatke sa servera
while (Connected == true)
{
try
{
this.Invoke(new UpdateLogCallback(this.UpdateLog), new object[]
{ srReceiver.ReadLine() });

36
}
catch
{
Connected = false;
// swSender.Close();
// srReceiver.Close();
tcpServer.Close();
}
finally
{
}
}}
// prikaz pristiglih I poslatih podataka u tekst boks
private void UpdateLog(string strMessage)
{
// Pokazati najnoviji tekst na dnu
txtLog.AppendText(strMessage + "\r\n");
}
// Zatvori postojeću konekciju
private void CloseConnection(string Reason)
{// Pokaži razlog zasto se vrši diskonekcija
txtLog.AppendText(Reason + "\r\n");
// Podesi opcije Enable i disable za određene kontrole za režim
// diskonekcije
txtIp.Enabled = true;
txtUser.Enabled = true;
Poruka.Enabled = false;
Salji.Enabled = false;
btnConnect.Text = "Connect";
// Zatvori objekte
Connected = false;
// swSender.Close();
// srReceiver.Close();
tcpServer.Close();
}

// Poslati podatak serveru


private void SendMessage()
{
if (Poruka.Lines.Length >= 1)
{
swSender.WriteLine(Poruka.Text);
swSender.Flush();
Poruka.Lines = null;
}
Poruka.Text = "";
}
// Pošalji na klik dugmeta
private void Salji_Click(object sender, EventArgs e)
{
SendMessage();
}
// Slanje podataka u slučaju pritiska na dugme ENTER
private void Poruka_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == (char)13)
{

37
SendMessage();
}
}
private void button1_Click(object sender, EventArgs e)
{
Application.Exit();
}
private void Poruka_TextChanged(object sender, EventArgs e)
{
} // I ako je ova rutina prazna neophodna je
}}

Korak 3 : Pokrenuti oba dela projekta i probati konekciju kao na slici 1.3.

Slika1.3.Prikaz konekcije

3. Zaključak

Programiranje zahteva svakodnevni angažman i pored talenta traži i puno rada.


U ovih 8 vežbi od najprostije konzolne aplikacije za upis i prikaz podataka došli smo
do klijent-server aplikacije koja spada u Internet programiranje. Potrudio sam se da
hronologija zadataka bude ispoštovana po principu od elementarnijih ka složenijim
primerima. Inače Microsoft Visual C# 2008 Express Edition je besplatna verzija i lako i
brzo se može instalirati sa interneta. Problem je u tome što se teže nalazi izvori kod za

38
novije verzije programskih jezika ali ipak postoji u dovoljnoj meri. Preporučujem web
adrese navede u dokumentaciji. Većina koda je dato u formi klase ili je napisan za
konzolnu aplikaciju ali i takav kod uz manje prepravke možete napisati windows
aplikaciju. U vizuelnoj sredini komandu Console.WriteLine zamenili bi
MessageBox.Show komandom. Tako svaku konzola aplikaciju možemo prevesti u
windows aplikaciju uz male prepravke .

Za izvodjenje složenih projekata kao u našem slučaju 9 posebnih projekata treba


posebnu pažnju posvetiti izboru radnog direktorijuma i backup direktorijuma za
skladišćenje fajlova projekta. Preporučljivo je pri insertovanju i preimenovanju formi
snimiti promenu.

Jedan od zaključaka ovog rada je i sledeće : vrlo je lako ostvariti osnovnu


konekciju i kreirati grafički interfejs za jednu chat aplikaciju. Videli smo da jednom
linijom koda šaljemo string udaljenom računaru, tada taj string možemo definisati kao
jednu komandu .Kada server primi poslati podatak može na osnovu njegovog sadržaja
odraditi neki blik naredbi. U načem slučaju to je 1 ili 0 tako server kada prihvati prvi
podatak “1” on request metodom prihvata konekciju i obaveštava klijenta.

Dokumentacija

Literatura korišćena u uvodu i projektima :

39
[1] Microsoft Corporation, C# version 2.0 Specification, MAY 2004

[2] prof.dr. Dragan Janković, Moderni koncepti programiranja, 2006.

Izvorni kod uzet sa sajtova :

[3] http://www.fincher.org/tips/Languages/csharp.shtml
zadnji pristup : 21.06.2009.

[4] http://www.java2s.com/Tutorial/CSharp/CatalogCSharp.htm
zadnji pristup : 22.06.2009.

[5] http://www.codeproject.com
zadnji pristup : 22.06.2009.

[6] http://www.geekpedia.com/tutorial239_Csharp-Chat-Part-1---Building-the-Chat-
Client.html
zadnji pristup : 22.06.2009.

40

You might also like