Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
La seguente applicazione realizzata con le tre tecniche di comunicazione (Socket, RPC, RMI) consiste in un server che
può fornire due tipi di servizi a un client che si connette ad esso: la data e l'ora di sistema. Il seguente esempio ha
l'obiettivo di mostrare quanto detto nel paragrafo 1.3, senza badare ad ulteriori dettagli implementativi.
Socket
import java.io.*;
import java.net.*;
try {
socket = new Socket( server, 4321 );
out = new PrintStream( socket.getOutputStream() );
in = new DataInputStream( socket.getInputStream() );
}
catch( UnknownHostException e )
{
System.err.println("Impossibile collegarsi al server " + server );
System.exit(1);
}
catch( IOException e )
{
System.err.println( "Impossibile comunicare con il server " + server );
System.exit(1);
}
out.close();
in.close();
stdIn.close();
socket.close();
}
}
Implementazione del server (Server.java):
import java.net.*;
import java.io.*;
try {
serverSocket = new ServerSocket( porta );
}
catch (IOException e)
{
System.err.println( "Impossibile ascoltare sulla porta " + porta );
System.exit(1);
}
try {
clientSocket = serverSocket.accept();
}
catch (IOException e)
{
System.err.println( "Impossibile accettare il collegamento" );
System.exit(1);
}
outputLine = p.processaInput(null);
out.println(outputLine);
out.flush();
out.close();
in.close();
clientSocket.close();
serverSocket.close();
}
}
Implementazione del protocollo di comunicazione (Protocol.java):
import java.net.*;
import java.io.*;
import java.util.Date;
import java.text.*;
if( !collegato )
{
output = "pronto a ricevere richieste";
collegato = true;
}
else
{
if( input.equalsIgnoreCase("DATA"))
output = "" + DateFormat.getDateInstance().format( new Date() );
else if( input.equalsIgnoreCase("ORA"))
output = "" + DateFormat.getTimeInstance().format( new Date() );
else
output = "fine collegamento";
}
return output;
}
}
RPC (High Level RPC)
Implementazione delle routine di conversione condivise dal client e dal server (RDOra_xdr.c)
#include <rpc/rpc.h>
#include "rdora.h"
#include <rpc/rpc.h>
#include "rdora.h"
svc_run();
}
#include <stdio.h>
#include <time.h>
#include "rdora.h"
lt = time( NULL );
ptr = localtime( < );
data[0] = '\0';
return (int)data;
}
Implementazione della funzione che restituisce l'ora locale al server (Read_Ora.c)
#include <stdio.h>
#include <time.h>
#include "rdora.h"
lt = time( NULL );
ptr = localtime( < );
ora[0] = '\0';
return (int)ora;
}
#include <stdio.h>
#include <string.h>
#include <rpc/rpc.h>
#include "rdora.h"
printf("> ");
scanf( "%s", &inputTastiera );
while(1)
{
if( strcmp( inputTastiera, "ora" ) == 0 )
{
char ora[REPLY_SIZE];
read_ora( argv[1], ora );
printf( "Server: %s\n", ora );
}
else if( strcmp( inputTastiera, "data" ) == 0 )
{
char data[REPLY_SIZE];
read_data( argv[1], data );
printf( "Server: %s\n", data );
}
else break;
scanf( "%s", &inputTastiera );
}
return 0;
}
clnt_stat = callrpc(host,DORAPROG,DORAVERS,READDATA,xdr_data,data,xdr_data,data);
clnt_stat = callrpc(host,DORAPROG,DORAVERS,READORA,xdr_ora,ora,xdr_ora,ora);
CC = cc
import java.io.*;
import java.net.*;
import java.rmi.*;
while( true )
{
System.out.print( "> " );
fromUser = stdIn.readLine();
if( fromUser != null )
{
System.out.println("Client: " + fromUser);
DOra ds = null;
try {
ds = (DOra) Naming.lookup( "//" + server + ":1099/DOra" );
} catch ( RemoteException e )
{
System.out.println( "Impossibile connettersi al server " + server );
System.exit(1);
}
catch ( NotBoundException e )
{
System.out.println("Server impossibilitato a fornire il servizio" );
System.exit(1);
}
import java.util.Date;
import java.rmi.*;
import java.rmi.*;
import java.net.*;