View Javadoc
1   /*
2    * Created on 2004-12-22
3    *
4    * implementacja fasady sieci po stronie klienta
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  }