1
2
3
4
5
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 }