Witam mam do napisania kalkulator rozproszony w javie.
Moje pytanie brzmi w jaki sposób wyszukać w sieci jakie są dostępne komputery-serwery,które mogą takie operacje wykonywać i przypisać im konkretną operację do wykonania?
package tech;
import java.net.Socket;
import java.net.ServerSocket;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.File;
import java.io.IOException;
import java.util.Stack;
import java.util.EmptyStackException;
public class Server extends Thread
{
int port, addPort, subPort, mulPort, divPort, powPort;
/**
*
*
* @param name - nazwa watku
* @param p nr portu,na którym działa serwer główny
* @param add nr portu,na którym działa serwer dodawania
* @param sub nr portu,na którym działa serwer odejmowania
* @param mul nr portu,na którym działa serwer mnożenia
* @param div nr portu,na którym działa serwer dzielenia
* @param pow nr portu,na którym działa serwer potegowania
*/
public Server(String name, int p, int add, int sub, int mul, int div, int pow)
{
setName(name);
port = p;
addPort = add;
subPort = sub;
mulPort = mul;
divPort = div;
powPort = pow;
}
/**
* przekształca wyrażenie otrzymane od użytkownika do postaci postfixowej
* a następnie wysyła do odpowiedniego serwera zapytanie o wynik
* gdy otrzyma wynik z odpowiedniego serwera to wysyła rezultat do klienta
*@throws IOException blad we/wy
* @throws UnknownHostException nieznany host-niewłaściwy nr portu
* @throws EmptyStackException niewłaściwa ilość operatorów
*/
public void run()
{
try
{
WspolneMetody call = new WspolneMetody();
ServerSocket server = new ServerSocket(port); // uruchamianie gniazda serwera
System.out.println("Serwer glowny:\t\turuchomiony");
File rejestr = new File("log.txt");
rejestr.createNewFile();
// oczekiwanie na podlaczenie sie klienta
while(true)
{
Socket socket = server.accept();
System.out.println("Serwer glowny:\t\tklient nawiazal polaczenie");
InputStream in = socket.getInputStream(); // strumien wejsciowy (od klienta)
OutputStream out = socket.getOutputStream(); // strumien wyjsciowy (do klienta)
// odbieranie od klienta stringa z operacja arytmetyczna
String infixExpression = call.receiveString(in);
System.out.println("Serwer glowny:\t\totrzymalem od klienta wyrazenie " + infixExpression.replace("minus","-"));
infixExpression = infixExpression.replace("+"," + ").replace("-"," - ").replace("*"," * ").replace("/"," / ").replace("^"," ^ ").replace("sqrt","$ ");
infixExpression = infixExpression.replace("minus","-");
System.out.println("Serwer glowny:\t\tprzeksztalcam wyrazenie do postaci postfiksowej");
String postfixExpression = call.infixToPostfix(infixExpression.trim());
boolean wrongNumberOfArguments=false, wrongCharEntered=false, tooShort=false, caughtException=false;
double result=0.0;
if (postfixExpression.equals("#"))
{ // metoda infixToPostfix zwraca "#" jesli wyrazenie infiksowe zawieralo nieprawidlowe znaki
System.out.println("Serwer glowny:\t\twyrazenie zawiera nieprawidlowy znak");
wrongCharEntered = true;
}
else
{
String expr[]=postfixExpression.split(" ");
Stack<String> stos = new Stack<String>();
try
{
int i=0;
while (i < expr.length) // przetwarzanie wyrazenia postfiksowego
{
if (expr.length < 2)
{ // najkrotsze sensowne wyrazenie sklada sie z liczby poprzedzonej operatorem pierwiastkowania (jednoargumentowym)
tooShort=true;
break;
}
if (expr[i].matches("\\d+"))
stos.push(expr[i]); // jesli jest to liczba, wrzucam na stos (do sprawdzenia stosuje wyrazenie regularne)
else
{
if (expr[i].equals("+")) // dodawanie
{
try
{
Double arg2 = Double.parseDouble(stos.pop());
Double arg1 = Double.parseDouble(stos.pop());
System.out.println("Serwer glowny:\t\twysylam zapytanie o wynik " + arg1 + " + " + arg2);
Socket socketAdd = new Socket("localhost", addPort); // uruchamianie gniazda klienta
InputStream inAdd = socketAdd.getInputStream(); // strumien wejsciowy (z serwera dodawania)
OutputStream outAdd = socketAdd.getOutputStream(); // strumien wyjsciowy (do serwera dodawania)
outAdd.write(arg1.toString().getBytes()); // wysylanie stringa z arg1
outAdd.write("\r\n".getBytes()); // dokladanie znak�w konca wiersza
outAdd.write(arg2.toString().getBytes()); // wysylanie stringa z arg2
outAdd.write("\r\n".getBytes()); // dokladanie znak�w konca wiersza
// odbieranie wyniku od serwera dodawania
result=Double.parseDouble(call.receiveString(inAdd)); // wynik dodawania
// zapisywanie wykonanej operacji w logu
call.writeNewLine("log.txt",InetAddress.getLocalHost() + ",port:" + addPort +"\t serwer dodawania" );
inAdd.close(); outAdd.close();
stos.push(Double.toString(result));
}
catch (UnknownHostException e)
{
caughtException=true;
break;
}
catch (IOException e)
{
caughtException=true;
break;
}
}
else if (expr[i].equals("-")) // odejmowanie
{
Double arg2 = Double.parseDouble(stos.pop());
Double arg1 = Double.parseDouble(stos.pop());
System.out.println("Serwer glowny:\t\twysylam zapytanie o wynik " + arg1 + " - " + arg2);
Socket socketSub = new Socket("localhost", subPort); // uruchamianie gniazda klienta
InputStream inSub = socketSub.getInputStream(); // strumien wejsciowy (z serwera odejmowania)
OutputStream outSub = socketSub.getOutputStream(); // strumien wyjsciowy (do serwera odejmowania)
outSub.write(arg1.toString().getBytes()); // wysylanie stringa z arg1
outSub.write("\r\n".getBytes()); // dokladanie znak�w konca wiersza
outSub.write(arg2.toString().getBytes()); // wysylanie stringa z arg2
outSub.write("\r\n".getBytes()); // dokladanie znak�w konca wiersza
// odbieranie wyniku od serwera odejmowania
result=Double.parseDouble(call.receiveString(inSub)); // wynik odejmowania
// zapisywanie wykonanej operacji w logu
call.writeNewLine("log.txt",InetAddress.getLocalHost() +",port:" + subPort+"\t serwer odejmowania" );
inSub.close(); outSub.close();
stos.push(Double.toString(result));
}
else if (expr[i].equals("*")) // mnozenie
{
Double arg2 = Double.parseDouble(stos.pop());
Double arg1 = Double.parseDouble(stos.pop());
System.out.println("Serwer glowny:\t\twysylam zapytanie o wynik " + arg1 + " * " + arg2);
Socket socketMul = new Socket("localhost", mulPort); // uruchamianie gniazda klienta
InputStream inMul = socketMul.getInputStream(); // strumien wejsciowy (z serwera mnozenia)
OutputStream outMul = socketMul.getOutputStream(); // strumien wyjsciowy (do serwera mnozenia)
outMul.write(arg1.toString().getBytes()); // wysylanie stringa z arg1
outMul.write("\r\n".getBytes()); // dokladanie znak�w konca wiersza
outMul.write(arg2.toString().getBytes()); // wysylanie stringa z arg2
outMul.write("\r\n".getBytes()); // dokladanie znak�w konca wiersza
// odbieranie wyniku od serwera mnozenia
result=Double.parseDouble(call.receiveString(inMul)); // wynik mnozenia
// zapisywanie wykonanej operacji w logu
call.writeNewLine("log.txt",InetAddress.getLocalHost() + ",port:" + mulPort + "\t serwer mnozenia" );
inMul.close(); outMul.close();
stos.push(Double.toString(result));
}
else if (expr[i].equals("/")) // dzielenie
{
Double arg2 = Double.parseDouble(stos.pop());
Double arg1 = Double.parseDouble(stos.pop());
System.out.println("Serwer glowny:\t\twysylam zapytanie o wynik " + arg1 + " / " + arg2);
Socket socketDiv = new Socket("localhost", divPort); // uruchamianie gniazda klienta
InputStream inDiv = socketDiv.getInputStream(); // strumien wejsciowy (z serwera dzielenia)
OutputStream outDiv = socketDiv.getOutputStream(); // strumien wyjsciowy (do serwera dzielenia)
outDiv.write(arg1.toString().getBytes()); // wysylanie stringa z arg1
outDiv.write("\r\n".getBytes()); // dokladanie znak�w konca wiersza
outDiv.write(arg2.toString().getBytes()); // wysylanie stringa z arg2
outDiv.write("\r\n".getBytes()); // dokladanie znak�w konca wiersza
// odbieranie wyniku od serwera dzielenia
result=Double.parseDouble(call.receiveString(inDiv)); // wynik dzielenia
// zapisywanie wykonanej operacji w logu
call.writeNewLine("log.txt",InetAddress.getLocalHost() + ",port:" + divPort + "\tserwer dzielenia " );
inDiv.close(); outDiv.close();
stos.push(Double.toString(result));
}
else if (expr[i].equals("^")) // potegowanie
{
Double arg2 = Double.parseDouble(stos.pop());
Double arg1 = Double.parseDouble(stos.pop());
System.out.println("Serwer glowny:\t\twysylam zapytanie o wynik " + arg1 + " ^ " + arg2);
Socket socketPow = new Socket("localhost", powPort); // uruchamianie gniazda klienta
InputStream inPow = socketPow.getInputStream(); // strumien wejsciowy (z serwera dzielenia)
OutputStream outPow = socketPow.getOutputStream(); // strumien wyjsciowy (do serwera dzielenia)
outPow.write(arg1.toString().getBytes()); // wysylanie stringa z arg1
outPow.write("\r\n".getBytes()); // dokladanie znak�w konca wiersza
outPow.write(arg2.toString().getBytes()); // wysylanie stringa z arg2
outPow.write("\r\n".getBytes()); // dokladanie znak�w konca wiersza
// odbieranie wyniku od serwera potegowania
result=Double.parseDouble(call.receiveString(inPow)); // wynik potegowania
// zapisywanie wykonanej operacji w logu
call.writeNewLine("log.txt",InetAddress.getLocalHost() + ",port:" + powPort + "\tserwer potegowania " );
inPow.close(); outPow.close();
stos.push(Double.toString(result));
}
else if (expr[i].equals("$")) // pierwiastkowanie
{
Double arg = Double.parseDouble(stos.pop());
System.out.println("Serwer glowny:\t\twysylam zapytanie o wynik sqrt(" + arg + ")");
Socket socketPow = new Socket("localhost", powPort); // uruchamianie gniazda klienta
InputStream inPow = socketPow.getInputStream(); // strumien wejsciowy (z serwera dzielenia)
OutputStream outPow = socketPow.getOutputStream(); // strumien wyjsciowy (do serwera dzielenia)
outPow.write(arg.toString().getBytes()); // wysylanie stringa z arg
outPow.write("\r\n".getBytes()); // dokladanie znak�w konca wiersza
outPow.write("0.5".getBytes()); // wysylanie stringa z arg
outPow.write("\r\n".getBytes()); // dokladanie znak�w konca wiersza
// odbieranie wyniku od serwera potegowania
result=Double.parseDouble(call.receiveString(inPow)); // wynik pierwiastkowania
// zapisywanie wykonanej operacji w logu
call.writeNewLine("log.txt",InetAddress.getLocalHost() + ",port:" + powPort + "\tserwer potegowania " );
inPow.close(); outPow.close();
stos.push(Double.toString(result));
}
}
i++;
}
if (caughtException) System.out.println("Serwer glowny:\t\tblad polaczenia z serwerem operacji");
else if (tooShort) System.out.println("Serwer glowny:\t\twyrazenie jest zbyt krotkie");
else
{ // zdejmuje ostateczny wynik ze stosu
stos.pop();
if (!stos.isEmpty())
{
wrongNumberOfArguments=true;
System.out.println("Serwer glowny:\t\twyrazenie zawiera zbyt duzo operandow");
}
}
}
catch (EmptyStackException e)
{
wrongNumberOfArguments=true;
System.out.println("Serwer glowny:\t\twyrazenie zawiera zbyt malo operandow");
}
}
if (wrongCharEntered) out.write("ERROR: Niewlasciwy znak".getBytes());
else if (tooShort) out.write("ERROR: Wyrazenie za krotkie".getBytes());
else if (wrongNumberOfArguments) out.write("ERROR: Niewlasciwa liczba argumentow".getBytes());
else if (caughtException) out.write("ERROR: Brak lacznosci z serwerem operacji".getBytes());
else
{ // przekazuje ostateczny wynik klientowi
out.write(Double.toString(result).getBytes());
System.out.println("Serwer glowny:\t\twysylam klientowi wartosc wyrazenia = " + result);
}
out.close(); in.close(); socket.close();
}
}
catch (UnknownHostException e)
{
System.out.println("Serwer glowny:\t\tunknown host exception");
}
catch (IOException e)
{
System.out.println("Serwer glowny:\t\ti/o exception");
}
}
public static void main(String[] args)
{
Thread t = new Server("MAIN",2012,2001,2002,2003,2004,2005);
t.start();
}
}