View Javadoc

1   /*
2    * Created on 2004-12-09
3    *
4    * TODO To change the template for this generated file go to
5    * Window - Preferences - Java - Code Style - Code Templates
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  }