/* ** This file is part of Filius, a network construction and simulation software. ** ** Originally created at the University of Siegen, Institute "Didactics of ** Informatics and E-Learning" by a students' project group: ** members (2006-2007): ** André Asschoff, Johannes Bade, Carsten Dittich, Thomas Gerding, ** Nadja Haßler, Ernst Johannes Klebert, Michell Weyer ** supervisors: ** Stefan Freischlad (maintainer until 2009), Peer Stechert ** Project is maintained since 2010 by Christian Eibl <filius@c.fameibl.de> ** and Stefan Freischlad ** Filius 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 2 of the License, or ** (at your option) version 3. ** ** Filius 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 Filius. If not, see <http://www.gnu.org/licenses/>. */ package filius.software.dateiaustausch; import java.util.ListIterator; import filius.Main; import filius.software.clientserver.ServerMitarbeiter; import filius.software.clientserver.TCPServerAnwendung; import filius.software.transportschicht.Socket; /** * In dieser Klasse wird der Server der Peer-to-Peer-Anwendung * implementiert. D. h., dass hier eingehende Anfragen aus dem * Peer-to-Peer-Netzwerk empfangen und verarbeitet werden. <br /> * Zur Verarbeitung der Anfragen wird jeweils ein neuer Mitarbeiter * in einem eigenen Thread gestartet. */ public class PeerToPeerServer extends TCPServerAnwendung { /** die Instanz der Peer-to-Peer-Anwendung, fuer die eingehende * Anfragen verarbeitet werden. */ private PeerToPeerAnwendung peerToPeerAnwendung; /** Konstruktor zur Initialisierung der Peer-to-Peer-Anwendung * und setzen des Ports 6346, bei dem auf eingehende Anfragen * gewartet wird. Außerdem wird der Konstruktor der Oberklasse * aufgerufen. * @param peerToPeerAnwendung */ PeerToPeerServer(PeerToPeerAnwendung peerToPeerAnwendung){ super(); Main.debug.println("INVOKED-2 ("+this.hashCode()+", T"+this.getId()+") "+getClass()+" (PeerToPeerServer), constr: PeerToPeerServer("+peerToPeerAnwendung+")"); this.peerToPeerAnwendung=peerToPeerAnwendung; setPort(6346); setAktiv(true); } /** Der Thread der Oberklasse ruft diese Methode auf, sobald eine * Verbindungsanfrage eingegangen ist. Hier wird ein Mitarbeiter in * einem neuen Thread gestartet, der fuer die Verarbeitung der * eingehenden Anfrage genutzt wird. */ protected void neuerMitarbeiter(Socket socket) { Main.debug.println("INVOKED ("+this.hashCode()+", T"+this.getId()+") "+getClass()+" (PeerToPeerServer), neuerMitarbeiter("+socket+")"); PeerToPeerServerMitarbeiter neuerMitarbeiter; neuerMitarbeiter = new PeerToPeerServerMitarbeiter(this, socket, peerToPeerAnwendung); neuerMitarbeiter.starten(); mitarbeiter.add(neuerMitarbeiter); } /** Diese Methode wird genutzt, um Antwortpakete ueber einen * Mitarbeiter-Thread zu verschicken. Die Auswahl des Mitarbeiter-Threads * erfolgt an Hand der GUID der Nachricht. * @param paket */ void sendePaket(PeerToPeerPaket paket) { Main.debug.println("INVOKED ("+this.hashCode()+", T"+this.getId()+") "+getClass()+" (PeerToPeerServer), sendePaket("+paket+")"); ListIterator<ServerMitarbeiter> it; PeerToPeerServerMitarbeiter m; it = mitarbeiter.listIterator(); while (it.hasNext()) { m = (PeerToPeerServerMitarbeiter)it.next(); if (m.holeGuid() == paket.getGuid()) { m.senden(paket.toString()); } } } }