You signed in with another tab or window.Reload to refresh your session.You signed out in another tab or window.Reload to refresh your session.You switched accounts on another tab or window.Reload to refresh your session.Dismiss alert
Simple Client-Server calculator, written in Java using sockets.
Code:
Client:
importjava.io.BufferedReader;importjava.io.InputStreamReader;importjava.io.OutputStreamWriter;importjava.io.PrintWriter;importjava.net.Socket;importjava.util.Scanner;publicclassClientCalculator {publicstaticvoidmain(String[]args) {System.out.println("Connessione al server...");try(SocketconnessioneServer =newSocket("localhost",5000)){StringIPServer =connessioneServer.getRemoteSocketAddress().toString();StringIPLocale =connessioneServer.getLocalAddress().toString();System.out.println("Connessione col server stabilita:\nIP Server remoto: " +IPServer +"\nIP Client: " +IPLocale);BufferedReaderstreamInput =newBufferedReader(newInputStreamReader(connessioneServer.getInputStream()));PrintWriterinvioDati =newPrintWriter(newOutputStreamWriter(connessioneServer.getOutputStream()),true);ScannerinputStreamReader =newScanner(System.in);System.out.println("Inserisci l'espressione da calcolare: ");StringespressioneInput =inputStreamReader.nextLine();System.out.println("Invio dell'espressione al server...");invioDati.println(espressioneInput);System.out.println("Attesa risposta server...");StringrispostaServer =streamInput.readLine();System.out.println("Risposta server ricevuta: " +rispostaServer);connessioneServer.close();inputStreamReader.close(); }catch(Exceptione){//Scrive sull'error stream (Visualizzazione in colore rosso nella shell di IntelliJ)System.err.println("Errore durante la connessione al server: " +e.getMessage()); } }}
Server:
importjava.io.*;importjava.net.*;importjava.util.*;publicclassServerCalcolatrice{staticintportaDelServer =5000;publicstatic <T>Stack<T>reverseStack(Stack<T>stack){Stack<T>reversedStack =newStack<T>();while(!stack.empty()){reversedStack.push(stack.pop()); }returnreversedStack; }publicstaticvoidelabora(SocketclientSocket){try{//InputStreamReader, utilizza una tecnica di lettura sequenziale, per cui legge dal client un byte alla volta.//BufferedReader invece, utilizza una tecnica di "Buffering",//per cui legge l'intera stringa in RAM (carattere per carattere, invece di leggere per bytes),//velocizzando le future operazioni di lettura.//BufferedReader non può leggere il buffer di input direttamente, quindi utilizziamo InputStreamReader//come "interfaccia" per poi permettere a BufferedReader la lettura per caratteri.BufferedReaderinputStreamClient =newBufferedReader(newInputStreamReader(clientSocket.getInputStream()));//PrintWriter permette di formattare i dati per la scrittura (partendo dai dati primitivi di Java),OutputStreamWriter è un wrapper della classe OutputStream che permette di scrivere stringhe e caratteri, al posto di bytes codificati.PrintWriteroutputStreamClient =newPrintWriter(newOutputStreamWriter(clientSocket.getOutputStream()),true);//ora, possiamo utilizzare queste due interfacce per le operazioni di I/O:System.out.println("In attesa del messaggio da parte del client...");StringmessaggioClient =inputStreamClient.readLine();System.out.println("Messaggio ricevuto: " +messaggioClient);//Esempio possibile stringa ricevuta: 15*2-3+8/6-2DoublerispostaClient=0.0;Stack<Double>numeri=newStack<Double>();Stack<Character>operandi =newStack<Character>();charoperando;Doublenum;String[]parsedElements =messaggioClient.split("(?<=[-+*^/\\(\\)])|(?=[-+*^/\\(\\)])");//Riempio i due stack "numeri" e "operandi", ed eseguo già divisioni e moltiplicazioni.numeri.push(Double.parseDouble(parsedElements[0]));for(inti=1;i<=parsedElements.length-2;i+=2){try{operando =parsedElements[i].toCharArray()[0];num =Double.parseDouble(parsedElements[i+1]);if(operando=='*'){numeri.push(numeri.pop()*num); }elseif(operando=='/'){numeri.push(numeri.pop()/num); }elseif(operando=='^'){numeri.push(Math.pow(numeri.pop(),num)); }else{numeri.push(num);operandi.push(operando); } }catch(Exceptione){System.out.println("Espressione formattata male."); } }numeri =reverseStack(numeri);operandi =reverseStack(operandi);/*System.out.println("Contenuto stack numeri:"); while(!numeri.empty()){ System.out.println(numeri.pop()); } System.out.println("Contenuto stack operandi:"); while(!operandi.empty()){ System.out.println(operandi.pop()); }*///addizioni e sottrazionirispostaClient =numeri.pop();while(!numeri.empty() && !operandi.empty()){operando =operandi.pop();num =numeri.pop();if(operando =='+'){rispostaClient +=num; }elseif(operando =='-'){rispostaClient -=num; } }System.out.println("Invio risposta al client...");outputStreamClient.println(rispostaClient);System.out.println("Risposta inviata con successo."); }catch(Exceptione){System.err.println("Errore durante l'elaborazione dei dati: " +e.getMessage()); } }publicstaticvoidmain(Stringargs[]) {//implementazione "portable" del paradigma client-server, è inserito in un blocco//try-catch, perchè genera un eccezione se il server non può esser reso//risponibile sulla porta specificata (per un qualsiasi motivo).try(ServerSocketserverSocket =newServerSocket(portaDelServer)){System.out.println("Il Server è disponibile e in ascolto sulla porta: " +portaDelServer +" , IP:" +serverSocket.getLocalSocketAddress());while(true){//accetta richieste in entrata, in un oggetto di tipo "Socket".try(SocketclientSocket =serverSocket.accept()){StringindirizzoIPclient =clientSocket.getRemoteSocketAddress().toString();//memorizza l'indirizzo IP del client a cui il server è connesso, restituisce NULL se la connessione non è andata a buon fine.System.out.println("Connesso con il client, IP: " +indirizzoIPclient);elabora(clientSocket);System.out.println("Chiusura connessione client.");clientSocket.close(); }catch (Exceptione){System.err.println("Errore durante la connessione col client: " +e.getMessage()); } } }catch(Exceptione){System.err.println("Errore durante l'esecuzione del codice server" +e.getMessage()); } }}
Technologies Used
Java
Usage
Execute theserver codefirst, than you can execute theclient code.
Write your math expression asstrings, ininfix-notation.
The server will automaticallyparse the expression, and calculate the result.