Как я могу отправить исключение с сервера клиенту (я использую сокет T.C.P.), должен ли я использовать RMI или есть другой способ? - PullRequest
0 голосов
/ 24 марта 2019

Мне было поручено создать сервер, который эмулирует калькулятор и который при обнаружении операции, отличной от '+', '-', '*' & '/', генерирует исключение для клиента.но я не могу понять, как отправить Исключение, сгенерированное на Сервере, Клиенту.

Изначально я наивно думал, что могу легко сделать это с помощью dout.writeUTF (e.getMessage ()) вблок catch.


    package networking;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.*;

class OperationDeniedException extends Exception {
    private String op;

    public OperationDeniedException(String op) {
        this.op = op;
        // TODO Auto-generated constructor stub
    }

    public String toString() {
        return "OperationDeniedException: Operation " + op + " is Denied by server";
    }
}

public class CalcServer {

    public static void main(String[] args) {
        String opr, op1, op2;
        double Dop1, Dop2;
        boolean divbyzero = false;
        DataInputStream din;
        DataOutputStream dout;
        PrintWriter p;
        try {
            ServerSocket ss = new ServerSocket(4444);
            Socket s = ss.accept();
            din = new DataInputStream(s.getInputStream());
            dout = new DataOutputStream(s.getOutputStream());
            p = new PrintWriter(s.getOutputStream());
            dout.writeUTF(opmsg);
            opr = din.readUTF();
            System.out.println(opr);
            try {
                System.out.println("Inside try for custom exception");
                if (opr.charAt(0) != '+' && opr.charAt(0) != '-' && opr.charAt(0) != '*' && opr.charAt(0) != '/') {
                    throw new OperationDeniedException(opr);
                }
            } catch (OperationDeniedException e) {
                String msge = e.getMessage();
                System.out.println("just before write");
                dout.writeUTF((String) e.toString());
                System.out.println("exception sent");
                System.exit(0);
            }
            dout.writeUTF("Send the first Operand");
            op1 = din.readUTF();
            Dop1 = Double.parseDouble(op1);
            dout.writeUTF("Send the Second Operand");
            op2 = din.readUTF();
            Dop2 = Double.parseDouble(op2);
            switch (opr) {
            case "+":
                Dop1 += Dop2;
                break;
            case "-":
                Dop1 -= Dop2;
                break;
            case "*":
                Dop1 *= Dop2;
                break;
            case "/":
                if (Dop2 == 0.0) {
                    divbyzero = true;
                    break;
                }
                Dop1 /= Dop2;
                break;

            default:
                break;
            }
            if (divbyzero) {
                dout.writeUTF("Second operand is 0 and can't divide bt zero");
            }
            dout.writeUTF("Ans of the operation is= " + Double.toString(Dop1));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    static final String opmsg = "Select one of the following operations +, -, *, /.";

}

1 Ответ

0 голосов
/ 24 марта 2019

Таким образом, решение переместило блок catch моего пользовательского исключения в область действия моего Объект DataOutputStream для отправки сообщения клиенту с помощью dout.writeUTF (e.getMessage ()); Извините людей, время которых я потратил впустую. Если есть лучший способ, пожалуйста, сделайте пост.

...