Sunteți pe pagina 1din 6

Ministerul Educaţiei al Republicii Moldova

Universitatea Tehnică a Moldovei


Facultatea Calculatoare Informatica si
Microelectronica Departamentul Ingineria
Software si Automatica

RAPORT

Lucrarea de laborator nr.4


Disciplina: Programare în rețea
Tema: Chat server-client

A efectuat: st. gr. TI-171 Guzun Ion

A verificat: Buldumac Oleg

Chisinau 2020
Mersul lucrării:
Primul pas pentru creare chatului a fost Serverul, anume el este centrul cu care comunică
fiecare client; iar pentru noi el va fi și punctul de trecere a clienților dintr-o stare în alta. UI al
serverului arată astfel:

Figura 1. Interfața grafică a serverului(stins/aprins)

La pornirea serverului acesta apelează metoda startSetver:


public void startServer(int port) {
try {
// Create server socket
serverSocket = new ServerSocket(port);

running = true;

// Add message to log panel


addToLogPanel("Server", "Server started!");

waitForClient();

} catch (IOException ex) {


System.err.println("Couldn't listen on port " + port);
}
}

Variabila running, de tip boolean, răspunde pentru intrarea în regiunea de ascultare a


clienților. Pentru aceasta răspunde un thread ce este apelat la pornirea serverului și se stopează,
respectiv, la oprirea acestuie:
public void waitForClient() {
new Thread("Client listener") {
@Override
public void run() {
try {
while (running) {
dataSocket = serverSocket.accept();
serverConnection.add(new ServerConnection(dataSocket));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}

// Stop server
private void stopServer() {
try {
// Close server socket
serverSocket.close();

running = false;

// Add message to log panel


addToLogPanel("Server", "Server closed!");

// Close window
System.exit(0);
} catch (IOException ex) {
Logger.getLogger(ServerForm.class.getName()).log(Level.SEVERE, null, ex);
}
}

Dacă clientul dorește să se conecteze la server, acesta este primit de către thread și adăugat
la lista de clienți:
protected static ArrayList<ServerConnection> serverConnection;
Clasa ServerConnection răspunde pentru transmiterea sau primirea datelor dintre client-
server; fiecare obiect de tip ServerConnection este un nou thread ce se finisează doar când este
șters din listă. Pentru transmitere se folosește metoda sendMessageToAllClients:
// Send message to all clients
public void sendMessageToAllClients(String message) {
for (int i = 0; i < ServerForm.serverConnection.size(); i++) {
try {
ServerConnection serverConnection = ServerForm.serverConnection.get(i);
serverConnection.dataOutputStream.writeUTF(message);
//serverConnection.dataOutputStream.flush();
} catch (IOException ex) {
Logger.getLogger(ServerConnection.class.getName()).log(Level.SEVERE, null, ex);
}
}
}

Fiecare mesaj este verificat la comandă către server: connect/disconnect user:


// Verify if message is command
private boolean isCommand(String message) {
if (message.startsWith("\\connect:")) {
// Get user name
String connectName = message.substring(message.indexOf(":") + 1);
if (this.name == null) {
this.name = connectName;
}
// Add name in user list
addInUserList();

ServerForm.addToLogPanel("Server", "User [" + connectName + "] connected.");

return true;

} else if (message.startsWith("\\disconnect:")) {
// Get user name
String disconnectName = message.substring(message.indexOf(":") + 1);
// Disconnect user
disconnect(disconnectName);
// Delete name from user list
deleteFromUserList(name);

ServerForm.addToLogPanel("Server", "User [" + name + "] disconnected.");

return true;
}

return false;
}

La ieșirea clientului se transmite mesaj de disconnect ce apelează metoda:


// Disconnect user
protected void disconnect(String disconnectName) {

for (int i = 0; i < ServerForm.serverConnection.size(); i++) {


ServerConnection serverConnection = ServerForm.serverConnection.get(i);

if (serverConnection.name.equals(disconnectName)) {
serverConnection.running = false;
ServerForm.serverConnection.remove(i);
break;
}

}
}

Clientul la rândul său începe cu interfața de logare:


Figura 2. Interfața grafică de logare a clientului
După introducerea numelui se face trecere la interfața chatului:

Figura 3. Interfața chatului

La creare se transmite messajul de conectare către server:


// Send connection message to server
dataOutputStream.writeUTF("\\connect:" + name);
Apoi se pornește threadul messageListener:
public void messageListener() {
new Thread("Listener") {
@Override
public void run() {
try {
while (running) {
String message = dataInputStream.readUTF();
if (!message.isEmpty()) {
if (!isCommand(message)) {
addMessageToChat(message);
}
}
}
} catch (IOException ex) {
Logger.getLogger(ClientForm.class.getName()).log(Level.SEVERE, null, ex);
}
}
}.start();
}

Pentru adăugarea mesajului în textArea se folosește metoda addMessageToChat:


private void addMessageToChat(String message) {
// Add message to log panel
jTextPaneChat.setText(jTextPaneChat.getText().concat(message + "\n"));
}

La închiderea clientului se transmite mesaj de disconnect către server:


// Close client
private void closeClient() {

try {
// Stop thread lopp
running = false;

// Send disconnection message to server


dataOutputStream.writeUTF("\\disconnect:" + name);

// Close window
System.exit(0);
} catch (IOException ex) {
Logger.getLogger(ClientForm.class.getName()).log(Level.SEVERE, null, ex);
}