1
2
3
4
5
6
7 package org.sourceforge.jvb3d.Network;
8
9 import java.io.IOException;
10 import java.net.InetSocketAddress;
11 import java.net.SocketAddress;
12 import java.util.logging.Logger;
13
14 /***
15 * @author Łukasz Krzyżak
16 *
17 * klasa odpowiedzialna za przechowywanie informacji o pojedynczym kliencie przył?czonym do serwera,
18 * oraz za komunikację z tym klientem
19 */
20 class ClientData {
21 protected InetSocketAddress clientAddress = null;
22 protected String avatarID = null;
23
24 protected long lastPacketReceived = System.currentTimeMillis();
25 protected NetworkSender sender;
26
27 protected long lastSeqNumber = 0;
28 protected long sendSeqNumber = 1;
29
30 protected static final int clientTimeout = 1000;
31
32 protected Logger fLogger = Logger.getLogger("ClientData");
33
34 protected ClientData() {
35
36 }
37 /***
38 * wi?żemy klienta z jego adresem IP, a następnie pytamy Model o ID avatara dla tego klienta
39 * @param address adres z którego pochodzi klient
40 */
41 public ClientData(InetSocketAddress address) {
42 clientAddress = address;
43 avatarID = NetworkServerFacadeHolder.getNetworkFacade().createAvatar();
44 try {
45 sender = new NetworkSender();
46 ConnectPacket connectPacket = new ConnectPacket();
47 connectPacket.setAvatarID(avatarID);
48 sender.send(connectPacket, clientAddress.getAddress(), clientAddress.getPort());
49 }
50 catch (IOException e){
51 fLogger.severe("IOException przy tworzeniu NetworkSender: "+e.getMessage());
52 }
53 }
54
55 SocketAddress getClientAddress() {
56 return clientAddress;
57 }
58
59 String getAvatarID() {
60 return avatarID;
61 }
62
63 /***
64 * sprawdza, czy pakiet Update jest poprawny (zgodno?ć numerów sekwencji), i aktualizuje
65 * czas otrzymania ostatniego pakietu od klienta
66 * @param update pakiet do sprawdzenia poprawno?ci
67 * @return czy pakiet należy przyj?ć
68 */
69 public boolean validatePacket(UpdatePacket update) {
70 if(update.getSeqNumber() <= lastSeqNumber) return false;
71 lastSeqNumber = update.getSeqNumber();
72 lastPacketReceived = System.currentTimeMillis();
73 return true;
74 }
75
76 /***
77 * wysyła update do danego klienta
78 * @param updateData dane do wysłania
79 * @throws TimeoutException rzucany, gdy nie otrzymano żadnej wiadomo?ci od klienta w ci?gu okre?lonego czasu (clientTimeout)
80 * @throws IOException rzucany przez sendera, gdy nie uda się wysyłanie
81 */
82 public void sendUpdate(byte[] updateData) throws TimeoutException, IOException {
83 if(System.currentTimeMillis() - lastPacketReceived > clientTimeout) throw new TimeoutException(clientAddress);
84
85 UpdatePacket updatePacket = new UpdatePacket();
86 updatePacket.setUpdateData(updateData);
87 updatePacket.setSeqNumber(sendSeqNumber++);
88 sender.send(updatePacket, clientAddress.getAddress(), clientAddress.getPort());
89 }
90 }