Permalink
Browse files

Aggiunto ServerRegisterIndri

  • Loading branch information...
1 parent 0c54e46 commit 7e3d6d5b45773da55a832a843f9ee4e3b027240a @indrimuska committed Apr 11, 2012
View
@@ -0,0 +1,35 @@
+//
+// Application/Alerts.cpp
+// Service Oriented Architecture
+//
+// Created by Indri Muska on 11/04/12.
+// Copyright (c) 2012 Indri Muska. All rights reserved.
+//
+
+#include <iostream>
+
+#include "../SOA/Service.h"
+
+using namespace std;
+
+class Alerts {
+public:
+ void generalWarning(string warning) {
+ cout << "\033[1;33m" << warning << "\033[0m\n\n";
+ }
+ void notifyError(string error) {
+ cerr << "\033[1;31m" << error << "\033[0m\n\n";
+ }
+ void successMessage(string message) {
+ cerr << "\033[1;32m" << message << "\033[0m\n\n";
+ }
+ void serviceRequestMessage(Service &s) {
+ cout << "Richiesta del servizio \033[1;34m" << s.getServiceName() << "\033[0m:\n";
+ }
+ void serviceRequestFailed() {
+ notifyError("Richiesta rifiutata");
+ }
+ void serviceRequestSuccess() {
+ successMessage("Servizio confermato");
+ }
+};
@@ -80,9 +80,6 @@ bool ImageManipulation::getImageFromParameter(parameter_direction direction, int
else p = &outParameters[parameter_number];
return getImageFromBuffer(* p, filename);
}
-string ImageManipulation::getServiceName() {
- return name;
-}
parameter_value ImageManipulation::getParameterValue(parameter_direction direction, int parameter_number) {
if (direction == IN) return inParameters[parameter_number].getParameterValue();
else return outParameters[parameter_number].getParameterValue();
@@ -29,7 +29,6 @@ class ImageManipulation : public Service {
ImageManipulation(string workDirectory);
bool setImageAsParameter(parameter_direction direction, int parameter_number, string filename);
bool getImageFromParameter(parameter_direction direction, int parameter_number, string filename);
- string getServiceName();
parameter_value getParameterValue(parameter_direction direction, int parameter_number);
void setParameterValue(parameter_direction direction, int parameter_number, parameter_value &value);
};
@@ -0,0 +1,107 @@
+//
+// ServerRegister.cpp
+// Service Oriented Architecture
+//
+// Created by Indri Muska on 11/04/12.
+// Copyright (c) 2012 Indri Muska. All rights reserved.
+//
+
+#include <iostream>
+
+#include "../SOA/SOA.h"
+#include "../SOA/Communication.h"
+
+using namespace std;
+
+class ServerRegister {
+private:
+ string address;
+ string port;
+ Communicator comm;
+
+ bool sendAck(Socket * sk, string ack) {
+ if (!sk->sendString(ack)) {
+ cerr << "Errore nell'invio di un messaggio di ACK\n";
+ return false;
+ }
+ return true;
+ }
+public:
+ ServerRegister(string port) {
+ this->address = comm.getIP();
+ this->port = port;
+ comm.startListener(port);
+ }
+ bool serveRequests() {
+ string request;
+ Socket * sk = new Socket();
+ if (!comm.waitForConnection(* sk)) return false;
+ if (!sk->receiveString(request)) return false;
+ if (!request.compare(CONN_ACK_REQ)) return confirmConnection(sk);
+ if (!request.compare(SRV_REG_REQ)) return serverRegistration(sk);
+ if (!request.compare(SRC_REG_REQ)) return serviceRegistration(sk);
+ if (!request.compare(SRV_UNREG_REQ)) return serverUnRegistration(sk);
+ if (!request.compare(SRC_UNREG_REQ)) return serviceUnRegistration(sk);
+ if (!request.compare(SRV_REG_DISP)) return serversDisplay(sk);
+ if (!request.compare(SRC_REG_DISP)) return servicesDisplay(sk);
+ if (!request.compare(SRV_REQ)) return serverRequest(sk);
+ cerr << "Richiesta sconosciuta\n\n";
+ return false;
+ }
+ bool confirmConnection(Socket * sk) {
+ if (!sendAck(sk, CONN_ACK_RESP)) return false;
+ delete sk;
+ return true;
+ }
+ bool serverRegistration(Socket * sk) { return true; }
+ bool serviceRegistration(Socket * sk) { return true; }
+ bool serverUnRegistration(Socket * sk) { return true; }
+ bool serviceUnRegistration(Socket * sk) { return true; }
+ bool serversDisplay(Socket * sk) { return true; }
+ bool servicesDisplay(Socket * sk) { return true; }
+ bool serverRequest(Socket * sk) {
+ string service;
+ if (!sk->receiveString(service)) {
+ cerr << "Errore nella ricezione del nome del servizio\n";
+ return false;
+ }
+ cout << "È stato richiesto un server che fornisca il servizio \033[1;34m" << service << "\033[0m\n";
+ // Qui bisogna cercare un server che supporta il servizio 'service'
+ // e scegliero in base alla politica implementata (es. Round Robin)
+ // Non mi ricordo come hai implementato il server register, per far prima io uso un vettore di stringhe
+ vector<string> servers;
+ servers.push_back("127.0.0.1:2222/rotate");
+ servers.push_back("127.0.0.1:2222/horizontal flip");
+ servers.push_back("127.0.0.1:22221/store image");
+ servers.push_back("127.0.0.1:22221/get image");
+ servers.push_back("127.0.0.1:22221/get list");
+ string server[2];
+ for (int i = 0; i < (int) servers.size(); i++)
+ if (!servers[i].substr(servers[i].find_first_of("/")+1).compare(service)) {
+ server[0] = servers[i].substr(0, servers[i].find_first_of(":"));
+ server[1] = servers[i].substr(servers[i].find_first_of(":")+1, servers[i].find_first_of("/")-servers[i].find_first_of(":")-1);
+ break;
+ }
+ // Se non c'è nessun server che supporta quel servizio allora bisogna mandare questo messaggio:
+ if (!server[0].size() || !server[1].size()) {
+ cout << "\033[1;31mNon si è registrato alcune server che fornisca il servizio richiesto\033[0m\n\n";
+ if (!sk->sendString("Non si è registrato alcun server che fornisca il servizio richiesto")) {
+ cerr << "Errore nell'invio della notifica di assenza di server registrato\n";
+ return false;
+ }
+ return true;
+ }
+ // Altrimenti bisogna mandare questo ACK:
+ if (!sendAck(sk, SRV_RESP)) return false;
+ cout << "Il server scelto è \033[1;32m" << server[0] << ":" << server[1] << "\033[0m\n\n";
+ if (!sk->sendString(server[0]) || !sk->sendString(server[1])) {
+ cerr << "Errore nell'invio dell'indirizzo o della porta del server\n";
+ return false;
+ }
+ delete sk;
+ return true;
+ }
+ ~ServerRegister() {
+ comm.closeAllCommunications();
+ }
+};
View
Binary file not shown.
View
Binary file not shown.
View
@@ -8,40 +8,34 @@
#include "SOA.h"
-bool SOA::setServerRegister(string SRaddress, string SRport) {
- this->SRaddress = SRaddress;
- this->SRport = SRport;
- Socket SRsocket;
+bool SOA::sendRequest(string request, Socket &SRsocket) {
if (!comm.connectTo(SRaddress, SRport, SRsocket)) {
cerr << "Impossibile connettersi al Server Register\n";
return false;
}
+ if (!SRsocket.sendString(request)) {
+ cerr << "Errore nell'invio di una richiesta al Service Register\n";
+ return false;
+ }
+ return true;
+}
+bool SOA::setServerRegister(string SRaddress, string SRport) {
+ this->SRaddress = SRaddress;
+ this->SRport = SRport;
string ack;
- if (!SRsocket.sendString(CONN_ACK_REQ) ||
- !SRsocket.receiveString(ack) || ack.compare(CONN_ACK_RESP)) {
+ Socket SRsocket;
+ if (!sendRequest(CONN_ACK_REQ, SRsocket)) return false;
+ if (!SRsocket.receiveString(ack) || ack.compare(CONN_ACK_RESP)) {
cerr << "Impossibile confermare la connesione al Server Register\n" << ack << endl;
return false;
}
SRsocket.closeSocket();
return true;
}
bool SOA::serverRegistration(string SPaddress, string SPport) {
- cout << "SPaddress: " << SPaddress << endl;
- cout << "SPport: " << SPport << endl;
- cout << "SRaddress: " << SRaddress << endl;
- cout << "SRport: " << SRport << endl;
- Socket SRsocket;
- if (!comm.connectTo(SRaddress, SRport, SRsocket)) {
- cerr << "Impossibile connettersi al Server Register\n";
- return false;
- }
- cout << "SOA::serverRegistration -- Dopo la connessione" << endl;
string ack;
- if (!SRsocket.sendString(SRV_REG_REQ)) {
- cerr << "Errore nella richiesta di registrazione del server\n";
- return false;
- }
- cout << "SOA::serverRegistration -- Dopo l'invio di SRV_REG_REQ" << endl;
+ Socket SRsocket;
+ if (!sendRequest(SRV_REG_REQ, SRsocket)) return false;
if (!SRsocket.sendString(SPaddress + ':' + SPport)) {
cerr << "Errore nella registrazione del server\n";
return false;
@@ -54,16 +48,9 @@ bool SOA::serverRegistration(string SPaddress, string SPport) {
return true;
}
bool SOA::serviceRegistration(Service s) {
- Socket SRsocket;
- if (!comm.connectTo(SRaddress, SRport, SRsocket)) {
- cerr << "Impossibile connettersi al Server Register\n";
- return false;
- }
- if (!SRsocket.sendString(SRC_REG_REQ)) {
- cerr << "Errore nella richiesta di registrazione del servizio\n";
- return false;
- }
string ack;
+ Socket SRsocket;
+ if (!sendRequest(SRC_REG_REQ, SRsocket)) return false;
s.serviceRegistration(SRsocket);
if (!SRsocket.receiveString(ack) || ack.compare(SRC_REG_RESP)) {
cerr << "Errore nella conferma di registrazione del servizio\n" << ack << endl;
@@ -73,16 +60,9 @@ bool SOA::serviceRegistration(Service s) {
return true;
}
bool SOA::serverUnRegistration(string SPaddress, string SPport) {
- Socket SRsocket;
- if (!comm.connectTo(SRaddress, SRport, SRsocket)) {
- cerr << "Impossibile connettersi al Server Register\n";
- return false;
- }
string ack;
- if (!SRsocket.sendString(SRV_UNREG_REQ)) {
- cerr << "Errore nella richiesta di de-registrazione del server\n";
- return false;
- }
+ Socket SRsocket;
+ if (!sendRequest(SRV_UNREG_REQ, SRsocket)) return false;
if (!SRsocket.sendString(SPaddress + ':' + SPport)) {
cerr << "Errore nella registrazione del server\n";
return false;
@@ -95,21 +75,33 @@ bool SOA::serverUnRegistration(string SPaddress, string SPport) {
return true;
}
bool SOA::serviceUnRegistration(Service s) {
+ string ack;
Socket SRsocket;
- if (!comm.connectTo(SRaddress, SRport, SRsocket)) {
- cerr << "Impossibile connettersi al Server Register\n";
+ if (!sendRequest(SRC_UNREG_REQ, SRsocket)) return false;
+ s.serviceUnRegistration(SRsocket);
+ if (!SRsocket.receiveString(ack) || ack.compare(SRC_UNREG_RESP)) {
+ cerr << "Errore nella conferma di de-registrazione del servizio\n" << ack << endl;
return false;
}
+ SRsocket.closeSocket();
+ return true;
+}
+bool SOA::getServerAddress(string service, string &address, string &port) {
string ack;
- if (!SRsocket.sendString(SRV_UNREG_REQ)) {
- cerr << "Errore nella richiesta di de-registrazione del servizio\n";
+ Socket SRsocket;
+ if (!sendRequest(SRV_REQ, SRsocket)) return false;
+ if (!SRsocket.sendString(service)) {
+ cerr << "Errore nell'invio del nome del servizio\n";
return false;
}
- s.serviceUnRegistration(SRsocket);
- if (!SRsocket.receiveString(ack) || ack.compare(SRV_UNREG_RESP)) {
- cerr << "Errore nella conferma di de-registrazione del servizio\n" << ack << endl;
+ if (!SRsocket.receiveString(ack) || ack.compare(SRV_RESP)) {
+ cerr << "Errore nella ricezione dell'indirizzo del server\n" << ack << endl;
+ return false;
+ }
+ if (!SRsocket.receiveString(address) || !SRsocket.receiveString(port)) {
+ cerr << "Errore nella ricezione dell'indirizzo o della porta del server\n" << ack << endl;
return false;
}
SRsocket.closeSocket();
return true;
-}
+}
View
@@ -24,25 +24,25 @@
#define SRV_UNREG_RESP "Starting from now, you will not contacted"
#define SRC_UNREG_REQ "Sorry, I can't give a service"
#define SRC_UNREG_RESP "Don't worry, you'll not asked for that service again"
-
-//#define SOA_MESSAGES enum { CONN_ACK_REQ, CONN_ACK_RESP, SRV_REG_REQ, SRV_REG_RESP, SRC_REG_REQ, SRC_REG_RESP, SRV_DEREG_REQ, SRV_DEREG_RESP, SRC_DEREG_REQ, SRC_DEREG_RESP };
+#define SRV_REQ "I need the address of one Service Provider that support this service"
+#define SRV_RESP "This is the address of the SP you've requested"
using namespace std;
class SOA {
private:
-
-
+ bool sendRequest(string request, Socket &SRsocket);
public:
string SRaddress;
string SRport;
Communicator comm;
+
bool setServerRegister(string SRaddres, string SRport);
bool serverRegistration(string SPaddres, string SPport);
bool serviceRegistration(Service s);
bool serverUnRegistration(string SPaddres, string SPport);
bool serviceUnRegistration(Service s);
- bool getServerAddress(string service);
+ bool getServerAddress(string service, string &address, string &port);
};
#endif
View
@@ -49,6 +49,9 @@ void Service::setParameters(vector<parameter> &parameters) {
else outParameters.push_back(parameters[i]);
}
}
+string Service::getServiceName() {
+ return name;
+}
void Service::setService(string name, vector<parameter> &parameters) {
this->name = name;
setParameters(parameters);
View
@@ -55,6 +55,7 @@ class Service {
void setName(string name);
void setParameters(vector<parameter> &parameters);
void setService(string name, vector<parameter> &parameters);
+ string getServiceName();
// Il server lo usa per fare richiesta di registrazione di un servizio
// Il client lo usa per fare richiesta di un servizio
View
Binary file not shown.
View
@@ -0,0 +1,26 @@
+//
+// ServerRegisterIndri.cpp
+// Service Oriented Architecture
+//
+// Created by Indri Muska on 11/04/12.
+// Copyright (c) 2012 Indri Muska. All rights reserved.
+//
+
+#include "Application/ServerRegister.cpp"
+
+int main(int argc, char ** argv) {
+
+ string port;
+
+ if (argc != 2) {
+ cout << "Porta del Server Register: ";
+ cin >> port;
+ cout << endl;
+ } else port = argv[1];
+
+ ServerRegister SR(port);
+
+ cout << "In attesa di connessioni...\n\n";
+ while (1) SR.serveRequests();
+
+}
Oops, something went wrong.

0 comments on commit 7e3d6d5

Please sign in to comment.