I am writing a small program with a Client and a Server. The server program contains the calculator program in it. While the server and the client runs, the client can input and equation eg. 2 + 2 and the server will calculate it and send the answer to the client. The program should contain a help option as well so when the command help is sent from the client to the server, the server should return a help menu.
My problem is that it is returning the help menu but all in one line, it is not printing it out to the console in separate lines. Thanks for any help.
SERVER CODE:
package One;
import java.io.*;
import java.net.*;
public class ServerCalculator {
static double answer;
public ServerCalculator(){
System.out.println("Server...");
theServer();
}
void theServer(){
try{
ServerSocket ss = new ServerSocket(9990);
while(true){
Socket sc = ss.accept();
Help hp = new Help();
BufferedReader br = new BufferedReader(new InputStreamReader(sc.getInputStream()));
String compute = br.readLine();
Maths(compute);
PrintWriter pw = new PrintWriter(sc.getOutputStream());
if(compute.equals("help")){
// pw.println(hp.noOfLines());
pw.println(hp.menu());
}
if(compute.equals("exit")){
ss.close();
}
else{
pw.println(answer);
}
pw.flush();
}
}
catch (Exception ee){
ee.printStackTrace();
}
}
static double Maths(String compute){
String message[] = compute.split(" ");
if(message[0].equalsIgnoreCase("Help"))
{
return -2;
}
if(message[0].equalsIgnoreCase("Exit"))
{
return -1;
}
double rad = 0;
double a = Integer.parseInt(message[0]);
double b = Integer.parseInt(message[2]);
if(message[1].equalsIgnoreCase("Sin")){
rad = Math.toRadians(a);
answer = Math.sin(rad);
}
if(message[1].equalsIgnoreCase("Cos")){
if(a==90 || a==270){
answer = 0;
}
else{
rad = Math.toRadians(a);
answer = Math.cos(rad);
}
}
if(message[1].equalsIgnoreCase("Tan")){
if(a==90 || a==270){
System.out.println("Invalid Calculation");
answer = 0;
}
else if(a==45 || a==135){
rad = Math.toRadians(a);
answer = Math.tan(rad);
}
rad = Math.toRadians(a);
answer = Math.tan(rad);
}
if(message[1].equalsIgnoreCase("Power") || (message[1].equalsIgnoreCase("^")))
{
answer = Math.pow(a, b);
}
if(message[1].equalsIgnoreCase("Multiply") || (message[1].equalsIgnoreCase("*")))
{
answer = a*b;
}
if(message[1].equalsIgnoreCase("Add") || (message[1].equalsIgnoreCase("+")))
{
answer = a+b;
}
if(message[1].equalsIgnoreCase("Subtract") || (message[1].equalsIgnoreCase("-")))
{
answer = a-b;
}
if(message[1].equalsIgnoreCase("Divide") || (message[1].equalsIgnoreCase("/")))
{
answer = a/b;
}
return answer;
}
}
CLIENT CODE:
package One;
import java.net.*;
import java.util.Scanner;
import java.io.*;
public class ClientCalculator {
public static void main(String[] args) {
Socket sc;
System.out.println("Client...");
while(true){
try
{
Scanner sin = new Scanner(System.in);
String question = sin.nextLine();
System.out.println("Processing: " + question);
sc = new Socket("localhost",9990);
PrintWriter pw = new PrintWriter(sc.getOutputStream());
pw.println(question);
pw.flush();
BufferedReader br = new BufferedReader(new InputStreamReader(sc.getInputStream()));
String answer = br.readLine();
System.out.println(question + " = " + answer);
// sc.close();
// sin.close();
}
catch(Exception ee){
}
}
}
}
HELP MENU:
package One;
public class Help {
String menu(){
String helpMenu =
"Instructions for the calculator " +
"Input the number followed by space and then by word or operator and by number to get result " +
"e.g. 5 + 5. or 30 Sin 30 - where 30 is the angle. " +
"Options are " +
"Multiply or (*) " +
"Add or (+) " +
"Subtract or (-) " +
"Divide or (/) " +
"Sin, Cos, Tan ";
return helpMenu;
}
// String noOfLines() {
//
// return "9";
// }
}
RUN CODE:
package One;
public class TestClass {
public static void main(String[] args) {
new ServerCalculator();
}
}
You have to add a while loop around your readline method in the client:
it is also preferred to use constants instead of hardcoding it:
System.getProperty("line.separator");