Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Simple Client-Server calculator, written in Java.

NotificationsYou must be signed in to change notification settings

emikodes/ClientServer-Calculator-Java

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 

Repository files navigation


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.

Supports[ / + - % ^]* operands (multiply,divide,add,subtract,modulus,pow).


Contact

Coded by@emikodes - feel free to contact me!



[8]ページ先頭

©2009-2025 Movatter.jp