symulator elektrowni

0

witam miłośników javy. Ponieważ nie mam aż tak dużego doświadczenia w pisaniu projektów chciałbym się doradzić odnośnie mojego projektu. Chcę stworzyć dystrybutor energii a raczej zasymulować sposób przesyłania "pakietów energii" do odbiorników jakim będą aplikacje klienckie (inteligentny dom). Całość ma działać w sieci. Czy uważacie że powinienem to zrobić na apletach a może macie inne pomysły dotyczące takiej aplikacji. (Coś przypominające simsy... ). Ponieważ jest to sieć, nie ominie mnie JSP i technologie pokrewne (w postaci strony internetowej ). Jak Waszym zdaniem najlepiej zasymulować wykresy pobierania "prądu" żeby wyglądały efektownie... oczywiście Swing w apletach tylko że taki aplet będzie się straaaaasznie długo ładował. Pozdrawiam i liczę na sensowne odpowiedzi.

0

Sieć to nie tylko JSP/servlety.

Czy twój program ma działać na takiej zasadzie:

  • ktoś sobie wchodzi na stronę www i uruchamia aplet - "dom"
  • aplet pokazuje "domy" innych użytkowników w danej chwili korzystających ze strony.

Czy raczej chodzi ci o wizualizację czegoś takiego:

  • mamy serwer - elektrownię - N klientów - domów
  • klient co pewien czas pobiera z serwera dane - energię
  • program pozwala na ustalenie liczby klientów i obrazuje ruch w sieci energetycznej

Co do szybkości to rzeczywiście 10 lat temu Swing był mało wydajny. Obecnie sytuacja troszkę się zmieniła.

0

Klient -> inteligentny dom, który w zależności od uruchomionych urządzeń pobiera określoną ilość energii. Wizualizacja na zasadzie włączania urządzeń w domu, światła itp.
Serwer -> aplikacja dla nieograniczonej (przynajmniej dla 4 ) klientów, umożliwiająca obrazowanie dystrybucji energii (pakietów danych), wizualnie produkujaca tą energię (np. wiatraki + np. zobrazowanie szybkości ruchu wiatraka w zależnosci od nasilenia wiatru). Symulacja : problemów z dostarczeniem energii, braku wystarczającej energii dla odbiorcow (np. poprzez wizualny spadek poziomu energii), rożnego rodzaju awarii itp. Chcialbym żeby dostęp do serwera jak rowniez klienta odbywal sie poprzez sieć. Pytanie kolejne polecacie UDP czy TCP?... osobiście wolę TCP by nie robić obslugi błędow dla UDP.

0

proszę o pomoc

0

Najpierw zrób sobie symulator bez wizualizacji bo trochę roboty z tym jest. Trochę podstaw o symulacjach jest w Thinking in Java 4 w rozdziale Concurrency (współbieżność). Dopiero kiedy będziesz miał działający model symulacji możesz w ogóle zabierać się za wizualizację. Jako przykład, że nie jest to taki banał podam przykład najprostszej symulacji jedzenia tosta zrobionej na wysokopoziomowych kolejkach.
W Twoim wypadku symulacja tego co chcesz osiągnąć byłaby kilka razy bardziej skomplikowana i większa.
Żeby zrobić lepszą wizualizację dla tego przykładu trzeba by w miejscach wywołań println wysyłać komunikaty do zupełnie osobnego obiektu, który będzie rysował na podstawie danych uzyskiwanych z takich komunikatów.
Jeżeli ten przykład rozpatrywać jako MVC, to kontrolerem jest klasa Tostomat, modelem wszystkie pozostałe klasy, a viewer to strumień Out. Nie ma większego znaczenia na tym poziomie czy model, wizualizator i kontroler będą apletami, aplikacjami czy modułami jednego programu oraz czy jakieś części tego zespołu będą na serwerze czy u klienta. Nad tym problemem (i nad komunikacją) będziesz się zastanawiać gdy wszystkie składniki Twojej "sieci elektrycznej" będą już w ogóle działać.

package concurrency;

import java.util.*;
//: concurrency/Tostomat.java
import java.util.concurrent.*;


class Tost
{
	public enum Status { SUCHY, POSMAROWANY_MASŁEM, POSMAROWANY_DŻEMEM }
	private Status status = Status.SUCHY;
	private final int id;
	public Tost(int idn)
	{
		id = idn;
	}
	public void butter()
	{
		status = Status.POSMAROWANY_MASŁEM;
	}
	public void jam()
	{
		status = Status.POSMAROWANY_DŻEMEM;
	}
	public Status getStatus()
	{
		return status;
	}
	public int getId()
	{
		return id;
	}
	@Override public String toString()
	{
		return "Tost " + id + ": " + status;
	}
}

// Toster - taśma produkcyjna.
class KolejkaTostów extends LinkedBlockingQueue<Tost> {}

class Toster implements Runnable
{
	private KolejkaTostów toastQueue;
	private int count = 0;
	private Random rand = new Random(47);
	public Toster(KolejkaTostów tq)
	{
		toastQueue = tq;
	}
	@Override public void run()
	{
		try
		{
			while(!Thread.interrupted())
			{
				TimeUnit.MILLISECONDS.sleep(100 + rand.nextInt(500));
				// Opiekanie tosta
				Tost t = new Tost(count++);
				System.out.println(t);
				// Wstawienie do kolejki
				toastQueue.put(t);
			}
		}
		catch(InterruptedException e)
		{
			System.out.println("Przerwano zadanie tostowania");
		}
		System.out.println("Toster wyłączony");
	}
}

//Smarowanie tosta masłem:
class Smarownica implements Runnable
{
	private KolejkaTostów dryQueue, butteredQueue;
	public Smarownica(KolejkaTostów dry, KolejkaTostów buttered)
	{
		dryQueue = dry;
		butteredQueue = buttered;
	}
	@Override public void run()
	{
		try
		{
			while(!Thread.interrupted())
			{
				// Blokowanie do czasu opieczenia następnego tosta:
				Tost t = dryQueue.take();
				t.butter();
				System.out.println(t);
				butteredQueue.put(t);
			}
		}
		catch(InterruptedException e)
		{
			System.out.println("Przerwano smarowanie masłem");
		}
		System.out.println("Smarownica masła wyłączona");
	}
}

//Smarowanie dżemem:
class Dżemownica implements Runnable
{
	private KolejkaTostów butteredQueue, finishedQueue;
	public Dżemownica(KolejkaTostów buttered, KolejkaTostów finished)
	{
		butteredQueue = buttered;
		finishedQueue = finished;
	}
	@Override public void run()
	{
		try
		{
			while(!Thread.interrupted())
			{
				// Blokowanie do czasu dostępności następnego tosta:
				Tost t = butteredQueue.take();
				t.jam();
				System.out.println(t);
				finishedQueue.put(t);
			}
		}
		catch(InterruptedException e)
		{
			System.out.println("Przerwano smarowanie dżemem");
		}
		System.out.println("Smarownica dżemu wyłączona");
	}
}

//Konsumpcja tosta:
class Jedzący implements Runnable
{
	private KolejkaTostów finishedQueue;
	private int counter = 0;
	public Jedzący(KolejkaTostów finished)
	{
		finishedQueue = finished;
	}
	@Override public void run()
	{
		try
		{
			while(!Thread.interrupted())
			{
				// Blokowanie w oczekiwaniu na przygotowanie tosta:
				Tost t = finishedQueue.take();
				// Sprawdzenie, czy tost przybył w odpowiedniej kolejności,
				// i czy jest posmarowany masłem i dżemem:
				if(t.getId() != counter++
				|| t.getStatus() != Tost.Status.POSMAROWANY_DŻEMEM)
				{
					System.out.println(">>>> Błąd: " + t);
					System.exit(1);
				}
				else
					System.out.println(t + "\nChrup!");
			}
		}
		catch(InterruptedException e)
		{
			System.out.println("Przerwano śniadanie");
		}
		System.out.println("Biesiadnik odchodzi od stołu");
	}
}

public class Tostomat
{
	public static void main(String[] args) throws Exception
	{
		KolejkaTostów
			suche = new KolejkaTostów(),
			posmarowane = new KolejkaTostów(),
			gotowe = new KolejkaTostów();
		ExecutorService exec = Executors.newCachedThreadPool();
		exec.execute(new Toster(suche));
		exec.execute(new Smarownica(suche, posmarowane));
		exec.execute(new Dżemownica(posmarowane, gotowe));
		exec.execute(new Jedzący(gotowe));
		TimeUnit.SECONDS.sleep(5);
		exec.shutdownNow();
	}
}/* (Execute to see output) */
//:~

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