/* * Engine Alpha ist eine anfängerorientierte 2D-Gaming Engine. * * Copyright (c) 2011 - 2014 Michael Andonie and contributors. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package ea.edu.net; import ea.Empfaenger; import java.util.concurrent.ConcurrentLinkedQueue; /** * Diese abstrakte Klasse beschreibt die allgemeinen Eigenschaften * einer <i>simplen</i> Netzwerkklasse. <i>Simpel</i> bedeutet in * diesem Zusammenhang, dass es um eine Vereinfachung im Sinne der * EDU-Version der Engine handelt.<br /><br /> * * Der simple Netzwerkadapter arbeitet <i>nur auf Basis von Strings</i> kann: * <ul> * <li> Jederzeit Strings senden</li> * <li> Den nächsten noch nicht gelesenen String ausgeben (bzw. auf den nächsten * zu String vom Kommunikationspartner warten).</li> * </ul> * @author andonie * */ public abstract class SimplerNetzwerkAdapter { /** * Die Liste, die die noch nicht abgearbeiteten Nachrichten speichert. */ private final ConcurrentLinkedQueue<String> messages = new ConcurrentLinkedQueue<>(); /** * Der Standard-Empfänger für beide Seiten der simplen Kommunikation. * Empfangene Strings werden in die Queue <code>messages</code> eingereiht. * Andere Datentypen sollten nicht empfangen werden; die entsprechenden * Methoden sind daher leer. */ protected final Empfaenger messageUpdater = new Empfaenger() { @Override public void empfangeString (String string) { messages.add(string); synchronized (messages) { messages.notify(); } } @Override public void empfangeInt (int i) { } @Override public void empfangeByte (byte b) { } @Override public void empfangeDouble (double d) { } @Override public void empfangeChar (char c) { } @Override public void empfangeBoolean (boolean b) { } @Override public void verbindungBeendet () { } }; /** * Diese Methode gibt die <i>nächste ungelesene String-Nachricht</i> aus. * Das bedeutet:<br/> * <ul> * <li>Gibt es bereits (mindestens) eine noch nicht "abgehörte" Nachricht, wird * einfach die nächste in der Schlange ausgegeben.</li> * <li>Gibt es derzeit keine neue Nachricht, wird solange gewartet, bis eine * neue Nachricht vom Kommunikationspartner eingetroffen ist.</li> * </ul> * @return die nächste Nachricht des Kommunikationspartners. */ public final synchronized String lauschen () { if (messages.isEmpty()) { try { synchronized (messages) { messages.wait(); } } catch (InterruptedException e) { // } if (!messages.isEmpty()) { return messages.poll(); } else { return null; } } return messages.poll(); } /** * Versendet eine Nachricht. * * @param string * Die zu sendende Nachricht als String. */ public abstract void senden (String string); }