Wyszukiwanie komputerów w sieci lokalnej

0

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();
	}
}
0

Jeśli wiesz na jakim porcie będzie stał serwer to mozesz próbować łączyć się z kolejnymi IP (adresy z sieci wyciągasz za pomocą swojego IP oraz maski oczywiście).
Jeśli to sieć lokalna to możesz też użyć komunikatów Multicast.

0

pomijajac szczegoly, to kod jest fatalny ;xX
if ifa ifem pogania :D

1 użytkowników online, w tym zalogowanych: 0, gości: 1