View Javadoc
1   /*
2    * Created on 2004-12-10
3    *
4    * Klasa odpowiedzialna za kontakt pakietu Network z resztą "świata", oraz
5    * inicjalizację części sieciowej - część serwerowa.
6    */
7   package org.sourceforge.jvb3d.Network;
8   
9   import java.io.ByteArrayInputStream;
10  import java.io.ByteArrayOutputStream;
11  import java.io.IOException;
12  import java.io.ObjectInputStream;
13  import java.io.ObjectOutputStream;
14  import java.util.logging.Logger;
15  
16  /***
17   * @author Łukasz Krzyżak
18   * 
19   * Klasa odpowiedzialna za kontakt pakietu Network z resztą "świata", oraz
20   * inicjalizację części sieciowej - część serwerowa.
21   */
22  public class ServerFacade extends NetworkServerFacade {
23  	private ClientManager clientManager;
24  	private NetworkReceiver receiver;
25  	private ReceivedPacketBuffer receiveBuffer;
26  	
27  	private Logger fLogger = Logger.getLogger("ServerFacade");
28  	/***
29  	 * tworzy i inicjalizuje podsystem sieci w wersji serwerowej.
30  	 * 
31  	 */
32  	public ServerFacade() {
33  		
34  	}
35  
36  	/***
37  	 * wysyła do IModelNetwork informację o konieczności utworzenia nowego
38  	 * avatara użytkownika. Zwraca ID avatara, który musi zostać wysłany do
39  	 * klienta.
40  	 * 
41  	 * @return ID avatara
42  	 */
43  	public String createAvatar() {
44  		return modelInterface.createPlayer();
45  	}
46  
47  	/***
48  	 * zwraca nową fabryke obiektów ClientData.
49  	 * @return nowa ClientFactory
50  	 */
51  	ClientFactory getClientFactory() {
52  		return new ClientDataFactory();
53  	}
54  
55  	/***
56  	 * powoduje przesłanie update otrzymanego z sieci do modelu. Ma wywoływać
57  	 * metodę update z interfejsu IModelNetwork.
58  	 * @param packet pakiet do przetworzenia
59  	 */
60  	void forwardUpdate(UpdatePacket packet) {
61  		try {
62  			ByteArrayInputStream byteStream = new ByteArrayInputStream(packet
63  				.getUpdateData());
64  			modelInterface.readExternal(new ObjectInputStream(byteStream));
65  		} catch (Exception e) {
66  			e.printStackTrace();
67  		}
68  	}
69  
70  	/***
71  	 * uruchamiana gdy wystąpi timeout klienta. Ma wywołać metodę removeObject z
72  	 * avatarem do usunięcia
73  	 * @param clientAvatar ID avatara klienta
74  	 */
75  	public void forwardClientTimeout(String clientAvatar) {
76  		modelInterface.removeObject(clientAvatar);
77  	}
78  
79  	/***
80  	 * pobiera dane z modelu, i rozsyła je do wszystkich klientów.
81  	 * 
82  	 * @param avatarID
83  	 *            id obiektu który mamy uaktualnić
84  	 */
85  	public void sendUpdate(String avatarID) {
86  		modelInterface.setSerialize(avatarID);
87  		sendUpdate();
88  	}
89  
90  	/***
91  	 * pobiera dane z modelu, i rozsyła je do wszystkich klientów.
92  	 *  
93  	 */
94  	public void sendAllUpdate() {
95  		modelInterface.setSerializeAll();
96  		sendUpdate();
97  	}
98  
99  	private void sendUpdate() {
100 		try {
101 			ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
102 			ObjectOutputStream objectStream = new ObjectOutputStream(byteStream);
103 			modelInterface.writeExternal(objectStream);
104 			clientManager.sendUpdate(byteStream.toByteArray());
105 		} catch (Exception e) {
106 			e.printStackTrace();
107 			fLogger.warning("Złapano wyjątek w ServerFacade.sendUpdate " + e);
108 		}
109 	}
110 	
111 	/***
112 	 * powoduje uruchomienie serwera i nasłuch na podanym porcie
113 	 * @param port port na którym serwer ma słuchać
114 	 * @throws IOException jeśli wystąpi błąd socketu
115 	 */
116 	public void start(int port) throws IOException {
117 		receiver = new NetworkReceiver(port);
118 		receiveBuffer = new ReceivedPacketBuffer();
119 		receiver.connectToBuffer(receiveBuffer);
120 		clientManager = new ClientManager();
121 		receiveBuffer.addObserver(clientManager);
122 		receiver.start();
123 	}
124 }