1. Scopul lucrării
În această lucrare se continuă studiul aplicaţiilor client - server
bazate pe socketuri. În plus, se exemplifică şi realizarea unor aplicaţii
client în modul grafic.
2. Breviar teoretic
......
//constructorul clasei Fir:
.....
public void run()
{//corpul metodei run():
.....
}
//alte metode in clasa Fir:
.....
}//end clasa Fir
Cea de a doua metodă de creare a unui fir de execuţie, prin
implementarea interfeţei Runnable, este cea folosită în problemele
rezolvate şi va fi exemplificată în soluţiile problemelor.
3. Probleme rezolvate
Problema 1
Să se scrie o aplicaţie client server în care în aplicaţia client se
repetă următoarea secvenţă de operaţii:
-se citeşte de la tastatură un şir de caractere.
-daca şirul este şirul vid, se iese din aplicaţia client.
-şirul se transmite la server, care va cripta şirul recepţionat cu
algoritmul de criptare Mansfield şi apoi transmite rezultatul clientului.
-în aplicaţia client se afişează rezultatul trimis de către server (şirul
criptat).
În criptare nu vom face diferenţă între literele mici şi cele mari.
Algoritmul de criptare Mansfield este un algoritm de criptare
prin substituţie în care se criptează doar literele, restul caracterelor se
lasă neschimbate ( litera Q se va cripta la fel ca si litera P ). Fiecare
literă se substituie cu două vocale, astfel:
Avem 25 de litere distincte din alfabetul englez, deoarece P şi Q se
criptează la fel. Cele 25 de litere le asezăm într-un tabel (matrice) de 5
linii şi 5 coloane. Acestea corespund celor 5 vocale. Pentru o literă
oarecare mai întâi aflăm linia şi coloana din tabel, pe care se află. Să
presupunem că se află în linia 1 şi coloana 4 (litera J).Începem
numerotarea liniilor şi a coloanelor de la 0. Această literă se va
substitui cu a doua vocală şi cu a cincia vocală din alfabet, deci cu EU.
if(textIn==null)break;
if(textIn.equals(""))break
;//s-a deconectat clientul ( a tastat ENTER);
String raspuns=criptareMansfield(textIn);
//trimite la client raspunsul:
pw.println(raspuns);
pw.flush();
}//for;;
}catch(Exception e){
e.printStackTrace();
}
}//run
Problema 2
Aceeaşi aplicaţie client server ca în problema 1, dar acum
clientul este realizat în modul grafic. Şirul de criptat se va introduce în
fereastra grafică, intr-o componentă JTextField. Rezultatul venit de la
server se va afişa de asemenea într-o componentă JTextField.
Fereastra grafică este ilustrată în figura următoare:
jp1.add(jl1); jp1.add(jtf1);
JLabel jl2=new JLabel("text criptat:");
jtf2=new JTextField(40);
JPanel jp2=new JPanel( );
jp2.add(jl2); jp2.add(jtf2);
AscultaButoane ab=new AscultaButoane( );
jbCalcul=new JButton("Trimite la sever");
jbCalcul.addActionListener(ab);
jbExit=new JButton("Exit");
jbExit.addActionListener(ab);
JPanel jp3=new JPanel( );
jp3.add(jbCalcul); jp3.add(jbExit);
JPanel jp=new JPanel( );
jp.setLayout(new GridLayout(3,1));
jp.add(jp1); jp.add(jp2); jp.add(jp3);
Container cFinal=this.getContentPane( );
cFinal.add(jp,"South");
}// end constructor
// clasa interioara:
class AscultaButoane implements ActionListener
{
public void actionPerformed(ActionEvent ev)
{
Object sursa=ev.getSource();
if(sursa==jbExit)System.exit(0);
else if (sursa==jbCalcul){
String s1=jtf1.getText( );
if(s1.equals("")){
//se deconecteaza acest client, si instiinteaza
// si serverul pentru a-i opri firul de executie
pw.println("");
pw.flush();
System.exit(0);
}
//sirul s1 este diferit de sirul vid:
String raspuns="";
try{
//trimiteDateCatreServer:
pw.println(s1);
//goleste fluxul:
Aplicaţii client – server ( II ) 111
pw.flush();
raspuns=bfr.readLine();
if(raspuns==null)return;
}catch(IOException e){
e.printStackTrace();
System.exit(1);
}
jtf2.setText(""+raspuns);
jtf1.requestFocus();
}//else
}//actionPerformed()
}
}
Listingul aplicaţie server
Aplicaţia server este în modul text, deci codul aplicaţiei este
identic cu codul aplicaţiei server din problema 1.
3. Probleme propuse
Problema 1
Să se scrie o aplicaţie client server în care în aplicaţia client se
repetă următoarea secvenţă de operaţii:
-se citeşte de la tastatură un şir de caractere.
-daca şirul este şirul vid, se iese din aplicaţia client.
-şirul se transmite la server, care va cripta şirul recepţionat cu
algoritmul de criptare Caesar şi apoi transmite rezultatul clientului.
-în aplicaţia client se afişează rezultatul trimis de către server (şirul
criptat).
Algoritmul de criptare Caesar este un algoritm de criptare prin
substituţie în care se criptează doar literele, restul caracterelor se lasă
neschimbate. Fiecare literă se substituie cu litera aflată la distanţă de
trei litere de ea, în alfabet. Astfel, litera a se substituie cu litera d, b cu
e, etc. Pentru ultimele trei litere din alfabet: x se substituie cu a, y cu b
şi z cu c.
Problema 2
Aceeaşi aplicaţie client server ca în problema 1, dar acum
clientul este realizat în modul grafic. Şirul de criptat se va introduce în
fereastra grafică, intr-o componentă JTextField. Rezultatul venit de la
server se va afişa de asemenea într-o componentă JTextField.
112 Aplicaţii client - server ( II )
Problema 3
În aplicaţia client se repetă următoarea secvenţă de operaţii:
-se citeşte un şir de la tastatură
-dacă şirul tastat este vid ( se apasă doar tasta ENTER ), se iese din
aplicaţia client.
-altfel, şirul se transmite severului.
Aplicaţia client se va realiza în modul text.
Serverul criptează şirul recepţionat cu algoritmul de criptare prin
transpoziţie cu matrice şi il transmite clientului.
-în aplicaţia client se afişează rezultatul trimis de către server (şirul
criptat).
Algoritmul de criptare prin transpoziţie cu matrice este
următorul:
Se copiază textul de criptat într-o matrice pătratică de
caractere, de dimensiune minimă. Astfel, dacă textul are 25 de
caractere, dimensiunea matricii pătrate este 5. Dacă textul are 28 de
caractere, dimensiunea matricii va fi 6. Copierea textului în matrice se
face parcurgând matricea pe linii. Dacă mai rămâne loc neocupat în
matrice, se completează matricea cu spaţii (blankuri) . Şirul criptat se
obţine prin parcurgerea matricii pe coloane.
Problema 4
Se va realiza o aplicaţie client server, în care clientul este în
modul grafic.
În aplicaţia client se repetă următoarea secvenţă de operaţii:
-se citeşte un şir de la tastatură
-dacă şirul tastat este vid ( se apasă doar tasta ENTER ), se iese din
aplicaţia client.
- se selectează algoritmul de criptare prin două butoane radio, prezente
în interfaţa grafică ( criptare prin metoda Caesar sau criptare prin
transpoziţie cu matrice ).
- şirul se transmite severului împreună cu specificaţia referitoare la
algoritmul de criptare ( Caesar sau transpoziţie cu matrice ).
Serverul criptează şirul recepţionat cu algoritmul de criptare
specificat şi apoi il transmite clientului.
-în aplicaţia client se afişează rezultatul trimis de către server (şirul
criptat).