View Javadoc

1   package net.sourceforge.simplegamenet.framework.transport;
2   
3   import java.io.IOException;
4   import java.io.ObjectInputStream;
5   import java.io.ObjectOutputStream;
6   import java.net.InetAddress;
7   import java.net.Socket;
8   import net.sourceforge.simplegamenet.framework.GameFactoryManager;
9   import net.sourceforge.simplegamenet.framework.model.SimpleGameNetSettings;
10  import net.sourceforge.simplegamenet.specs.model.GameFactory;
11  import net.sourceforge.simplegamenet.specs.to.Version;
12  
13  public class ClientLoginHandler implements PacketCodes {
14  
15      private static final int CONNECTION_TIME_OUT_TIME = 30000;
16  
17      public ClientLoginHandler() {
18      }
19  
20      public ClientConnectionData connect(InetAddress hostInetAddress, int port, String nickname)
21              throws IOException {
22          Socket socket = new Socket(hostInetAddress, port);
23          try {
24              ObjectOutputStream objectOutputStream = new ObjectOutputStream(
25                      socket.getOutputStream());
26              ObjectInputStream objectInputStream = new GamesObjectInputStream(
27                      socket.getInputStream(),
28                      GameFactoryManager.getInstance().getGamesClassLoader());
29              socket.setSoTimeout(CONNECTION_TIME_OUT_TIME);
30              objectOutputStream.writeObject(new Packet(CON_CLIENT_CON_OPEN,
31                      new Integer(0x00000001)));
32              Packet packet = (Packet) objectInputStream.readObject();
33              if (packet.getPacketCode() == E_CON_BANNED) {
34                  throw new ClientLoginException(ClientLoginException.BANNED);
35              } else if (packet.getPacketCode() != CON_SERVER_CON_OPEN) {
36                  throw new ClientLoginException(ClientLoginException.PROTOCOL_VIOLATION);
37              }
38              objectOutputStream.writeObject(new Packet(CON_SGN_VERSION,
39                      SimpleGameNetSettings.getInstance().getVersion()));
40              packet = (Packet) objectInputStream.readObject();
41              if (packet.getPacketCode() == E_CON_CLIENT_SGN_VERSION) {
42                  throw new ClientLoginException(ClientLoginException.CLIENT_SGN_VERSION);
43              } else if (packet.getPacketCode() == E_CON_SERVER_SGN_VERSION) {
44                  throw new ClientLoginException(ClientLoginException.SERVER_SGN_VERSION);
45              } else if (packet.getPacketCode() != GAME_OPEN) {
46                  throw new ClientLoginException(ClientLoginException.PROTOCOL_VIOLATION);
47              }
48              GameIdentification gameIdentification = (GameIdentification) packet.getData();
49              GameFactory gameFactory = GameFactoryManager.getInstance().getGameFactory(
50                      gameIdentification);
51              if (gameFactory == null) {
52                  objectOutputStream.writeObject(new Packet(E_GAME_NOT_FOUND, null));
53                  throw new ClientLoginException(ClientLoginException.GAME_NOT_FOUND);
54              }
55              Version gameVersion = gameFactory.getVersion();
56              if (gameVersion.compareTo(gameIdentification.getVersion()) < 0) {
57                  objectOutputStream.writeObject(new Packet(E_GAME_CLIENT_GAME_VERSION,
58                          gameVersion));
59                  throw new ClientLoginException(ClientLoginException.CLIENT_GAME_VERSION);
60              } else if (gameVersion.compareTo(gameIdentification.getVersion()) > 0) {
61                  objectOutputStream.writeObject(new Packet(E_GAME_SERVER_GAME_VERSION,
62                          gameVersion));
63                  throw new ClientLoginException(ClientLoginException.SERVER_GAME_VERSION);
64              }
65              objectOutputStream.writeObject(new Packet(CON_LOGIN_NICKNAME, nickname));
66              packet = (Packet) objectInputStream.readObject();
67              if (packet.getPacketCode() == E_CON_LOGIN) {
68                  throw new ClientLoginException(ClientLoginException.LOGIN_NOT_ACCEPTED);
69              } else if (packet.getPacketCode() != CON_LOGIN_DATA) {
70                  throw new ClientLoginException(ClientLoginException.PROTOCOL_VIOLATION);
71              }
72              socket.setSoTimeout(0);
73              LoginData loginData = (LoginData) packet.getData();
74              return new ClientConnectionData(socket, objectInputStream, objectOutputStream,
75                      loginData, gameFactory);
76          } catch (ClassNotFoundException exception) {
77              try {
78                  socket.close();
79              } catch (IOException innerException) {
80                  innerException.printStackTrace();
81              }
82              throw new ClientLoginException(ClientLoginException.PROTOCOL_VIOLATION);
83          } catch (ClassCastException exception) {
84              try {
85                  socket.close();
86              } catch (IOException innerException) {
87                  innerException.printStackTrace();
88              }
89              throw new ClientLoginException(ClientLoginException.PROTOCOL_VIOLATION);
90          } catch (IOException exception) {
91              try {
92                  socket.close();
93              } catch (IOException innerException) {
94                  innerException.printStackTrace();
95              }
96              if (exception instanceof ClientLoginException) {
97                  throw exception;
98              } else {
99                  throw new ClientLoginException(ClientLoginException.PROTOCOL_VIOLATION);
100             }
101         }
102     }
103 
104 }