Sunteți pe pagina 1din 8

MINISTERUL EDUCAŢIEI, CULTURII și CERCETĂRII al REPUBLICII MOLDOVA

UNIVERSITATEA TEHNICĂ a MOLDOVEI


FACULTATEA CALCULATOARE, INFORMATICĂ și MICROELECTRONICĂ
DEPARTAMENTUL INGINERIA SOFTWARE și AUTOMATICĂ

RAPORT la lucrarea de laborator Nr. 4


Disciplina: Programarea in retea
TEMA: Aplicație Client-Server TCP

Elaborat: st. gr. TI-171 Iepuras Daniel


Verficat: conf. univ. Buldumac Oleg

Chișinău – 2020

Sarcina lucrarii:
Să se creeze o aplicație Client-Server TCP utilizând Sockets API

Mersul lucrarii:

Scopul acestei lucrari de laborator este de a crea o aplicatie de tip chat. Aplicatia se
poate rula pe diferite calculatoare conectate la o retea locala. Pot exista mai multi
clienti care se conecteaza la server si pot discuta intre ei. După ce s-a conectat la
server, un utilizator trebuie să-și furnizeze numele său pentru a intra în chat. Serverul
trimite o listă de utilizatori online în prezent la noul utilizator. Fiecare utilizator este
notificat la sosirea unui nou utilizator și la plecarea acestuia. Fiecare mesaj este
prefixat cu numele de utilizator pentru a urmări cine a trimis mesajul. Și în final,
utilizatorul spune „bye” să renunțe la chat. Aplicația constă din două părți: server și
client. Fiecare parte poate rula independent pe computere separate.

Partea server

Serverul este implementat de doua clase ChatServer si UserThread. Clasa ChatServer


pornește serverul, asculta pe un anumit port de . Când un client nou se conectează, o
instanță a UserThread este creată pentru a servi acel client. Deoarece fiecare
conexiune este procesată într-un thread separat, serverul este capabil să gestioneze
mai mulți clienți în același timp.
public class ChatServer {

private int port;


private Set<String> userNames = new HashSet<>();
private Set<UserThread> userThreads = new HashSet<>();

public ChatServer(int port) {


this.port = port;
}

public void execute() {


try (ServerSocket serverSocket = new ServerSocket(port)) {

System.out.println("Chat Server is listening on port " + port);

while (true) {
Socket socket = serverSocket.accept();
System.out.println("New user connected");

UserThread newUser = new UserThread(socket, this);


userThreads.add(newUser);
newUser.start();

} catch (IOException ex) {


System.out.println("Error in the server: " + ex.getMessage());
ex.printStackTrace();
}
}
public static void main(String[] args) {
if (args.length < 1) {
System.out.println("Syntax: java ChatServer <port-number>");
System.exit(0);
}

int port = Integer.parseInt(args[0]);

ChatServer server = new ChatServer(port);


server.execute();
}

//Trimite mesajul de la un user la altii

void broadcast(String message, UserThread excludeUser) {


for (UserThread aUser : userThreads) {
if (aUser != excludeUser) {
aUser.sendMessage(message);
}
}
}

//adauga numele clientului nou conectat

void addUserName(String userName) {


userNames.add(userName);
}

//Cand clientul este deconectat ii sterge numele si thread-ul

void removeUser(String userName, UserThread aUser) {


boolean removed = userNames.remove(userName);
if (removed) {
userThreads.remove(aUser);
System.out.println("The user " + userName + " quitted");
}
}

Set<String> getUserNames() {
return this.userNames;
}

//Returneaza true daca alti clienti s-au conectat

boolean hasUsers() {
return !this.userNames.isEmpty();
}

Clasa ChatServer are doua colectii Set pentru a urmari numele si firele clientilor
conectati. Set este folosit pentru evitarea dublicatelor si pentru ca ordinea elementelor
nu conteaza.

private Set<String> userNames = new HashSet<>();


private Set<UserThread> userThreads = new HashSet<>();

O metoda importanta din clasa ChatServer este broadcast() care transmite un mesaj de
la client tuturor celorlalti clienti.

void broadcast(String message, UserThread excludeUser) {


for (UserThread aUser : userThreads) {
if (aUser != excludeUser) {
aUser.sendMessage(message);
}
}
}

Clasa UserThread este responsabila pentru citirea mesajelor transmise de la client și


difuzarea mesajelor tuturor celorlalți clienți. În primul rând, trimite o listă de
utilizatori online noului utilizator. Apoi citește numele de utilizator și notifică alți
utilizatori despre noul utilizator.
public class UserThread extends Thread{
private Socket socket;
private ChatServer server;
private PrintWriter writer;

public UserThread(Socket socket, ChatServer server) {


this.socket = socket;
this.server = server;
}

public void run() {


try {
InputStream input = socket.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(input));

OutputStream output = socket.getOutputStream();


writer = new PrintWriter(output, true);

printUsers();

String userName = reader.readLine();


server.addUserName(userName);

String serverMessage = "New user connected: " + userName;


server.broadcast(serverMessage, this);

String clientMessage;

do {
clientMessage = reader.readLine();
serverMessage = "[" + userName + "]: " + clientMessage;
server.broadcast(serverMessage, this);

} while (!clientMessage.equals("bye"));

server.removeUser(userName, this);
socket.close();

serverMessage = userName + " has quitted.";


server.broadcast(serverMessage, this);

} catch (IOException ex) {


System.out.println("Error in UserThread: " + ex.getMessage());
ex.printStackTrace();
}
}

//trimite lista de clienti online noului client conectat

void printUsers() {
if (server.hasUsers()) {
writer.println("Connected users: " + server.getUserNames());
} else {
writer.println("No other users connected");
}
}

//trimite un mesaj clientului


void sendMessage(String message) {
writer.println(message);
}

Partea client

Clientul este implementat de trei clase: ChatClient, ReadThread, WriteThread.


ChatClient începe programul client, se conectează la un server specificat de ip și
un port. Odată ce conexiunea este făcută, creează și pornește două fire ReadThread si
WriteThread.
public class ChatClient {

private String hostname;


private int port;
private String userName;

public ChatClient(String hostname, int port) {


this.hostname = hostname;
this.port = port;
}

public void execute() {


try {
Socket socket = new Socket(hostname, port);

System.out.println("Connected to the chat server");

new ReadThread(socket, this).start();


new WriteThread(socket, this).start();

} catch (UnknownHostException ex) {


System.out.println("Server not found: " + ex.getMessage());
} catch (IOException ex) {
System.out.println("I/O Error: " + ex.getMessage());
}

void setUserName(String userName) {


this.userName = userName;
}

String getUserName() {
return this.userName;
}

public static void main(String[] args) {


if (args.length < 2) return;

String hostname = args[0];


int port = Integer.parseInt(args[1]);

ChatClient client = new ChatClient(hostname, port);


client.execute();
}

}
Clasa ReadThread este responsabila de citirea intrarilor de la server si imprimarea lor
in mod repetat in consola.
public class ReadThread extends Thread {

private BufferedReader reader;


private Socket socket;
private ChatClient client;

public ReadThread(Socket socket, ChatClient client) {


this.socket = socket;
this.client = client;

try {
InputStream input = socket.getInputStream();
reader = new BufferedReader(new InputStreamReader(input));
} catch (IOException ex) {
System.out.println("Error getting input stream: " + ex.getMessage());
ex.printStackTrace();
}
}

public void run() {


while (true) {
try {
String response = reader.readLine();
System.out.println("\n" + response);

//printeaza numele dupa ce se afiseaza mesajul de la server

if (client.getUserName() != null) {
System.out.print("[" + client.getUserName() + "]: ");
}
} catch (IOException ex) {
System.out.println("Error reading from server: " + ex.getMessage());
ex.printStackTrace();
break;
}
}
}

Clasa WriteThread este responsabila de citirea intrarilor de la client si transmiterea


acestora catre server in mod continuu pana cand utilizatorul tapeaza “bye”.
public class WriteThread extends Thread {

private PrintWriter writer;


private Socket socket;
private ChatClient client;

public WriteThread(Socket socket, ChatClient client) {


this.socket = socket;
this.client = client;

try {
OutputStream output = socket.getOutputStream();
writer = new PrintWriter(output, true);
} catch (IOException ex) {
System.out.println("Error getting output stream: " + ex.getMessage());
ex.printStackTrace();
}
}

public void run() {


Console console = System.console();

String userName = console.readLine("\nEnter your name: ");


client.setUserName(userName);
writer.println(userName);

String text;

do {
text = console.readLine("[" + userName + "]: ");
writer.println(text);

} while (!text.equals("bye"));

try {
socket.close();
} catch (IOException ex) {

System.out.println("Error writing to server: " + ex.getMessage());


}
}

Motivele pentru a rula aceste două fire simultan este faptul că operația de citire
blochează întotdeauna firul curent (atât citirea intrării utilizatorului de pe linia de
comandă, cât și intrarea serverului de citire prin rețea). Asta înseamnă că, dacă thread-
ul curent așteaptă intrarea utilizatorului, nu poate citi intrarea de pe server.
Prin urmare, două fire separate sunt utilizate pentru a face clientul să răspundă: poate
afișa mesaje de la alți utilizatori în timp ce citește mesajul utilizatorului curent.

Rezultate:

Partea server – conectarea a doi client si apoi iesirea unuia din chat.

Partea client:
Concluzie:

In aceasta lucrare de laborator am acumulat cunostinte noi in cum lucreaza


programarea socket a unui server local si cum sa conectezi simultan mai multi
utilizatori utilizand thread-urile.

S-ar putea să vă placă și

  • SOMIPP Lab5
    SOMIPP Lab5
    Document4 pagini
    SOMIPP Lab5
    X3 KTO
    Încă nu există evaluări
  • Lab 2 Pam
    Lab 2 Pam
    Document5 pagini
    Lab 2 Pam
    Augusta Bucataru
    Încă nu există evaluări
  • Lab 7
    Lab 7
    Document2 pagini
    Lab 7
    Cristina Florea
    Încă nu există evaluări
  • Laboratorul1 ASR
    Laboratorul1 ASR
    Document7 pagini
    Laboratorul1 ASR
    Жан Ганган
    100% (1)
  • Raspunsuri AMSI
    Raspunsuri AMSI
    Document11 pagini
    Raspunsuri AMSI
    Cristina Florea
    Încă nu există evaluări
  • Lab 1 Somipp
    Lab 1 Somipp
    Document7 pagini
    Lab 1 Somipp
    TîmburŞtefan
    Încă nu există evaluări
  • Lab 1 PAD Braga Eugen
    Lab 1 PAD Braga Eugen
    Document7 pagini
    Lab 1 PAD Braga Eugen
    Alexandru Kirika
    Încă nu există evaluări
  • Lucrarea 6
    Lucrarea 6
    Document17 pagini
    Lucrarea 6
    Vadim Ciubotaru
    Încă nu există evaluări
  • Lab4 PR Adasanu Gicu
    Lab4 PR Adasanu Gicu
    Document9 pagini
    Lab4 PR Adasanu Gicu
    Георгий 98
    Încă nu există evaluări
  • PAM Lab6
    PAM Lab6
    Document31 pagini
    PAM Lab6
    Ion Cornea
    Încă nu există evaluări
  • Somipp Linux 3 UTM
    Somipp Linux 3 UTM
    Document7 pagini
    Somipp Linux 3 UTM
    Cristi Poselețchi
    Încă nu există evaluări
  • Lab.6 FC
    Lab.6 FC
    Document3 pagini
    Lab.6 FC
    Cristina Florea
    Încă nu există evaluări
  • Lab3 PR
    Lab3 PR
    Document22 pagini
    Lab3 PR
    Constantin
    Încă nu există evaluări
  • Somipp Linux 2 UTM
    Somipp Linux 2 UTM
    Document7 pagini
    Somipp Linux 2 UTM
    Cristi Poselețchi
    Încă nu există evaluări
  • Proiect de An RC
    Proiect de An RC
    Document15 pagini
    Proiect de An RC
    Клара Кожухари
    Încă nu există evaluări
  • Examen TIDPP
    Examen TIDPP
    Document3 pagini
    Examen TIDPP
    Rosca Doinita
    Încă nu există evaluări
  • Lab 3
    Lab 3
    Document4 pagini
    Lab 3
    Rosca Doinita
    Încă nu există evaluări
  • PS TS
    PS TS
    Document14 pagini
    PS TS
    Victor Turculet
    Încă nu există evaluări
  • Somipp Linux 1 UTM
    Somipp Linux 1 UTM
    Document10 pagini
    Somipp Linux 1 UTM
    Cristi Poselețchi
    Încă nu există evaluări
  • Laborator NR.2
    Laborator NR.2
    Document9 pagini
    Laborator NR.2
    Daniil
    Încă nu există evaluări
  • TW Lab 5
    TW Lab 5
    Document4 pagini
    TW Lab 5
    danielploaia
    Încă nu există evaluări
  • Laborator NR.1
    Laborator NR.1
    Document13 pagini
    Laborator NR.1
    Daniil
    100% (1)
  • Somipp Linux 4 UTM
    Somipp Linux 4 UTM
    Document4 pagini
    Somipp Linux 4 UTM
    Cristi Poselețchi
    Încă nu există evaluări
  • Lab Sotr 2
    Lab Sotr 2
    Document11 pagini
    Lab Sotr 2
    JK
    Încă nu există evaluări
  • Lab 5 PSR
    Lab 5 PSR
    Document7 pagini
    Lab 5 PSR
    Iulian Decuseara
    Încă nu există evaluări
  • Lab 3
    Lab 3
    Document7 pagini
    Lab 3
    Fil Gorea
    Încă nu există evaluări
  • TVPP Laborator nr.3
    TVPP Laborator nr.3
    Document5 pagini
    TVPP Laborator nr.3
    Ion Popescu
    0% (1)
  • Examen, TS, Bilet 75
    Examen, TS, Bilet 75
    Document1 pagină
    Examen, TS, Bilet 75
    Никита Баранов
    Încă nu există evaluări
  • Amo 5
    Amo 5
    Document8 pagini
    Amo 5
    Fil Gorea
    Încă nu există evaluări
  • Examen IOC Chirtoacă Maxim
    Examen IOC Chirtoacă Maxim
    Document3 pagini
    Examen IOC Chirtoacă Maxim
    Maxim Chirtoacă
    Încă nu există evaluări
  • Lab 5 TMPS
    Lab 5 TMPS
    Document3 pagini
    Lab 5 TMPS
    Guzun Ion
    Încă nu există evaluări
  • Pam 4
    Pam 4
    Document4 pagini
    Pam 4
    violina
    Încă nu există evaluări
  • AMOO - Proiect de An
    AMOO - Proiect de An
    Document4 pagini
    AMOO - Proiect de An
    Dan
    Încă nu există evaluări
  • LAB3PSR
    LAB3PSR
    Document11 pagini
    LAB3PSR
    Cristian
    Încă nu există evaluări
  • Lab 2
    Lab 2
    Document6 pagini
    Lab 2
    Maria Sevciuc
    Încă nu există evaluări
  • Examen PW
    Examen PW
    Document71 pagini
    Examen PW
    DorinRotaru
    Încă nu există evaluări
  • Lucrarea 4 Utm
    Lucrarea 4 Utm
    Document10 pagini
    Lucrarea 4 Utm
    BlandjLdhui
    Încă nu există evaluări
  • TW Lab5
    TW Lab5
    Document3 pagini
    TW Lab5
    Dan
    Încă nu există evaluări
  • Lab 1 Tmps
    Lab 1 Tmps
    Document5 pagini
    Lab 1 Tmps
    Victor Turculet
    Încă nu există evaluări
  • 1arhitect Lab 2
    1arhitect Lab 2
    Document11 pagini
    1arhitect Lab 2
    UTM
    Încă nu există evaluări
  • A1
    A1
    Document11 pagini
    A1
    Amarfii Sergiu
    Încă nu există evaluări
  • AI-191 Medinschi Ion SO4
    AI-191 Medinschi Ion SO4
    Document5 pagini
    AI-191 Medinschi Ion SO4
    Carolin
    Încă nu există evaluări
  • Somipp 2
    Somipp 2
    Document8 pagini
    Somipp 2
    Damean Alexandra
    Încă nu există evaluări
  • Lab 1 ASO
    Lab 1 ASO
    Document6 pagini
    Lab 1 ASO
    Cristian
    100% (1)
  • Lab. 3
    Lab. 3
    Document5 pagini
    Lab. 3
    Cristina Florea
    Încă nu există evaluări
  • Ll1 Tsa Eciobanu
    Ll1 Tsa Eciobanu
    Document10 pagini
    Ll1 Tsa Eciobanu
    Ecaterina Ciobanu
    Încă nu există evaluări
  • Pam Exam
    Pam Exam
    Document2 pagini
    Pam Exam
    Culea Constantin
    Încă nu există evaluări
  • Iepuras Daniel LAB 3 TS
    Iepuras Daniel LAB 3 TS
    Document8 pagini
    Iepuras Daniel LAB 3 TS
    DanuIepuras
    Încă nu există evaluări
  • Curs Sabloane Proiectare
    Curs Sabloane Proiectare
    Document169 pagini
    Curs Sabloane Proiectare
    freestyla
    Încă nu există evaluări
  • Lab1 Somipp
    Lab1 Somipp
    Document14 pagini
    Lab1 Somipp
    Jen4ik
    100% (1)
  • SOMIPP
     SOMIPP
    Document6 pagini
    SOMIPP
    Damean Alexandra
    Încă nu există evaluări
  • Lab2 TMPS
    Lab2 TMPS
    Document4 pagini
    Lab2 TMPS
    Ion Cornea
    Încă nu există evaluări
  • BDC Lucrare de Curs
    BDC Lucrare de Curs
    Document37 pagini
    BDC Lucrare de Curs
    Vladislav Crivenco
    Încă nu există evaluări
  • Lab3 SAV
    Lab3 SAV
    Document4 pagini
    Lab3 SAV
    Zeul Hriscei
    Încă nu există evaluări
  • SQL Lab1
    SQL Lab1
    Document27 pagini
    SQL Lab1
    Ion Şuiu
    Încă nu există evaluări
  • Laborator 4 PR
    Laborator 4 PR
    Document6 pagini
    Laborator 4 PR
    Guzun Ion
    Încă nu există evaluări
  • Curs 9 Java
    Curs 9 Java
    Document13 pagini
    Curs 9 Java
    Alexandra Somu
    Încă nu există evaluări
  • Web de Tip REST
    Web de Tip REST
    Document10 pagini
    Web de Tip REST
    anon_503247383
    Încă nu există evaluări
  • Tutorial Servelturi v2
    Tutorial Servelturi v2
    Document14 pagini
    Tutorial Servelturi v2
    Diman Ionut
    Încă nu există evaluări
  • Securitatea Spatiului Cibernetic - Laboratorul 3
    Securitatea Spatiului Cibernetic - Laboratorul 3
    Document10 pagini
    Securitatea Spatiului Cibernetic - Laboratorul 3
    Gigi Beton
    Încă nu există evaluări
  • 1.Conditii de licentiere - для слияния
    1.Conditii de licentiere - для слияния
    Document3 pagini
    1.Conditii de licentiere - для слияния
    DanuIepuras
    Încă nu există evaluări
  • Decorator Design Pattern Daniel Iepuras TI-171
    Decorator Design Pattern Daniel Iepuras TI-171
    Document4 pagini
    Decorator Design Pattern Daniel Iepuras TI-171
    DanuIepuras
    Încă nu există evaluări
  • Kulev PC Lab Raport Model 2020
    Kulev PC Lab Raport Model 2020
    Document4 pagini
    Kulev PC Lab Raport Model 2020
    arabe arabe
    Încă nu există evaluări
  • 1.Conditii de licentiere - для слияния
    1.Conditii de licentiere - для слияния
    Document3 pagini
    1.Conditii de licentiere - для слияния
    DanuIepuras
    Încă nu există evaluări
  • Iepuras Daniel Lab 1 TS
    Iepuras Daniel Lab 1 TS
    Document4 pagini
    Iepuras Daniel Lab 1 TS
    DanuIepuras
    Încă nu există evaluări
  • Modele de Culori
    Modele de Culori
    Document5 pagini
    Modele de Culori
    DanuIepuras
    Încă nu există evaluări
  • Programarea in Retea Lab 3 Iepuras Daniel TI-171
    Programarea in Retea Lab 3 Iepuras Daniel TI-171
    Document8 pagini
    Programarea in Retea Lab 3 Iepuras Daniel TI-171
    DanuIepuras
    Încă nu există evaluări
  • Lab7 IOT
    Lab7 IOT
    Document8 pagini
    Lab7 IOT
    DanuIepuras
    Încă nu există evaluări
  • Iot 6
    Iot 6
    Document10 pagini
    Iot 6
    DanuIepuras
    Încă nu există evaluări
  • Builder Design Pattern Iepuras Daniel TI-171
    Builder Design Pattern Iepuras Daniel TI-171
    Document8 pagini
    Builder Design Pattern Iepuras Daniel TI-171
    DanuIepuras
    Încă nu există evaluări
  • Singleton Design Pattern Iepuras Daniel TI-171
    Singleton Design Pattern Iepuras Daniel TI-171
    Document3 pagini
    Singleton Design Pattern Iepuras Daniel TI-171
    DanuIepuras
    Încă nu există evaluări
  • Lab 5-6
    Lab 5-6
    Document18 pagini
    Lab 5-6
    DanuIepuras
    Încă nu există evaluări
  • Strategy Design Pattern Daniel Iepuras TI-171
    Strategy Design Pattern Daniel Iepuras TI-171
    Document6 pagini
    Strategy Design Pattern Daniel Iepuras TI-171
    DanuIepuras
    Încă nu există evaluări
  • Tipuri de Microfoane
    Tipuri de Microfoane
    Document7 pagini
    Tipuri de Microfoane
    DanuIepuras
    Încă nu există evaluări
  • Adapter Design Pattern Daniel Iepuras TI-171
    Adapter Design Pattern Daniel Iepuras TI-171
    Document6 pagini
    Adapter Design Pattern Daniel Iepuras TI-171
    DanuIepuras
    Încă nu există evaluări
  • Builder Design Pattern Iepuras Daniel TI-171
    Builder Design Pattern Iepuras Daniel TI-171
    Document8 pagini
    Builder Design Pattern Iepuras Daniel TI-171
    DanuIepuras
    Încă nu există evaluări
  • Lab 5-6
    Lab 5-6
    Document18 pagini
    Lab 5-6
    DanuIepuras
    Încă nu există evaluări
  • Lab 5-6
    Lab 5-6
    Document18 pagini
    Lab 5-6
    DanuIepuras
    Încă nu există evaluări
  • Lab 5-6
    Lab 5-6
    Document18 pagini
    Lab 5-6
    DanuIepuras
    Încă nu există evaluări
  • Aport: Lucrare de Laborator Nr.3 Tema
    Aport: Lucrare de Laborator Nr.3 Tema
    Document3 pagini
    Aport: Lucrare de Laborator Nr.3 Tema
    DanuIepuras
    Încă nu există evaluări
  • Iepuras Daniel LAB 3 TS
    Iepuras Daniel LAB 3 TS
    Document8 pagini
    Iepuras Daniel LAB 3 TS
    DanuIepuras
    Încă nu există evaluări
  • New Microsoft Word Document
    New Microsoft Word Document
    Document26 pagini
    New Microsoft Word Document
    DanuIepuras
    Încă nu există evaluări
  • AC Lab 2
    AC Lab 2
    Document4 pagini
    AC Lab 2
    DanuIepuras
    Încă nu există evaluări
  • AC Lab 4
    AC Lab 4
    Document4 pagini
    AC Lab 4
    DanuIepuras
    Încă nu există evaluări
  • GC Lab 3
    GC Lab 3
    Document3 pagini
    GC Lab 3
    DanuIepuras
    Încă nu există evaluări
  • GC Lab 2
    GC Lab 2
    Document7 pagini
    GC Lab 2
    DanuIepuras
    Încă nu există evaluări
  • Somipp Linux 1 UTM
    Somipp Linux 1 UTM
    Document10 pagini
    Somipp Linux 1 UTM
    Cristi Poselețchi
    Încă nu există evaluări
  • TW Lab 6
    TW Lab 6
    Document6 pagini
    TW Lab 6
    DanuIepuras
    Încă nu există evaluări
  • Baze de Data Lab4
    Baze de Data Lab4
    Document2 pagini
    Baze de Data Lab4
    DanuIepuras
    0% (1)