1
2
3
4
5
6 package org.sourceforge.jvb3d.Network;
7
8 import java.io.ByteArrayInputStream;
9 import java.io.ByteArrayOutputStream;
10 import java.io.IOException;
11 import java.io.ObjectInputStream;
12 import java.io.ObjectOutputStream;
13 import java.net.InetSocketAddress;
14
15 /***
16 * @author Łukasz Krzyżak
17 *
18 * fasada odpowiedzialna za komunikację podsystemu sieci klienta z pozostałymi podsystemami
19 */
20 public class ClientFacade extends NetworkClientFacade {
21 private ServerData serverData;
22 private NetworkReceiver receiver;
23 private ReceivedPacketBuffer receiveBuffer;
24
25 /***
26 * przekazuje dane otrzymane w pakiecie update do podsystemu modelu
27 * @param packet otrzymany pakiet
28 */
29 void forwardUpdate(UpdatePacket packet) {
30 try {
31 ByteArrayInputStream byteStream = new ByteArrayInputStream(packet
32 .getUpdateData());
33 modelInterface.readExternal(new ObjectInputStream(byteStream));
34 } catch (Exception e) {
35 e.printStackTrace();
36 }
37 }
38
39 /***
40 * łączy klienta z serwerem na podanym adresie.
41 * Tworzy wszystkie potrzebne obiekty i wiąże je ze sobą.
42 * @param serverAddress adres serwera
43 * @return ID avatara obiektu użytkownika, zwrócone przez serwer
44 * TODO sam ID nie wystarczy - potrzebna jeszcze przynajmniej nazwa mapy dla loadera
45 * @throws IOException jeśli wystąpi błąd w sockecie
46 */
47 public String join(InetSocketAddress serverAddress) throws IOException {
48 receiver = new NetworkReceiver(0);
49 receiveBuffer = new ReceivedPacketBuffer();
50 receiver.connectToBuffer(receiveBuffer);
51 serverData = new ServerData();
52 receiveBuffer.addObserver(serverData);
53 receiver.start();
54
55 return serverData.join(serverAddress);
56 }
57
58 /***
59 * pobiera dane z modelu, i rozsyła je do wszystkich klientów.
60 *
61 * @param avatarID
62 * id obiektu który mamy uaktualnić
63 */
64 public void sendUpdate(String avatarID) {
65 modelInterface.setSerialize(avatarID);
66 sendUpdate();
67 }
68
69 /***
70 * pusta metoda dla zgodności klasy z implementowanym interfejsem.
71 * Wysyłanie update wszystkiego po stronie klienta nie ma sensu.
72 */
73 public void sendAllUpdate() {
74
75 }
76
77 /***
78 * metoda pobierająca dane o przesyłanych obiektach z modelu, wysyłająca je
79 * do serwera poprzez ServerData.sendUpdate
80 * TODO pomyśleć nad rzucanymi wyjątkami
81 */
82 private void sendUpdate() {
83 try {
84 ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
85 ObjectOutputStream objectStream = new ObjectOutputStream(byteStream);
86 modelInterface.writeExternal(objectStream);
87 serverData.sendUpdate(byteStream.toByteArray());
88 } catch (Exception e) {
89 e.printStackTrace();
90 }
91 }
92
93
94 }