diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index 0a31912..8380487 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -6,41 +6,44 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -63,11 +66,31 @@
-
-
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -75,73 +98,34 @@
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
@@ -150,18 +134,42 @@
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -178,36 +186,36 @@
- Insert y
- Insert you
- Insert your
- Insert your
- Insert your d
- Registration
- Registration uns
- R
- regisr
- regis
- registration
- registration unsu
- registration unsuc
- registration unsucce
- registration unsuccess
- G
- GameService is
- GameService is
- T
- TIMEO
- TIMEOUT
- Inse
- Insert
- Insert w
- Insert wo
- ga
- game is rea
- game is read
- le
- letters
+ m
+ ti
+ jo
+ joinTi
+ joinTimeo
+ joinTimeout=
+ joinTimeout
+ joinTimeout =
+ ma
+ math.
+ math
+ matc
+ match
+ match.jo
+ match.joi
+ match.join
+ match.joint
+ j
+ jin
+ ji
+ join
+ joinTime
+ joinTimeou
+ threadPool
+ 1000
+ waiti
+ waiting
+ waiting f
+ waiting for
+ waiting for u
C:\Users\loke\TextTwist\out\production
@@ -346,38 +354,6 @@
@@ -416,10 +424,10 @@
-
-
-
-
+
+
+
+
@@ -437,7 +445,7 @@
-
+
@@ -451,6 +459,138 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -535,58 +675,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -703,218 +791,8 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -1443,47 +1321,72 @@
-
+
+
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
+
-
-
+
+
+
-
-
+
+
-
-
-
-
-
@@ -1503,246 +1406,10 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -1750,9 +1417,6 @@
-
-
-
@@ -1760,9 +1424,6 @@
-
-
-
@@ -1770,9 +1431,6 @@
-
-
-
@@ -1781,24 +1439,15 @@
-
+
-
-
-
-
-
-
-
-
-
@@ -1806,17 +1455,6 @@
-
-
-
-
-
-
-
-
-
-
-
@@ -1825,7 +1463,7 @@
-
+
@@ -1846,43 +1484,10 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -1890,56 +1495,31 @@
-
-
-
+
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
-
-
+
+
@@ -1947,29 +1527,317 @@
-
-
-
-
-
-
-
-
-
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Client/src/com/texttwist/client/App.java b/Client/src/com/texttwist/client/App.java
index de9185d..e575db2 100644
--- a/Client/src/com/texttwist/client/App.java
+++ b/Client/src/com/texttwist/client/App.java
@@ -68,7 +68,7 @@ public class App extends JFrame {
logger.write("APP: Font not found!");
}
- /*Services*/
+ /*services*/
gameService = new GameService();
authService = new AuthService();
diff --git a/Client/src/com/texttwist/client/pages/GamePage.java b/Client/src/com/texttwist/client/pages/GamePage.java
index fc7e10e..ed3571a 100644
--- a/Client/src/com/texttwist/client/pages/GamePage.java
+++ b/Client/src/com/texttwist/client/pages/GamePage.java
@@ -141,7 +141,7 @@ public class GamePage extends Page {
return null;
}
}),
- Config.timeoutGame
+ Config.gameTimeout
);
}
}
diff --git a/Commons/src/constants/Config.java b/Commons/src/constants/Config.java
index 6c34a01..1496241 100644
--- a/Commons/src/constants/Config.java
+++ b/Commons/src/constants/Config.java
@@ -18,9 +18,14 @@ public class Config {
public static String ScoreMulticastServerURI = "226.226.226.226";
public static Integer NotificationServerPort = 20000;
- public static Integer NotificationServerStubPort = 5000;
+ public static Integer NotificationServerStubPort = 30000;
public static String NotificationServerName ="notification";
- public static int timeoutGame = 120;
+
+ public static String RedisServerURI = "localhost";
+
+ public static int gameTimeout = 10; //2 minuti in sec
+ public static int joinMatchTimeout = 5000; //7 minuti in millisec
+ public static int sendWordsTimeout = 3000; //5 minuti in millisec
public static String getAuthServerURI(){
return "rmi://".concat(AuthServerURI).concat(":").concat(AuthServerPort.toString());
diff --git a/Server/src/com/texttwist/server/Main.java b/Server/src/com/texttwist/server/Main.java
index f1484af..a292745 100644
--- a/Server/src/com/texttwist/server/Main.java
+++ b/Server/src/com/texttwist/server/Main.java
@@ -1,13 +1,12 @@
package com.texttwist.server;
-
-import utilities.Logger;
-
-import java.io.File;
import java.io.IOException;
+/**
+ * Author: Lorenzo Iovino on 14/06/2017.
+ * Description: Main
+ */
public class Main {
-
public static void main(String[] args) throws IOException {
- Server ttServer = new Server();
+ new Server();
}
}
diff --git a/Server/src/com/texttwist/server/Server.java b/Server/src/com/texttwist/server/Server.java
index b2bee6d..7955285 100644
--- a/Server/src/com/texttwist/server/Server.java
+++ b/Server/src/com/texttwist/server/Server.java
@@ -1,65 +1,78 @@
package com.texttwist.server;
-import com.texttwist.server.components.Auth;
-import com.texttwist.server.components.GameServer;
-import com.texttwist.server.components.NotificationServer;
+import com.texttwist.server.services.AuthService;
+import com.texttwist.server.services.MessageService;
+import com.texttwist.server.services.NotificationService;
import constants.Config;
import interfaces.INotificationServer;
-import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import utilities.Logger;
-
import java.io.File;
import java.io.IOException;
import java.rmi.AlreadyBoundException;
+import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;
+
/**
- * Created by loke on 15/06/2017.
+ * Author: Lorenzo Iovino on 15/06/2017.
+ * Description: Server. Initialize all services.
*/
public class Server {
- public static NotificationServer notificationServer;
+ public static NotificationService notificationServer;
public static JedisPool jedisPool;
public static Logger logger;
+ public static AuthService auth;
public Server() throws IOException {
logger = new Logger(new File("./notificationServer.log"), "Server", true);
- Server.logger.write("Server starting ...");
-
- //Start services
+ Server.logger.write("Services starting ...");
+ startAuthService();
+ startJedisService();
+ startMessageService();
+ startNotificationService();
+ Server.logger.write("Services started correctly ...");
+ }
+ private void startAuthService(){
+ //Starting Auth service based on RMI
try {
- //Definitions of registry for auth
- Auth auth = new Auth(Config.AuthServerPort);
+ auth = new AuthService(Config.AuthServerPort);
Registry authRegistry = LocateRegistry.createRegistry(auth.serverPort);
authRegistry.bind("auth", auth);
-
- //Connecting to Redis server on localhost
- jedisPool = new JedisPool(new JedisPoolConfig(), "localhost");
-
- GameServer gameServer = new GameServer(Config.GameServerPort);
- new Thread(gameServer).start();
-
- try {
- /*registrazione presso il registry */
- notificationServer = new NotificationServer();
- INotificationServer stub = (INotificationServer) UnicastRemoteObject.exportObject(notificationServer, Config.NotificationServerPort);
- LocateRegistry.createRegistry(Config.NotificationServerStubPort);
- Registry notificationRegistry = LocateRegistry.getRegistry(Config.NotificationServerStubPort);
- notificationRegistry.bind(Config.NotificationServerName, stub);
-
-
- } catch (Exception e) {
- System.out.println("Eccezione" + e);
- }
- Server.logger.write("Server started");
+ } catch (RemoteException e) {
+ Server.logger.write("SERVER: RMI authentication service error (Remote exception)");
} catch (AlreadyBoundException e) {
- e.printStackTrace();
+ Server.logger.write("SERVER: RMI authentication service can't use this port because is busy ");
}
}
+ private void startJedisService(){
+ //Starting Jedis pool for Redis connection
+ jedisPool = new JedisPool(new JedisPoolConfig(), Config.RedisServerURI);
+ }
+ private void startMessageService(){
+ //Starting the Message service based on TCP
+ new Thread(new MessageService(Config.GameServerPort)).start();
+ }
+
+ private void startNotificationService(){
+ //Starting Notification service based on RMI
+ try {
+ notificationServer = new NotificationService();
+ INotificationServer stub = (INotificationServer) UnicastRemoteObject.exportObject(notificationServer, Config.NotificationServerPort);
+ LocateRegistry.createRegistry(Config.NotificationServerStubPort);
+
+ Registry notificationRegistry = LocateRegistry.getRegistry(Config.NotificationServerStubPort);
+ notificationRegistry.bind(Config.NotificationServerName, stub);
+ } catch (RemoteException e) {
+ Server.logger.write("SERVER: RMI notification service error (Remote exception)");
+ } catch (AlreadyBoundException e) {
+ Server.logger.write("SERVER: RMI notification service can't use this port because is busy ");
+ }
+ }
}
diff --git a/Server/src/com/texttwist/server/components/SessionsManager.java b/Server/src/com/texttwist/server/components/SessionsManager.java
deleted file mode 100644
index a2fa7bd..0000000
--- a/Server/src/com/texttwist/server/components/SessionsManager.java
+++ /dev/null
@@ -1,88 +0,0 @@
-package com.texttwist.server.components;
-import interfaces.INotificationClient;
-import models.Session;
-import models.User;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * Created by loke on 17/06/2017.
- */
-public class SessionsManager {
-
- private List sessions = Collections.synchronizedList(new ArrayList());
- private static class Holder {
- static final SessionsManager INSTANCE = new SessionsManager();
- }
-
- public static SessionsManager getInstance() {
- return Holder.INSTANCE;
- }
-
- private SessionsManager(){}
-
- public boolean add(String userName, String token) {
- remove(userName);
- return sessions.add(new Session(new User(userName,"",0), token));
- }
-
- public void printAll(){
- Iterator i = sessions.iterator();
- while (i.hasNext()) {
- Session elem = i.next();
- System.out.println(elem.account.userName + " | " + elem.token);
- }
-
- }
-
- public boolean remove(String userName){
- if(exists(userName)) {
- Session s = getSession(userName);
- if(s != null) {
- sessions.remove(s);
- return true;
- }
- }
- return false;
- }
-
- public Session getSession(String userName) {
- Iterator i = sessions.iterator();
- while (i.hasNext()) {
- Session elem = i.next();
- if (elem.account.userName.equals(userName)) {
- return elem;
- }
- }
- return null;
-
- }
-
- public boolean exists(String userName) {
- Iterator i = sessions.iterator();
- while (i.hasNext()) {
- Session elem = i.next();
- if (elem.account.userName.equals(userName)) {
- return true;
- }
- }
- return false;
-
- }
-
-
- public boolean isValidToken(String token) {
- Iterator i = sessions.iterator();
- while (i.hasNext()) {
- if (i.next().token.equals(token)) {
- return true;
- }
- }
- return false;
-
- }
-
-}
diff --git a/Server/src/com/texttwist/server/models/Dictionary.java b/Server/src/com/texttwist/server/models/Dictionary.java
index 287e576..5d0a452 100644
--- a/Server/src/com/texttwist/server/models/Dictionary.java
+++ b/Server/src/com/texttwist/server/models/Dictionary.java
@@ -1,23 +1,20 @@
package com.texttwist.server.models;
+import com.texttwist.server.Server;
+
import javax.swing.*;
import java.io.*;
-import java.nio.ByteBuffer;
-import java.nio.channels.FileChannel;
-import java.nio.charset.Charset;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.nio.file.StandardOpenOption;
import java.util.Random;
-import java.util.stream.Stream;
+
/**
- * Created by loke on 26/06/2017.
+ * Author: Lorenzo Iovino on 26/06/2017.
+ * Description: Dictionary Model. Provides the dictionary and methods for manage it
*/
+
public class Dictionary {
- static DefaultListModel wordList = new DefaultListModel<>();
- private Random randomGenerator;
+ private static DefaultListModel wordList = new DefaultListModel<>();
public Dictionary(String dictionaryPath) {
try (BufferedReader br = new BufferedReader(new FileReader(new File(dictionaryPath)))) {
@@ -25,15 +22,16 @@ public class Dictionary {
wordList.addElement(line);
}
} catch (FileNotFoundException e) {
- e.printStackTrace();
+ Server.logger.write("DICTIONARY: Dictionary file not found!");
} catch (IOException e) {
- e.printStackTrace();
+ Server.logger.write("DICTIONARY: Can't read dictionary file!");
}
}
+ //Get a random word in wordsList with minimumWordSize < size < maximumWordSize
public String getRandomWord(int minimumWordSize, int maximumWordSize){
- randomGenerator = new Random();
+ Random randomGenerator = new Random();
int index = randomGenerator.nextInt(wordList.size());
String word = wordList.get(index);
if(word.length() >= minimumWordSize && word.length() <= maximumWordSize) {
@@ -55,6 +53,7 @@ public class Dictionary {
}
}
+ //Check if a word is contained in dictionary
public static Boolean isContainedInDictionary(String word){
if(word.equals("")){
return true;
@@ -66,5 +65,4 @@ public class Dictionary {
}
return false;
}
-
}
diff --git a/Server/src/com/texttwist/server/models/Match.java b/Server/src/com/texttwist/server/models/Match.java
index 0f16cd7..a9f8066 100644
--- a/Server/src/com/texttwist/server/models/Match.java
+++ b/Server/src/com/texttwist/server/models/Match.java
@@ -1,40 +1,57 @@
package com.texttwist.server.models;
-import com.texttwist.server.components.GameServer;
+import com.texttwist.server.services.MessageService;
import com.texttwist.server.tasks.MatchTimeout;
-import constants.Config;
import javafx.util.Pair;
-import models.Message;
import javax.swing.*;
-import java.io.IOException;
-import java.net.*;
import java.nio.channels.SocketChannel;
import java.util.*;
-import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
-import static com.texttwist.server.components.GameServer.activeMatches;
+import static com.texttwist.server.services.MessageService.activeMatches;
+
/**
- * Created by loke on 23/06/2017.
+ * Author: Lorenzo Iovino on 23/06/2017.
+ * Description: Match Model. Methods for manage the matches and model of single match.
+ * Single point of concurrent access.
*/
public class Match {
- public final List> playersStatus = Collections.synchronizedList(new ArrayList<>()); //Usare Liste!!!!!!!
- public final List> playersSocket = Collections.synchronizedList(new ArrayList<>());
- private boolean started = false;
- public final String matchCreator;
- public Integer multicastId;
- public Future timeout;
- public boolean matchTimeout = true;
- public boolean joinTimeout =true;
- public DefaultListModel letters;
- protected ExecutorService threadPool = Executors.newSingleThreadExecutor();
+ /****GLOBAL AREA OF ALL MATCHES****/
+ //Players status: A list of pair where elements are .
+ // status is 0 if user is not currently in a match, and 1 otherwise
+ public final List> playersStatus = Collections.synchronizedList(new ArrayList<>());
+
+ //Players socket: A list of pair where elements are .
+ // socketChannel is the TCP socket associated with client for messages exchange
+ public final List> playersSocket = Collections.synchronizedList(new ArrayList<>());
+
+ //Players score: A list of pair where elements are .
public final List> playersScore = Collections.synchronizedList(new ArrayList<>());
+
+ /****SINGLE INSTANCE OF MATCH****/
+ //If match is started
+ private boolean started = false;
+
+ //Name of the creator of the match
+ public final String matchCreator;
+
+ //MulticastID associated with this match
+ public Integer multicastId;
+
+ //True if happen timeout, false otherwise
+ public boolean matchTimeout;
+ public boolean joinTimeout;
+
+ //Letters of the match
+ public DefaultListModel letters;
+
+ protected ExecutorService matchTimeoutThread = Executors.newSingleThreadExecutor();
+
public Match(String matchCreator, DefaultListModel players){
for (int i =0; i < players.size(); i++){
this.playersStatus.add(new Pair<>(players.get(i), 0));
@@ -47,116 +64,90 @@ public class Match {
}
- public Void sendScores(){
- while (true) {
- System.out.println("SENDING");
- Message msg = new Message("FINALSCORE", "SERVER", "", this.getMatchPlayersScoreAsStringList());
-
- MulticastSocket multicastSocket = null;
- try {
- multicastSocket = new MulticastSocket(this.multicastId);
- InetAddress ia = null;
- ia = InetAddress.getByName(Config.ScoreMulticastServerURI);
- DatagramPacket hi = new DatagramPacket(msg.toString().getBytes(), msg.toString().length(), ia, this.multicastId);
- multicastSocket.send(hi);
- } catch (IOException e) {
- e.printStackTrace();
- }
- activeMatches.remove(Match.findMatchIndex(activeMatches, this.matchCreator));
- }
- }
public static Match findMatch(List matches, String matchName){
- for (int i = 0; i < matches.size(); i++) {
- if (matches.get(i).matchCreator.equals(matchName)) {
- return matches.get(i);
+ for (Match match : matches) {
+ if (match.matchCreator.equals(matchName)) {
+ return match;
}
}
return null;
-
}
public void printAll(){
- for (int i = 0; i < playersScore.size(); i++) {
- System.out.println(playersScore.get(i).getKey() + " : " +playersScore.get(i).getValue());
-
+ for (Pair aPlayersScore : playersScore) {
+ System.out.println(aPlayersScore.getKey() + " : " + aPlayersScore.getValue());
}
}
+
public static int findMatchIndex(List matches, String matchName){
- for (int i = 0; i < matches.size(); i++) {
- if (matches.get(i).matchCreator.equals(matchName)) {
- return i;
- }
+ for (int i = 0; i < matches.size(); i++) {
+ if (matches.get(i).matchCreator.equals(matchName)) {
+ return i;
}
- return -1;
+ }
+ return -1;
}
public boolean isStarted(){
return started;
}
- public static Match findMatchByPlayer(String player){
- for (int i = 0; i < activeMatches.size(); i++) {
- for (int j = 0; j < activeMatches.get(i).playersStatus.size(); j++) {
- if (activeMatches.get(i).playersStatus.get(j).getKey().equals(player)) {
- return activeMatches.get(i);
+ public static Match findMatchByPlayerName(String player){
+ for (Match activeMatch : activeMatches) {
+ for (int j = 0; j < activeMatch.playersStatus.size(); j++) {
+ if (activeMatch.playersStatus.get(j).getKey().equals(player)) {
+ return activeMatch;
}
}
- /* if (matches.get(i).matchCreator.equals(matchName)) {
- return i;
- }*/
}
return null;
}
public void startGame(){
- this.started=true;
- threadPool.submit(new MatchTimeout(this));
-
+ this.started = true;
+ matchTimeoutThread.submit(new MatchTimeout(this));
}
public void setScore(String player, Integer score){
- Match m = findMatchByPlayer(player);
- m.printAll();
-
- for (int i = 0; i < m.playersScore.size(); i++) {
- if (m.playersScore.get(i).getKey().equals(player)) {
- m.playersScore.set(i, new Pair(player, score));
+ Match m = findMatchByPlayerName(player);
+ if(m!=null) {
+ for (int i = 0; i < m.playersScore.size(); i++) {
+ if (m.playersScore.get(i).getKey().equals(player)) {
+ m.playersScore.set(i, new Pair<>(player, score));
+ }
}
}
}
public Boolean allPlayersSendedHisScore(){
- System.out.println(matchCreator);
- printAll();
- for (int i = 0; i < playersScore.size(); i++) {
- if (playersScore.get(i).getValue() == -1) {
- return false;
- }
+ for (Pair player : playersScore) {
+ if (player.getValue() == -1) {
+ return false;
}
- return true;
+ }
+ return true;
}
public void setUndefinedScorePlayersToZero(){
- for (int i = 0; i < playersScore.size(); i++) {
- if (playersScore.get(i).getValue() == -1) {
- playersScore.set(i, new Pair(playersScore.get(i).getKey(), 0));
- }
+ for (int i = 0; i < playersScore.size(); i++) {
+ if (playersScore.get(i).getValue() == -1) {
+ playersScore.set(i, new Pair<>(playersScore.get(i).getKey(), 0));
}
+ }
}
public DefaultListModel getMatchPlayersScoreAsStringList(){
- DefaultListModel l = new DefaultListModel<>();
- for (int i = 0; i < playersScore.size(); i++) {
- l.addElement(playersScore.get(i).getKey() + ":" + playersScore.get(i).getValue());
- }
- return l;
-
+ DefaultListModel l = new DefaultListModel<>();
+ for (Pair player : playersScore) {
+ l.addElement(player.getKey() + ":" + player.getValue());
+ }
+ return l;
}
-
private int generateMulticastId(){
- return GameServer.multicastID++;
+ return MessageService.multicastID++;
}
+
public void setLetters(DefaultListModel letters){
this.letters = letters;
}
diff --git a/Server/src/com/texttwist/server/components/ThreadProxy.java b/Server/src/com/texttwist/server/servers/ProxyDispatcher.java
similarity index 92%
rename from Server/src/com/texttwist/server/components/ThreadProxy.java
rename to Server/src/com/texttwist/server/servers/ProxyDispatcher.java
index 4d94634..dfe24f8 100644
--- a/Server/src/com/texttwist/server/components/ThreadProxy.java
+++ b/Server/src/com/texttwist/server/servers/ProxyDispatcher.java
@@ -1,221 +1,214 @@
-package com.texttwist.server.components;
-
-import com.sun.org.apache.xpath.internal.operations.Bool;
-import com.texttwist.client.App;
-import com.texttwist.server.models.Match;
-import com.texttwist.server.tasks.*;
-import constants.Config;
-import javafx.util.Pair;
-import models.Message;
-
-import javax.swing.*;
-import java.io.IOException;
-import java.net.DatagramPacket;
-import java.net.DatagramSocket;
-import java.net.InetAddress;
-import java.net.MulticastSocket;
-import java.nio.ByteBuffer;
-import java.nio.channels.DatagramChannel;
-import java.nio.channels.SocketChannel;
-import java.util.concurrent.*;
-
-import static com.texttwist.server.components.GameServer.activeMatches;
-
-/**
- * Created by loke on 18/06/2017.
- */
-public class ThreadProxy implements Callable {
- protected final ExecutorService threadPool = Executors.newCachedThreadPool();
- private final Message request;
- private final SocketChannel socketChannel;
- private ByteBuffer bufferMessage;
- boolean matchNotAvailable =false;
-
-
- ThreadProxy(Message request, SocketChannel socketChannel, ByteBuffer bufferMessage) {
- this.request = request;
- this.socketChannel = socketChannel;
- this.bufferMessage = bufferMessage;
-
- }
-
- @Override
- public Boolean call() {
- bufferMessage = ByteBuffer.allocate(1024);
- byte[] byteMessage = null;
- if(SessionsManager.getInstance().isValidToken(request.token)){
- switch(request.message){
- case "START_GAME":
- Future onlineUsers = threadPool.submit(new CheckOnlineUsers(request.data));
- try {
- Boolean usersOnline = onlineUsers.get();
- if(usersOnline){
- Future sendInvitations = threadPool.submit(new SendInvitations(request.sender, request.data));
- try {
- Boolean invitationSended = sendInvitations.get();
- if (invitationSended) {
-
- //Crea nuova partita e attendi i giocatori
- request.data.addElement(request.sender);
- final Match match = new Match(request.sender, request.data);
- match.printAll();
-
- activeMatches.add(match);
-
- DefaultListModel matchName = new DefaultListModel<>();
- matchName.addElement(request.sender);
-
- Future joinMatch = threadPool.submit(new JoinMatch(request.sender, matchName, socketChannel));
- Boolean joinMatchRes = joinMatch.get();
-
- if(!joinMatchRes){
- bufferMessage = ByteBuffer.allocate(1024);
-
- //NON FARE NULLA, ASPETTA GLI ALTRI
- Message message = new Message("INVITES_ALL_SENDED", "", "", new DefaultListModel<>());
- byteMessage = message.toString().getBytes();
- bufferMessage = ByteBuffer.wrap(byteMessage);
- socketChannel.write(bufferMessage);
- }
-
- Future joinTimeout = threadPool.submit(new JoinTimeout(match));
- joinTimeout.get();
- if(match.joinTimeout){
- Future sendMessageJoinTimeout = threadPool.submit(
- new SendMessageToAllPlayers(match, new Message("JOIN_TIMEOUT", "", "", new DefaultListModel<>()), socketChannel));
- Boolean sendMessageJoinTimeoutRes = sendMessageJoinTimeout.get();
- if(!sendMessageJoinTimeoutRes){
- activeMatches.remove(Match.findMatchIndex(activeMatches, match.matchCreator));
- return sendMessageJoinTimeoutRes;
- }
- } else {
- System.out.println("TIMEOUT FINITO SENZA EFFETTI");
- return true;
- }
-
- } else {
- return false;
- }
- } catch (InterruptedException e) {
- e.printStackTrace();
- } catch (ExecutionException e) {
- e.printStackTrace();
- }
- } else {
-
- Message message = new Message("USER_NOT_ONLINE", "", "", new DefaultListModel<>());
- byteMessage = new String(message.toString()).getBytes();
- bufferMessage.clear();
- bufferMessage = ByteBuffer.wrap(byteMessage);
- this.socketChannel.write(bufferMessage);
- return false;
- }
- } catch (InterruptedException e) {
- e.printStackTrace();
- } catch (ExecutionException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
-
- case "FETCH_HIGHSCORES":
- Future> computeHighscores = threadPool.submit(new ComputeHighscores());
- try {
- DefaultListModel computeHighscoresRes = computeHighscores.get();
- bufferMessage.clear();
- bufferMessage = ByteBuffer.allocate(1024);
-
- Message message = new Message("HIGHSCORES", "", "", computeHighscoresRes);
- byteMessage = message.toString().getBytes();
-
- bufferMessage = ByteBuffer.wrap(byteMessage);
- try {
- String s = new String(bufferMessage.array(), bufferMessage.position(), bufferMessage.remaining());
- System.out.println("INVIO HIGHSCORES "+ s);
- socketChannel.write(bufferMessage);
- } catch (IOException e) {
- e.printStackTrace();
- }
- return false;
- } catch (InterruptedException e) {
- e.printStackTrace();
- } catch (ExecutionException e) {
- e.printStackTrace();
- }
-
- case "JOIN_GAME":
- Future joinMatch = threadPool.submit(new JoinMatch(request.sender, request.data, socketChannel));
- try {
- Match match = Match.findMatch(activeMatches, request.data.get(0));;
- Boolean joinMatchRes = joinMatch.get();
- if(joinMatchRes){
-
- if(!match.joinTimeout) {
- Future> generateLetters = threadPool.submit(new GenerateLetters());
- match.setLetters(generateLetters.get());
- match.letters.addElement(String.valueOf(match.multicastId));
-
- for (int i = 0; i < match.playersSocket.size(); i++) {
- SocketChannel socketClient = match.playersSocket.get(i).getValue();
- if (socketClient != null) {
- bufferMessage.clear();
- bufferMessage = ByteBuffer.allocate(1024);
-
- Message message = new Message("GAME_STARTED", "", "", match.letters);
- match.startGame();
-
- System.out.println("TIMEOUT CANCELLEd");
- byteMessage = message.toString().getBytes();
-
- bufferMessage = ByteBuffer.wrap(byteMessage);
- try {
- String s = new String(bufferMessage.array(), bufferMessage.position(), bufferMessage.remaining());
- System.out.println("INVIO GAME_STARTED "+ s);
- socketClient.write(bufferMessage);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
-
- }
- if (matchNotAvailable) {
- return false;
- }
- }
- } else {
- if(match == null){
- bufferMessage = ByteBuffer.allocate(1024);
- if (socketChannel != null) {
- bufferMessage = ByteBuffer.allocate(1024);
-
- Message msg = new Message("MATCH_NOT_AVAILABLE", "", null, new DefaultListModel<>());
- bufferMessage.clear();
- byteMessage = msg.toString().getBytes();
- bufferMessage = ByteBuffer.wrap(byteMessage);
- socketChannel.write(bufferMessage);
- matchNotAvailable = true;
- }
-
- }
- }
- } catch (InterruptedException e) {
- e.printStackTrace();
- } catch (ExecutionException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
-
- default:
-
- break;
- }
-
- } else {
- threadPool.submit(new TokenInvalid(request.sender, socketChannel, bufferMessage));
- return false;
- }
-
- return false;
- }
-}
+package com.texttwist.server.servers;
+
+import com.texttwist.server.services.SessionsService;
+import com.texttwist.server.models.Match;
+import com.texttwist.server.tasks.*;
+import models.Message;
+
+import javax.swing.*;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.channels.SocketChannel;
+import java.util.concurrent.*;
+
+import static com.texttwist.server.services.MessageService.activeMatches;
+
+/**
+ * Author: Lorenzo Iovino on 18/06/2017.
+ * Description: Jedis Service
+ */
+public class ProxyDispatcher implements Callable {
+ protected final ExecutorService threadPool = Executors.newCachedThreadPool();
+ private final Message request;
+ private final SocketChannel socketChannel;
+ private ByteBuffer bufferMessage;
+ boolean matchNotAvailable =false;
+
+
+ public ProxyDispatcher(Message request, SocketChannel socketChannel, ByteBuffer bufferMessage) {
+ this.request = request;
+ this.socketChannel = socketChannel;
+ this.bufferMessage = bufferMessage;
+
+ }
+
+ @Override
+ public Boolean call() {
+ bufferMessage = ByteBuffer.allocate(1024);
+ byte[] byteMessage = null;
+ if(SessionsService.getInstance().isValidToken(request.token)){
+ switch(request.message){
+ case "START_GAME":
+ Future onlineUsers = threadPool.submit(new CheckOnlineUsers(request.data));
+ try {
+ Boolean usersOnline = onlineUsers.get();
+ if(usersOnline){
+ Future sendInvitations = threadPool.submit(new SendInvitations(request.sender, request.data));
+ try {
+ Boolean invitationSended = sendInvitations.get();
+ if (invitationSended) {
+
+ //Crea nuova partita e attendi i giocatori
+ request.data.addElement(request.sender);
+ final Match match = new Match(request.sender, request.data);
+ match.printAll();
+
+ activeMatches.add(match);
+
+ DefaultListModel matchName = new DefaultListModel<>();
+ matchName.addElement(request.sender);
+
+ Future joinMatch = threadPool.submit(new JoinMatch(request.sender, matchName, socketChannel));
+ Boolean joinMatchRes = joinMatch.get();
+
+ if(!joinMatchRes){
+ bufferMessage = ByteBuffer.allocate(1024);
+
+ //NON FARE NULLA, ASPETTA GLI ALTRI
+ Message message = new Message("INVITES_ALL_SENDED", "", "", new DefaultListModel<>());
+ byteMessage = message.toString().getBytes();
+ bufferMessage = ByteBuffer.wrap(byteMessage);
+ socketChannel.write(bufferMessage);
+ }
+
+ Future joinTimeout = threadPool.submit(new JoinTimeout(match));
+ joinTimeout.get();
+ if(match.joinTimeout){
+ Future sendMessageJoinTimeout = threadPool.submit(
+ new SendMessageToAllPlayers(match, new Message("JOIN_TIMEOUT", "", "", new DefaultListModel<>()), socketChannel));
+ Boolean sendMessageJoinTimeoutRes = sendMessageJoinTimeout.get();
+ if(!sendMessageJoinTimeoutRes){
+ activeMatches.remove(Match.findMatchIndex(activeMatches, match.matchCreator));
+ return sendMessageJoinTimeoutRes;
+ }
+ } else {
+ System.out.println("TIMEOUT FINITO SENZA EFFETTI");
+ return true;
+ }
+
+ } else {
+ return false;
+ }
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ } catch (ExecutionException e) {
+ e.printStackTrace();
+ }
+ } else {
+
+ Message message = new Message("USER_NOT_ONLINE", "", "", new DefaultListModel<>());
+ byteMessage = new String(message.toString()).getBytes();
+ bufferMessage.clear();
+ bufferMessage = ByteBuffer.wrap(byteMessage);
+ this.socketChannel.write(bufferMessage);
+ return false;
+ }
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ } catch (ExecutionException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ case "FETCH_HIGHSCORES":
+ Future> computeHighscores = threadPool.submit(new ComputeHighscores());
+ try {
+ DefaultListModel computeHighscoresRes = computeHighscores.get();
+ bufferMessage.clear();
+ bufferMessage = ByteBuffer.allocate(1024);
+
+ Message message = new Message("HIGHSCORES", "", "", computeHighscoresRes);
+ byteMessage = message.toString().getBytes();
+
+ bufferMessage = ByteBuffer.wrap(byteMessage);
+ try {
+ String s = new String(bufferMessage.array(), bufferMessage.position(), bufferMessage.remaining());
+ System.out.println("INVIO HIGHSCORES "+ s);
+ socketChannel.write(bufferMessage);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return false;
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ } catch (ExecutionException e) {
+ e.printStackTrace();
+ }
+
+ case "JOIN_GAME":
+ Future joinMatch = threadPool.submit(new JoinMatch(request.sender, request.data, socketChannel));
+ try {
+ Match match = Match.findMatch(activeMatches, request.data.get(0));;
+ Boolean joinMatchRes = joinMatch.get();
+ if(joinMatchRes){
+
+ if(!match.joinTimeout) {
+ Future> generateLetters = threadPool.submit(new GenerateLetters());
+ match.setLetters(generateLetters.get());
+ match.letters.addElement(String.valueOf(match.multicastId));
+
+ for (int i = 0; i < match.playersSocket.size(); i++) {
+ SocketChannel socketClient = match.playersSocket.get(i).getValue();
+ if (socketClient != null) {
+ bufferMessage.clear();
+ bufferMessage = ByteBuffer.allocate(1024);
+
+ Message message = new Message("GAME_STARTED", "", "", match.letters);
+ match.startGame();
+
+ System.out.println("TIMEOUT CANCELLEd");
+ byteMessage = message.toString().getBytes();
+
+ bufferMessage = ByteBuffer.wrap(byteMessage);
+ try {
+ String s = new String(bufferMessage.array(), bufferMessage.position(), bufferMessage.remaining());
+ System.out.println("INVIO GAME_STARTED "+ s);
+ socketClient.write(bufferMessage);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ }
+ if (matchNotAvailable) {
+ return false;
+ }
+ }
+ } else {
+ if(match == null){
+ bufferMessage = ByteBuffer.allocate(1024);
+ if (socketChannel != null) {
+ bufferMessage = ByteBuffer.allocate(1024);
+
+ Message msg = new Message("MATCH_NOT_AVAILABLE", "", null, new DefaultListModel<>());
+ bufferMessage.clear();
+ byteMessage = msg.toString().getBytes();
+ bufferMessage = ByteBuffer.wrap(byteMessage);
+ socketChannel.write(bufferMessage);
+ matchNotAvailable = true;
+ }
+
+ }
+ }
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ } catch (ExecutionException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ default:
+
+ break;
+ }
+
+ } else {
+ threadPool.submit(new TokenInvalid(request.sender, socketChannel, bufferMessage));
+ return false;
+ }
+
+ return false;
+ }
+}
diff --git a/Server/src/com/texttwist/server/components/AccountsManager.java b/Server/src/com/texttwist/server/services/AccountsService.java
similarity index 80%
rename from Server/src/com/texttwist/server/components/AccountsManager.java
rename to Server/src/com/texttwist/server/services/AccountsService.java
index 5fd93fa..5d5515d 100644
--- a/Server/src/com/texttwist/server/components/AccountsManager.java
+++ b/Server/src/com/texttwist/server/services/AccountsService.java
@@ -1,79 +1,80 @@
-package com.texttwist.server.components;
-
-import models.User;
-import java.io.Serializable;
-import java.util.*;
-
-
-/**
- * Created by loke on 18/06/2017.
- */
-public class AccountsManager {
-
- public List users = Collections.synchronizedList(new ArrayList());
-
- private static class Holder {
- static final AccountsManager INSTANCE = new AccountsManager();
- }
-
- public static AccountsManager getInstance() {
- return AccountsManager.Holder.INSTANCE;
- }
-
- private AccountsManager(){
- List l = JedisService.get("users");
- for(int i=0; i i = users.iterator();
- while (i.hasNext()) {
- if (i.next().userName.equals(userName)) {
- return true;
- }
- }
- return false;
-
- }
-
- public boolean checkPassword(String userName, String password) {
- Iterator i = users.iterator();
- while (i.hasNext()) {
- User account = i.next();
- if (account.userName.equals(userName) && account.password.equals(password)) {
- return true;
- }
- }
- return false;
-
- }
-
- public User findUser(String userName){
- Iterator i = users.iterator();
- while (i.hasNext()) {
- User u = i.next();
- if (u.userName.equals(userName)) {
- return u;
- }
- }
- return null;
- }
-
- public int size(){
- return users.size();
- }
-
-}
+package com.texttwist.server.services;
+
+import models.User;
+import java.io.Serializable;
+import java.util.*;
+
+
+/**
+ * Author: Lorenzo Iovino on 18/06/2017.
+ * Description: AccountsService
+ */
+public class AccountsService {
+
+ public List users = Collections.synchronizedList(new ArrayList());
+
+ private static class Holder {
+ static final AccountsService INSTANCE = new AccountsService();
+ }
+
+ public static AccountsService getInstance() {
+ return AccountsService.Holder.INSTANCE;
+ }
+
+ private AccountsService(){
+ List l = JedisService.get("users");
+ for(int i=0; i i = users.iterator();
+ while (i.hasNext()) {
+ if (i.next().userName.equals(userName)) {
+ return true;
+ }
+ }
+ return false;
+
+ }
+
+ public boolean checkPassword(String userName, String password) {
+ Iterator i = users.iterator();
+ while (i.hasNext()) {
+ User account = i.next();
+ if (account.userName.equals(userName) && account.password.equals(password)) {
+ return true;
+ }
+ }
+ return false;
+
+ }
+
+ public User findUser(String userName){
+ Iterator i = users.iterator();
+ while (i.hasNext()) {
+ User u = i.next();
+ if (u.userName.equals(userName)) {
+ return u;
+ }
+ }
+ return null;
+ }
+
+ public int size(){
+ return users.size();
+ }
+
+}
diff --git a/Server/src/com/texttwist/server/components/Auth.java b/Server/src/com/texttwist/server/services/AuthService.java
similarity index 79%
rename from Server/src/com/texttwist/server/components/Auth.java
rename to Server/src/com/texttwist/server/services/AuthService.java
index 08dc66b..675b10c 100644
--- a/Server/src/com/texttwist/server/components/Auth.java
+++ b/Server/src/com/texttwist/server/services/AuthService.java
@@ -1,83 +1,84 @@
-package com.texttwist.server.components;
-
-import com.texttwist.server.Server;
-import interfaces.IAuth;
-import interfaces.INotificationClient;
-import models.Response;
-import org.json.simple.JsonObject;
-import java.math.BigInteger;
-import java.rmi.RemoteException;
-import java.rmi.server.UnicastRemoteObject;
-import java.security.SecureRandom;
-
-import static com.texttwist.server.Server.notificationServer;
-
-/**
- * Created by loke on 15/06/2017.
- */
-public class Auth extends UnicastRemoteObject implements IAuth {
-
- private SecureRandom random = new SecureRandom();
- public int serverPort = 9999;
-
-
- public Auth(int serverPort) throws RemoteException{
- this.serverPort=serverPort;
- Server.logger.write("Auth Service running at "+serverPort+" port...");
- }
-
- @Override
- public Response register(String userName, String password) throws RemoteException {
- Server.logger.write("Invoked register with username=" + userName + " AND " + " password=" + password);
- if ((userName != null && !userName.isEmpty()) && (password != null && !password.equals(""))) {
- if(AccountsManager.getInstance().register(userName, password)){
- Server.logger.write("Registration successfull");
- return new Response("Registration successfull", 200, null);
- } else {
- Server.logger.write("Registration unsuccessfull");
- return new Response("Registration unsuccessfull:
Username exist!", 400, null);
- }
- }
- return new Response("Registration unsuccessfull!
All fields are mandatories", 400, null);
- }
-
- @Override
- public Response login(String userName, String password) throws RemoteException {
- Server.logger.write("Invoked login with username=" + userName + " AND " + " password=" + password);
- if ((userName != null && !userName.isEmpty()) && (password != null && !password.equals(""))) {
- if(AccountsManager.getInstance().exists(userName) && AccountsManager.getInstance().checkPassword(userName, password)) {
- JsonObject data = new JsonObject();
- String token = nextSessionId();
- data.put("token", token);
- SessionsManager.getInstance().add(userName,token);
- Server.logger.write("Login successfull");
- return new Response("Login successfull", 200, data);
- }
- }
- Server.logger.write("Login unsuccessfull");
- return new Response("Login unsuccessfull", 400, null);
- }
-
- @Override
- public Response logout(String userName, String token, INotificationClient stub) throws RemoteException {
- Server.logger.write("Invoked logout with username=" + userName + " AND " + " token=" + token);
- notificationServer.unregisterForCallback(stub);
-
- if ((userName != null && !userName.isEmpty()) && (token != null && !token.isEmpty())) {
- boolean res = SessionsManager.getInstance().remove(userName);
- if(res) {
- Server.logger.write("Logout successfull");
-
- }
- }
-
- SessionsManager.getInstance().remove(userName);
- Server.logger.write("Logout successfull (but something gone wrong)");
- return new Response("Logout successfull (but something gone wrong)", 200, null);
- }
-
- public String nextSessionId() {
- return new BigInteger(130, random).toString(32);
- }
-
-}
+package com.texttwist.server.services;
+
+import com.texttwist.server.Server;
+import interfaces.IAuth;
+import interfaces.INotificationClient;
+import models.Response;
+import org.json.simple.JsonObject;
+import java.math.BigInteger;
+import java.rmi.RemoteException;
+import java.rmi.server.UnicastRemoteObject;
+import java.security.SecureRandom;
+
+import static com.texttwist.server.Server.notificationServer;
+
+/**
+ * Author: Lorenzo Iovino on 15/06/2017.
+ * Description: AuthService
+ */
+public class AuthService extends UnicastRemoteObject implements IAuth {
+
+ private SecureRandom random = new SecureRandom();
+ public int serverPort = 9999;
+
+
+ public AuthService(int serverPort) throws RemoteException{
+ this.serverPort=serverPort;
+ Server.logger.write("AuthService Service running at "+serverPort+" port...");
+ }
+
+ @Override
+ public Response register(String userName, String password) throws RemoteException {
+ Server.logger.write("Invoked register with username=" + userName + " AND " + " password=" + password);
+ if ((userName != null && !userName.isEmpty()) && (password != null && !password.equals(""))) {
+ if(AccountsService.getInstance().register(userName, password)){
+ Server.logger.write("Registration successfull");
+ return new Response("Registration successfull", 200, null);
+ } else {
+ Server.logger.write("Registration unsuccessfull");
+ return new Response("Registration unsuccessfull:
Username exist!", 400, null);
+ }
+ }
+ return new Response("Registration unsuccessfull!
All fields are mandatories", 400, null);
+ }
+
+ @Override
+ public Response login(String userName, String password) throws RemoteException {
+ Server.logger.write("Invoked login with username=" + userName + " AND " + " password=" + password);
+ if ((userName != null && !userName.isEmpty()) && (password != null && !password.equals(""))) {
+ if(AccountsService.getInstance().exists(userName) && AccountsService.getInstance().checkPassword(userName, password)) {
+ JsonObject data = new JsonObject();
+ String token = nextSessionId();
+ data.put("token", token);
+ SessionsService.getInstance().add(userName,token);
+ Server.logger.write("Login successfull");
+ return new Response("Login successfull", 200, data);
+ }
+ }
+ Server.logger.write("Login unsuccessfull");
+ return new Response("Login unsuccessfull", 400, null);
+ }
+
+ @Override
+ public Response logout(String userName, String token, INotificationClient stub) throws RemoteException {
+ Server.logger.write("Invoked logout with username=" + userName + " AND " + " token=" + token);
+ notificationServer.unregisterForCallback(stub);
+
+ if ((userName != null && !userName.isEmpty()) && (token != null && !token.isEmpty())) {
+ boolean res = SessionsService.getInstance().remove(userName);
+ if(res) {
+ Server.logger.write("Logout successfull");
+
+ }
+ }
+
+ SessionsService.getInstance().remove(userName);
+ Server.logger.write("Logout successfull (but something gone wrong)");
+ return new Response("Logout successfull (but something gone wrong)", 200, null);
+ }
+
+ public String nextSessionId() {
+ return new BigInteger(130, random).toString(32);
+ }
+
+}
diff --git a/Server/src/com/texttwist/server/components/JedisService.java b/Server/src/com/texttwist/server/services/JedisService.java
similarity index 95%
rename from Server/src/com/texttwist/server/components/JedisService.java
rename to Server/src/com/texttwist/server/services/JedisService.java
index 9b1b627..6d796cd 100644
--- a/Server/src/com/texttwist/server/components/JedisService.java
+++ b/Server/src/com/texttwist/server/services/JedisService.java
@@ -1,10 +1,9 @@
-package com.texttwist.server.components;
+package com.texttwist.server.services;
import models.User;
import redis.clients.jedis.Jedis;
import java.io.*;
-import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Base64;
import java.util.List;
@@ -12,7 +11,8 @@ import java.util.List;
import static com.texttwist.server.Server.jedisPool;
/**
- * Created by loke on 11/07/2017.
+ * Author: Lorenzo Iovino on 11/07/2017.
+ * Description: Jedis Service
*/
public class JedisService {
diff --git a/Server/src/com/texttwist/server/components/GameServer.java b/Server/src/com/texttwist/server/services/MessageService.java
similarity index 90%
rename from Server/src/com/texttwist/server/components/GameServer.java
rename to Server/src/com/texttwist/server/services/MessageService.java
index 2680cea..2c42788 100644
--- a/Server/src/com/texttwist/server/components/GameServer.java
+++ b/Server/src/com/texttwist/server/services/MessageService.java
@@ -1,138 +1,141 @@
-
-package com.texttwist.server.components;
-import com.texttwist.client.App;
-import com.texttwist.server.Server;
-import com.texttwist.server.models.Dictionary;
-import com.texttwist.server.models.Match;
-import com.texttwist.server.tasks.ReceiveWords;
-import constants.Config;
-import models.Message;
-import utilities.Logger;
-
-import java.net.*;
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.nio.channels.*;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-
-import static java.nio.channels.SelectionKey.OP_ACCEPT;
-import static java.nio.channels.SelectionKey.OP_READ;
-
-public class GameServer implements Runnable{
-
- private int serverPort;
- private ThreadProxy proxy;
- private ReceiveWords wordsReceiver;
-
- private DatagramChannel datagramChannel;
- private Selector selector = null;
- private ExecutorService threadPool = Executors.newCachedThreadPool();
- private String dictionaryPath = "./Server/resources/dictionary";
- public static Dictionary dict;
- SocketChannel client;
- ByteBuffer bufferWords = ByteBuffer.allocate(1024);
- ByteBuffer bufferMessages = ByteBuffer.allocate(1024);
-
-
-
- public static List activeMatches = Collections.synchronizedList(new ArrayList<>());
- public static Integer multicastID = 4000;
-
- public GameServer(int port){
- this.serverPort = port;
- }
-
- public void run(){
-
- dict = new Dictionary(dictionaryPath);
- try {
- selector = Selector.open();
-
- ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
- serverSocketChannel.configureBlocking(false);
- serverSocketChannel.socket().bind(new InetSocketAddress(serverPort));
- serverSocketChannel.register(selector, OP_ACCEPT);
- InetSocketAddress address = new InetSocketAddress(Config.WordsReceiverServerURI,Config.WordsReceiverServerPort);
- datagramChannel = DatagramChannel.open();
- datagramChannel.configureBlocking(true);
- datagramChannel.connect(address);
- Server.logger.write("GameService Service is running at "+this.serverPort+" port...");
-
- wordsReceiver = new ReceiveWords(datagramChannel, bufferWords, bufferMessages, client);
- threadPool.submit(wordsReceiver);
-
- } catch (IOException e) {
- e.printStackTrace();
- }
-
- while (true) {
- System.out.println("WAITING FOR MSG");
- try {
- selector.select();
- } catch (IOException e) {
- e.printStackTrace();
- }
-
- Iterator iter = selector.selectedKeys().iterator();
- while (iter.hasNext()) {
- bufferMessages = ByteBuffer.allocate(1024);
- bufferMessages.clear();
- client = null;
- SelectionKey key = iter.next();
- iter.remove();
-
- try {
- switch (key.readyOps()) {
- case OP_ACCEPT:
- client = ((ServerSocketChannel) key.channel()).accept();
- client.configureBlocking(false);
- client.register(selector, OP_READ);
- break;
-
- case OP_READ:
- client = (SocketChannel) key.channel();
- if (client.read(bufferMessages) != -1) {
- bufferMessages.flip();
- String line = new String(bufferMessages.array(), bufferMessages.position(), bufferMessages.remaining());
- System.out.println(line);
- if (line.startsWith("MESSAGE")) {
- SessionsManager.getInstance().printAll();
- Message msg = Message.toMessage(line);
- proxy = new ThreadProxy(msg, client, bufferMessages);
- threadPool.submit(proxy);
- }
-
- if (line.startsWith("CLOSE")) {
- client.close();
- } else if (line.startsWith("QUIT")) {
- for (SelectionKey k : selector.keys()) {
- k.cancel();
- k.channel().close();
- }
- selector.close();
- return;
- }
- } else {
- key.cancel();
- }
- break;
-
- default:
- break;
- }
- } catch (IOException e) {
- try {
- client.close();
- } catch (IOException e1) {
- e1.printStackTrace();
- }
- }
- }
- }
- }
+
+package com.texttwist.server.services;
+import com.texttwist.server.Server;
+import com.texttwist.server.servers.ProxyDispatcher;
+import com.texttwist.server.models.Dictionary;
+import com.texttwist.server.models.Match;
+import com.texttwist.server.tasks.ReceiveWords;
+import constants.Config;
+import models.Message;
+import java.net.*;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.channels.*;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+import static java.nio.channels.SelectionKey.OP_ACCEPT;
+import static java.nio.channels.SelectionKey.OP_READ;
+
+
+/**
+ * Author: Lorenzo Iovino on 17/06/2017.
+ * Description: Game Server
+ */
+public class MessageService implements Runnable{
+
+ private int serverPort;
+ private ProxyDispatcher proxy;
+ private ReceiveWords wordsReceiver;
+
+ private DatagramChannel datagramChannel;
+ private Selector selector = null;
+ private ExecutorService threadPool = Executors.newCachedThreadPool();
+ private String dictionaryPath = "./Server/resources/dictionary";
+ public static Dictionary dict;
+ SocketChannel client;
+ ByteBuffer bufferWords = ByteBuffer.allocate(1024);
+ ByteBuffer bufferMessages = ByteBuffer.allocate(1024);
+
+
+
+ public static List activeMatches = Collections.synchronizedList(new ArrayList<>());
+ public static Integer multicastID = 4000;
+
+ public MessageService(int port){
+ this.serverPort = port;
+ }
+
+ public void run(){
+
+ dict = new Dictionary(dictionaryPath);
+ try {
+ selector = Selector.open();
+
+ ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
+ serverSocketChannel.configureBlocking(false);
+ serverSocketChannel.socket().bind(new InetSocketAddress(serverPort));
+ serverSocketChannel.register(selector, OP_ACCEPT);
+ InetSocketAddress address = new InetSocketAddress(Config.WordsReceiverServerURI,Config.WordsReceiverServerPort);
+ datagramChannel = DatagramChannel.open();
+ datagramChannel.configureBlocking(true);
+ datagramChannel.connect(address);
+ Server.logger.write("GameService Service is running at "+this.serverPort+" port...");
+
+ wordsReceiver = new ReceiveWords(datagramChannel, bufferWords, bufferMessages, client);
+ threadPool.submit(wordsReceiver);
+
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ while (true) {
+ System.out.println("WAITING FOR MSG");
+ try {
+ selector.select();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ Iterator iter = selector.selectedKeys().iterator();
+ while (iter.hasNext()) {
+ bufferMessages = ByteBuffer.allocate(1024);
+ bufferMessages.clear();
+ client = null;
+ SelectionKey key = iter.next();
+ iter.remove();
+
+ try {
+ switch (key.readyOps()) {
+ case OP_ACCEPT:
+ client = ((ServerSocketChannel) key.channel()).accept();
+ client.configureBlocking(false);
+ client.register(selector, OP_READ);
+ break;
+
+ case OP_READ:
+ client = (SocketChannel) key.channel();
+ if (client.read(bufferMessages) != -1) {
+ bufferMessages.flip();
+ String line = new String(bufferMessages.array(), bufferMessages.position(), bufferMessages.remaining());
+ System.out.println(line);
+ if (line.startsWith("MESSAGE")) {
+ SessionsService.getInstance().printAll();
+ Message msg = Message.toMessage(line);
+ proxy = new ProxyDispatcher(msg, client, bufferMessages);
+ threadPool.submit(proxy);
+ }
+
+ if (line.startsWith("CLOSE")) {
+ client.close();
+ } else if (line.startsWith("QUIT")) {
+ for (SelectionKey k : selector.keys()) {
+ k.cancel();
+ k.channel().close();
+ }
+ selector.close();
+ return;
+ }
+ } else {
+ key.cancel();
+ }
+ break;
+
+ default:
+ break;
+ }
+ } catch (IOException e) {
+ try {
+ client.close();
+ } catch (IOException e1) {
+ e1.printStackTrace();
+ }
+ }
+ }
+ }
+ }
}
\ No newline at end of file
diff --git a/Server/src/com/texttwist/server/components/NotificationServer.java b/Server/src/com/texttwist/server/services/NotificationService.java
similarity index 86%
rename from Server/src/com/texttwist/server/components/NotificationServer.java
rename to Server/src/com/texttwist/server/services/NotificationService.java
index 7ac298b..f630028 100644
--- a/Server/src/com/texttwist/server/components/NotificationServer.java
+++ b/Server/src/com/texttwist/server/services/NotificationService.java
@@ -1,62 +1,63 @@
-package com.texttwist.server.components;
-
-import interfaces.INotificationClient;
-import interfaces.INotificationServer;
-
-import javax.swing.*;
-import java.rmi.RemoteException;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-
-/**
- * Created by loke on 19/06/2017.
- */
-public class NotificationServer implements INotificationServer {
-
- private List clients;
- public NotificationServer() throws RemoteException {
- super();
- clients = new ArrayList<>();
- }
-
- public synchronized void registerForCallback(INotificationClient clientInterface) throws RemoteException {
- if(!clients.contains(clientInterface)){
- clients.add(clientInterface);
- System.out.println(clientInterface);
- System.out.println("New client registered");
- }
- }
-
- public synchronized void unregisterForCallback(INotificationClient client) throws RemoteException {
- if (clients.remove(client)) {
- System.out.println("Client unregistered");
- } else {
- System.out.println("Unable to unregister client");
- }
-
- }
-
- public synchronized void sendInvitations(String username, DefaultListModel users){
- Iterator i = clients.iterator();
- INotificationClient client = null;
- System.out.println("Starting callbacks");
- while (i.hasNext()) {
- client = (INotificationClient) i.next();
- try {
-
- System.out.println("SENDING INVITE TO "+users);
- client.sendInvite(username, users);
- } catch (RemoteException e) {
- System.out.println("Sembra down");
- try {
- unregisterForCallback(client);
- } catch (RemoteException e1) {
- e1.printStackTrace();
- }
- }
- }
-
- }
-}
+package com.texttwist.server.services;
+
+import interfaces.INotificationClient;
+import interfaces.INotificationServer;
+
+import javax.swing.*;
+import java.rmi.RemoteException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+
+/**
+ * Author: Lorenzo Iovino on 19/06/2017.
+ * Description: Jedis Service
+ */
+public class NotificationService implements INotificationServer {
+
+ private List clients;
+ public NotificationService() throws RemoteException {
+ super();
+ clients = new ArrayList<>();
+ }
+
+ public synchronized void registerForCallback(INotificationClient clientInterface) throws RemoteException {
+ if(!clients.contains(clientInterface)){
+ clients.add(clientInterface);
+ System.out.println(clientInterface);
+ System.out.println("New client registered");
+ }
+ }
+
+ public synchronized void unregisterForCallback(INotificationClient client) throws RemoteException {
+ if (clients.remove(client)) {
+ System.out.println("Client unregistered");
+ } else {
+ System.out.println("Unable to unregister client");
+ }
+
+ }
+
+ public synchronized void sendInvitations(String username, DefaultListModel users){
+ Iterator i = clients.iterator();
+ INotificationClient client = null;
+ System.out.println("Starting callbacks");
+ while (i.hasNext()) {
+ client = (INotificationClient) i.next();
+ try {
+
+ System.out.println("SENDING INVITE TO "+users);
+ client.sendInvite(username, users);
+ } catch (RemoteException e) {
+ System.out.println("Sembra down");
+ try {
+ unregisterForCallback(client);
+ } catch (RemoteException e1) {
+ e1.printStackTrace();
+ }
+ }
+ }
+
+ }
+}
diff --git a/Server/src/com/texttwist/server/services/SessionsService.java b/Server/src/com/texttwist/server/services/SessionsService.java
new file mode 100644
index 0000000..9489a99
--- /dev/null
+++ b/Server/src/com/texttwist/server/services/SessionsService.java
@@ -0,0 +1,77 @@
+package com.texttwist.server.services;
+import models.Session;
+import models.User;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
+
+/**
+ * Author: Lorenzo Iovino on 17/06/2017.
+ * Description: SessionsService. It is a singleton that provides the model and methods for manage sessions
+ */
+public class SessionsService {
+
+ private List sessions = Collections.synchronizedList(new ArrayList());
+
+ private static class Holder {
+ static final SessionsService INSTANCE = new SessionsService();
+ }
+
+ public static SessionsService getInstance() {
+ return Holder.INSTANCE;
+ }
+
+ private Session getSession(String userName) {
+ for (Session elem : sessions) {
+ if (elem.account.userName.equals(userName)) {
+ return elem;
+ }
+ }
+ return null;
+ }
+
+ public SessionsService(){}
+
+ public boolean add(String userName, String token) {
+ remove(userName);
+ return sessions.add(new Session(new User(userName,"",0), token));
+ }
+
+ public void printAll(){
+ for (Session elem : sessions) {
+ System.out.println(elem.account.userName + " | " + elem.token);
+ }
+ }
+
+ public boolean remove(String userName){
+ if(exists(userName)) {
+ Session s = getSession(userName);
+ if(s != null) {
+ sessions.remove(s);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public boolean exists(String userName) {
+ for (Session elem : sessions) {
+ if (elem.account.userName.equals(userName)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public boolean isValidToken(String token) {
+ for (Session session : sessions) {
+ if (session.token.equals(token)) {
+ return true;
+ }
+ }
+ return false;
+ }
+}
diff --git a/Server/src/com/texttwist/server/tasks/CheckOnlineUsers.java b/Server/src/com/texttwist/server/tasks/CheckOnlineUsers.java
index 4379a1e..46b66ba 100644
--- a/Server/src/com/texttwist/server/tasks/CheckOnlineUsers.java
+++ b/Server/src/com/texttwist/server/tasks/CheckOnlineUsers.java
@@ -1,12 +1,13 @@
package com.texttwist.server.tasks;
-import com.texttwist.server.components.SessionsManager;
+import com.texttwist.server.services.SessionsService;
import javax.swing.*;
import java.util.concurrent.Callable;
/**
- * Created by loke on 19/06/2017.
+ * Author: Lorenzo Iovino on 19/06/2017.
+ * Description: Jedis Service
*/
public class CheckOnlineUsers implements Callable {
private final DefaultListModel users;
@@ -18,7 +19,7 @@ public class CheckOnlineUsers implements Callable {
@Override
public Boolean call() throws Exception {
for(int i = 0; i < users.size(); i++){
- if(!(SessionsManager.getInstance().exists(users.get(i)))){
+ if(!(SessionsService.getInstance().exists(users.get(i)))){
return false;
}
}
diff --git a/Server/src/com/texttwist/server/tasks/ComputeHighscores.java b/Server/src/com/texttwist/server/tasks/ComputeHighscores.java
index 4f52a8c..4c143e2 100644
--- a/Server/src/com/texttwist/server/tasks/ComputeHighscores.java
+++ b/Server/src/com/texttwist/server/tasks/ComputeHighscores.java
@@ -1,17 +1,16 @@
package com.texttwist.server.tasks;
-import com.texttwist.server.components.AccountsManager;
-import com.texttwist.server.components.JedisService;
+import com.texttwist.server.services.AccountsService;
+import com.texttwist.server.services.JedisService;
import models.User;
import javax.swing.*;
-import java.util.ArrayList;
import java.util.Comparator;
-import java.util.List;
import java.util.concurrent.Callable;
/**
- * Created by loke on 28/06/2017.
+ * Author: Lorenzo Iovino on 28/06/2017.
+ * Description: Jedis Service
*/
public class ComputeHighscores implements Callable> {
@@ -21,16 +20,16 @@ public class ComputeHighscores implements Callable> {
public DefaultListModel call() throws Exception {
DefaultListModel l = new DefaultListModel<>();
- AccountsManager.getInstance().users.sort(new Comparator() {
+ AccountsService.getInstance().users.sort(new Comparator() {
@Override
public int compare(User o1, User o2) {
return o2.score.compareTo(o1.score);
}
});
JedisService.removeAll("users");
- for(int i =0; i< AccountsManager.getInstance().users.size(); i++){
- l.addElement(AccountsManager.getInstance().users.get(i).userName+":"+AccountsManager.getInstance().users.get(i).score);
- JedisService.add("users",AccountsManager.getInstance().users.get(i));
+ for(int i = 0; i< AccountsService.getInstance().users.size(); i++){
+ l.addElement(AccountsService.getInstance().users.get(i).userName+":"+ AccountsService.getInstance().users.get(i).score);
+ JedisService.add("users", AccountsService.getInstance().users.get(i));
}
return l;
}
diff --git a/Server/src/com/texttwist/server/tasks/ComputeScore.java b/Server/src/com/texttwist/server/tasks/ComputeScore.java
index 72a0762..6ea1ca0 100644
--- a/Server/src/com/texttwist/server/tasks/ComputeScore.java
+++ b/Server/src/com/texttwist/server/tasks/ComputeScore.java
@@ -1,26 +1,15 @@
package com.texttwist.server.tasks;
-import com.texttwist.client.App;
-import com.texttwist.server.components.AccountsManager;
-import com.texttwist.server.components.JedisService;
+import com.texttwist.server.services.AccountsService;
import com.texttwist.server.models.Dictionary;
import com.texttwist.server.models.Match;
-import constants.Config;
-import models.Message;
import models.User;
-import redis.clients.jedis.Jedis;
import javax.swing.*;
-import java.io.Serializable;
-import java.net.DatagramPacket;
-import java.net.InetAddress;
-import java.net.MulticastSocket;
-import java.util.List;
import java.util.concurrent.Callable;
-import static com.texttwist.server.components.GameServer.activeMatches;
-
/**
- * Created by loke on 27/06/2017.
+ * Author: Lorenzo Iovino on 27/06/2017.
+ * Description: Jedis Service
*/
public class ComputeScore implements Callable {
@@ -52,7 +41,7 @@ public class ComputeScore implements Callable {
match.setScore(sender, score);
System.out.println(score);
- User u = AccountsManager.getInstance().findUser(sender);
+ User u = AccountsService.getInstance().findUser(sender);
u.addScore(score);
if(match.allPlayersSendedHisScore()) {
@@ -61,7 +50,7 @@ public class ComputeScore implements Callable {
System.out.println("MATCH TIMEOUT CANCELLATO");
match.setUndefinedScorePlayersToZero();
- match.sendScores();
+ new SendScores(match).call();
}
return score;
diff --git a/Server/src/com/texttwist/server/tasks/GenerateLetters.java b/Server/src/com/texttwist/server/tasks/GenerateLetters.java
index a15d09e..a5a5394 100644
--- a/Server/src/com/texttwist/server/tasks/GenerateLetters.java
+++ b/Server/src/com/texttwist/server/tasks/GenerateLetters.java
@@ -1,16 +1,13 @@
package com.texttwist.server.tasks;
-import com.texttwist.server.components.GameServer;
+import com.texttwist.server.services.MessageService;
import javax.swing.*;
-import java.nio.ByteBuffer;
-import java.nio.channels.FileChannel;
-import java.nio.charset.Charset;
-import java.nio.file.*;
import java.util.concurrent.Callable;
/**
- * Created by loke on 25/06/2017.
+ * Author: Lorenzo Iovino on 25/06/2017.
+ * Description: Jedis Service
*/
public class GenerateLetters implements Callable> {
@@ -23,7 +20,7 @@ public class GenerateLetters implements Callable> {
public DefaultListModel call() throws Exception {
DefaultListModel l = new DefaultListModel();
- String word = GameServer.dict.getRandomWord(6, 7);
+ String word = MessageService.dict.getRandomWord(6, 7);
for (int i = 0;i < word.length(); i++){
l.addElement(String.valueOf(word.charAt(i)));
}
diff --git a/Server/src/com/texttwist/server/tasks/JoinMatch.java b/Server/src/com/texttwist/server/tasks/JoinMatch.java
index e931c13..84cf13c 100644
--- a/Server/src/com/texttwist/server/tasks/JoinMatch.java
+++ b/Server/src/com/texttwist/server/tasks/JoinMatch.java
@@ -5,10 +5,11 @@ import javafx.util.Pair;
import javax.swing.*;
import java.nio.channels.SocketChannel;
import java.util.concurrent.Callable;
-import static com.texttwist.server.components.GameServer.activeMatches;
+import static com.texttwist.server.services.MessageService.activeMatches;
/**
- * Created by loke on 23/06/2017.
+ * Author: Lorenzo Iovino on 23/06/2017.
+ * Description: Jedis Service
*/
public class JoinMatch implements Callable {
public final String matchName;
diff --git a/Server/src/com/texttwist/server/tasks/JoinTimeout.java b/Server/src/com/texttwist/server/tasks/JoinTimeout.java
index e188b29..cf0a0f9 100644
--- a/Server/src/com/texttwist/server/tasks/JoinTimeout.java
+++ b/Server/src/com/texttwist/server/tasks/JoinTimeout.java
@@ -17,13 +17,14 @@ public class JoinTimeout implements Callable {
@Override
public Boolean call() throws Exception {
try {
- Thread.currentThread().sleep(7*60*1000);
+ Thread.currentThread().sleep(1*60*1000);
System.out.println("TIMEOUTTTT");
if(match.joinTimeout) {
return false;
}
else {
+ match.joinTimeout=true;
return true;
}
} catch (InterruptedException e) {
diff --git a/Server/src/com/texttwist/server/tasks/MatchTimeout.java b/Server/src/com/texttwist/server/tasks/MatchTimeout.java
index f878e63..9e45b84 100644
--- a/Server/src/com/texttwist/server/tasks/MatchTimeout.java
+++ b/Server/src/com/texttwist/server/tasks/MatchTimeout.java
@@ -1,19 +1,13 @@
package com.texttwist.server.tasks;
-import com.sun.org.apache.xpath.internal.operations.Bool;
import com.texttwist.server.models.Match;
import constants.Config;
-import models.Message;
-import java.net.DatagramPacket;
-import java.net.InetAddress;
-import java.net.MulticastSocket;
import java.util.concurrent.Callable;
-import static com.texttwist.server.components.GameServer.activeMatches;
-
/**
- * Created by loke on 27/06/2017.
+ * Author: Lorenzo Iovino on 27/06/2017.
+ * Description: Jedis Service
*/
public class MatchTimeout implements Callable {
@@ -26,12 +20,12 @@ public class MatchTimeout implements Callable {
@Override
public Boolean call() throws Exception {
try {
- Thread.currentThread().sleep(5*60*1000); //TODO 5*60*1000
+ Thread.currentThread().sleep(Config.sendWordsTimeout);
match.setUndefinedScorePlayersToZero();
if(match.matchTimeout) {
System.out.println("SEND BROADCAST BECAUSE TIMEOUT");
- match.sendScores();
+ new SendScores(match).call();
return true;
}
return false;
diff --git a/Server/src/com/texttwist/server/tasks/ReceiveWords.java b/Server/src/com/texttwist/server/tasks/ReceiveWords.java
index cb5bbc1..c2786c8 100644
--- a/Server/src/com/texttwist/server/tasks/ReceiveWords.java
+++ b/Server/src/com/texttwist/server/tasks/ReceiveWords.java
@@ -1,6 +1,6 @@
package com.texttwist.server.tasks;
-import com.texttwist.server.components.SessionsManager;
+import com.texttwist.server.services.SessionsService;
import com.texttwist.server.models.Match;
import constants.Config;
import models.Message;
@@ -14,7 +14,8 @@ import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
- * Created by loke on 27/06/2017.
+ * Author: Lorenzo Iovino on 27/06/2017.
+ * Description: Jedis Service
*/
public class ReceiveWords implements Callable{
@@ -53,9 +54,9 @@ public class ReceiveWords implements Callable{
System.out.println(rcv);
if (rcv.startsWith("MESSAGE")) {
msg = Message.toMessage(rcv);
- if(SessionsManager.getInstance().isValidToken(msg.token)) {
+ if(SessionsService.getInstance().isValidToken(msg.token)) {
System.out.println(msg.sender);
- Match match = Match.findMatchByPlayer(msg.sender);
+ Match match = Match.findMatchByPlayerName(msg.sender);
threadPool.submit(new ComputeScore(msg.sender, msg.data, match));
} else {
threadPool.submit(new TokenInvalid(msg.sender, socketChannel, bufferMessages));
diff --git a/Server/src/com/texttwist/server/tasks/SendInvitations.java b/Server/src/com/texttwist/server/tasks/SendInvitations.java
index db1693c..7b05d97 100644
--- a/Server/src/com/texttwist/server/tasks/SendInvitations.java
+++ b/Server/src/com/texttwist/server/tasks/SendInvitations.java
@@ -1,19 +1,13 @@
package com.texttwist.server.tasks;
import com.texttwist.server.Server;
-import com.texttwist.server.components.NotificationServer;
-import com.texttwist.server.components.SessionsManager;
-import constants.Config;
-import interfaces.INotificationServer;
import javax.swing.*;
-import java.rmi.registry.LocateRegistry;
-import java.rmi.registry.Registry;
-import java.rmi.server.UnicastRemoteObject;
import java.util.concurrent.Callable;
/**
- * Created by loke on 19/06/2017.
+ * Author: Lorenzo Iovino on 19/06/2017.
+ * Description: Jedis Service
*/
public class SendInvitations implements Callable {
private DefaultListModel users;
diff --git a/Server/src/com/texttwist/server/tasks/SendMessageToAllPlayers.java b/Server/src/com/texttwist/server/tasks/SendMessageToAllPlayers.java
index 23c8775..96012cc 100644
--- a/Server/src/com/texttwist/server/tasks/SendMessageToAllPlayers.java
+++ b/Server/src/com/texttwist/server/tasks/SendMessageToAllPlayers.java
@@ -9,7 +9,8 @@ import java.nio.channels.SocketChannel;
import java.util.concurrent.Callable;
/**
- * Created by loke on 27/06/2017.
+ * Author: Lorenzo Iovino on 27/06/2017.
+ * Description: Jedis Service
*/
public class SendMessageToAllPlayers implements Callable {
diff --git a/Server/src/com/texttwist/server/tasks/SendScores.java b/Server/src/com/texttwist/server/tasks/SendScores.java
new file mode 100644
index 0000000..62ec42f
--- /dev/null
+++ b/Server/src/com/texttwist/server/tasks/SendScores.java
@@ -0,0 +1,46 @@
+package com.texttwist.server.tasks;
+
+import com.texttwist.server.models.Match;
+import constants.Config;
+import models.Message;
+
+import java.io.IOException;
+import java.net.DatagramPacket;
+import java.net.InetAddress;
+import java.net.MulticastSocket;
+import java.util.concurrent.Callable;
+
+import static com.texttwist.server.services.MessageService.activeMatches;
+
+/**
+ * Created by loke on 13/07/2017.
+ */
+public class SendScores implements Callable {
+
+ private Match match;
+
+ public SendScores(Match match){
+ this.match = match;
+ }
+
+ @Override
+ public Void call() throws Exception {
+
+ while (true) {
+ System.out.println("SENDING");
+ Message msg = new Message("FINALSCORE", "SERVER", "", match.getMatchPlayersScoreAsStringList());
+
+ MulticastSocket multicastSocket = null;
+ try {
+ multicastSocket = new MulticastSocket(match.multicastId);
+ InetAddress ia = InetAddress.getByName(Config.ScoreMulticastServerURI);
+ DatagramPacket hi = new DatagramPacket(msg.toString().getBytes(), msg.toString().length(), ia, match.multicastId);
+ multicastSocket.send(hi);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ activeMatches.remove(Match.findMatchIndex(activeMatches, match.matchCreator));
+ return null;
+ }
+ }
+}
diff --git a/Server/src/com/texttwist/server/tasks/TokenInvalid.java b/Server/src/com/texttwist/server/tasks/TokenInvalid.java
index 22245b2..b190c15 100644
--- a/Server/src/com/texttwist/server/tasks/TokenInvalid.java
+++ b/Server/src/com/texttwist/server/tasks/TokenInvalid.java
@@ -5,12 +5,12 @@ import models.Message;
import javax.swing.*;
import java.nio.ByteBuffer;
-import java.nio.channels.Channel;
import java.nio.channels.SocketChannel;
import java.util.concurrent.Callable;
/**
- * Created by loke on 11/07/2017.
+ * Author: Lorenzo Iovino on 11/07/2017.
+ * Description: Task: Token Invalid Service
*/
public class TokenInvalid implements Callable {
private String sender;
@@ -25,9 +25,8 @@ public class TokenInvalid implements Callable {
@Override
public Boolean call()throws Exception {
- System.out.print("TOKEN NON VALIDO");
- buffer = ByteBuffer.allocate(1024);
- Message msg = new Message("MATCH_NOT_AVAILABLE", "", null, new DefaultListModel<>());
+ Server.logger.write("TOKEN INVALID: TOKEN USED BY "+ sender+ " IS NOT VALID");
+ Message msg = new Message("TOKEN_NOT_VALID", "", null, new DefaultListModel<>());
buffer.clear();
byte[] byteMessage = msg.toString().getBytes();
buffer = ByteBuffer.wrap(byteMessage);
diff --git a/notificationServer.log b/notificationServer.log
index 3efbe52..1279a2c 100644
--- a/notificationServer.log
+++ b/notificationServer.log
@@ -1296,3 +1296,162 @@ LOGGER (Server): Thu Jul 13 03:30:57 CEST 2017 - Invoked login with username=asd
LOGGER (Server): Thu Jul 13 03:30:57 CEST 2017 - Login successfull
LOGGER (Server): Thu Jul 13 03:31:02 CEST 2017 - Invoked login with username=a AND password=a
LOGGER (Server): Thu Jul 13 03:31:02 CEST 2017 - Login successfull
+LOGGER (Server): Thu Jul 13 12:23:43 CEST 2017 - Services starting ...
+LOGGER (Server): Thu Jul 13 12:23:44 CEST 2017 - AuthService Service running at 9999 port...
+LOGGER (Server): Thu Jul 13 12:23:44 CEST 2017 - GameService Service is running at 10000 port...
+LOGGER (Server): Thu Jul 13 12:23:44 CEST 2017 - Services started correctly ...
+LOGGER (Server): Thu Jul 13 12:23:48 CEST 2017 - Invoked login with username=a AND password=a
+LOGGER (Server): Thu Jul 13 12:23:48 CEST 2017 - Login successfull
+LOGGER (Server): Thu Jul 13 12:23:51 CEST 2017 - Invoked login with username=b AND password=b
+LOGGER (Server): Thu Jul 13 12:23:51 CEST 2017 - Login successfull
+LOGGER (Server): Thu Jul 13 12:57:17 CEST 2017 - Services starting ...
+LOGGER (Server): Thu Jul 13 12:57:17 CEST 2017 - AuthService Service running at 9999 port...
+LOGGER (Server): Thu Jul 13 12:57:17 CEST 2017 - GameService Service is running at 10000 port...
+LOGGER (Server): Thu Jul 13 12:57:17 CEST 2017 - Services started correctly ...
+LOGGER (Server): Thu Jul 13 12:57:23 CEST 2017 - Invoked login with username=a AND password=a
+LOGGER (Server): Thu Jul 13 12:57:23 CEST 2017 - Login successfull
+LOGGER (Server): Thu Jul 13 12:57:26 CEST 2017 - Invoked login with username=b AND password=b
+LOGGER (Server): Thu Jul 13 12:57:26 CEST 2017 - Login successfull
+LOGGER (Server): Thu Jul 13 13:02:35 CEST 2017 - Services starting ...
+LOGGER (Server): Thu Jul 13 13:02:36 CEST 2017 - AuthService Service running at 9999 port...
+LOGGER (Server): Thu Jul 13 13:02:36 CEST 2017 - GameService Service is running at 10000 port...
+LOGGER (Server): Thu Jul 13 13:02:36 CEST 2017 - Services started correctly ...
+LOGGER (Server): Thu Jul 13 13:02:41 CEST 2017 - Invoked login with username=a AND password=a
+LOGGER (Server): Thu Jul 13 13:02:42 CEST 2017 - Login successfull
+LOGGER (Server): Thu Jul 13 13:02:44 CEST 2017 - Invoked login with username=b AND password=b
+LOGGER (Server): Thu Jul 13 13:02:44 CEST 2017 - Login successfull
+LOGGER (Server): Thu Jul 13 13:04:46 CEST 2017 - Services starting ...
+LOGGER (Server): Thu Jul 13 13:04:46 CEST 2017 - AuthService Service running at 9999 port...
+LOGGER (Server): Thu Jul 13 13:04:46 CEST 2017 - Services started correctly ...
+LOGGER (Server): Thu Jul 13 13:04:46 CEST 2017 - GameService Service is running at 10000 port...
+LOGGER (Server): Thu Jul 13 13:04:51 CEST 2017 - Invoked login with username=a AND password=a
+LOGGER (Server): Thu Jul 13 13:04:51 CEST 2017 - Login successfull
+LOGGER (Server): Thu Jul 13 13:04:54 CEST 2017 - Invoked login with username=b AND password=b
+LOGGER (Server): Thu Jul 13 13:04:54 CEST 2017 - Login successfull
+LOGGER (Server): Thu Jul 13 13:05:29 CEST 2017 - Services starting ...
+LOGGER (Server): Thu Jul 13 13:05:29 CEST 2017 - AuthService Service running at 9999 port...
+LOGGER (Server): Thu Jul 13 13:05:29 CEST 2017 - Services started correctly ...
+LOGGER (Server): Thu Jul 13 13:05:29 CEST 2017 - GameService Service is running at 10000 port...
+LOGGER (Server): Thu Jul 13 13:05:36 CEST 2017 - Invoked login with username=a AND password=a
+LOGGER (Server): Thu Jul 13 13:05:36 CEST 2017 - Login successfull
+LOGGER (Server): Thu Jul 13 13:05:38 CEST 2017 - Invoked login with username=b AND password=b
+LOGGER (Server): Thu Jul 13 13:05:38 CEST 2017 - Login successfull
+LOGGER (Server): Thu Jul 13 13:09:00 CEST 2017 - Services starting ...
+LOGGER (Server): Thu Jul 13 13:09:00 CEST 2017 - AuthService Service running at 9999 port...
+LOGGER (Server): Thu Jul 13 13:09:01 CEST 2017 - Services started correctly ...
+LOGGER (Server): Thu Jul 13 13:09:01 CEST 2017 - GameService Service is running at 10000 port...
+LOGGER (Server): Thu Jul 13 13:09:04 CEST 2017 - Invoked login with username=a AND password=a
+LOGGER (Server): Thu Jul 13 13:09:04 CEST 2017 - Login successfull
+LOGGER (Server): Thu Jul 13 13:09:07 CEST 2017 - Invoked login with username=b AND password=b
+LOGGER (Server): Thu Jul 13 13:09:07 CEST 2017 - Login successfull
+LOGGER (Server): Thu Jul 13 13:10:10 CEST 2017 - Services starting ...
+LOGGER (Server): Thu Jul 13 13:10:10 CEST 2017 - AuthService Service running at 9999 port...
+LOGGER (Server): Thu Jul 13 13:10:10 CEST 2017 - Services started correctly ...
+LOGGER (Server): Thu Jul 13 13:10:10 CEST 2017 - GameService Service is running at 10000 port...
+LOGGER (Server): Thu Jul 13 13:10:15 CEST 2017 - Invoked login with username=a AND password=a
+LOGGER (Server): Thu Jul 13 13:10:15 CEST 2017 - Login successfull
+LOGGER (Server): Thu Jul 13 13:10:17 CEST 2017 - Invoked login with username=b AND password=b
+LOGGER (Server): Thu Jul 13 13:10:17 CEST 2017 - Login successfull
+LOGGER (Server): Thu Jul 13 13:13:01 CEST 2017 - Services starting ...
+LOGGER (Server): Thu Jul 13 13:13:01 CEST 2017 - AuthService Service running at 9999 port...
+LOGGER (Server): Thu Jul 13 13:13:01 CEST 2017 - Services started correctly ...
+LOGGER (Server): Thu Jul 13 13:13:01 CEST 2017 - GameService Service is running at 10000 port...
+LOGGER (Server): Thu Jul 13 13:13:06 CEST 2017 - Invoked login with username=a AND password=a
+LOGGER (Server): Thu Jul 13 13:13:06 CEST 2017 - Login successfull
+LOGGER (Server): Thu Jul 13 13:13:08 CEST 2017 - Invoked login with username=b AND password=b
+LOGGER (Server): Thu Jul 13 13:13:08 CEST 2017 - Login successfull
+LOGGER (Server): Thu Jul 13 13:14:51 CEST 2017 - Services starting ...
+LOGGER (Server): Thu Jul 13 13:14:51 CEST 2017 - AuthService Service running at 9999 port...
+LOGGER (Server): Thu Jul 13 13:14:51 CEST 2017 - Services started correctly ...
+LOGGER (Server): Thu Jul 13 13:14:51 CEST 2017 - GameService Service is running at 10000 port...
+LOGGER (Server): Thu Jul 13 13:14:56 CEST 2017 - Invoked login with username=a AND password=a
+LOGGER (Server): Thu Jul 13 13:14:56 CEST 2017 - Login successfull
+LOGGER (Server): Thu Jul 13 13:14:58 CEST 2017 - Invoked login with username=b AND password=b
+LOGGER (Server): Thu Jul 13 13:14:58 CEST 2017 - Login successfull
+LOGGER (Server): Thu Jul 13 13:15:47 CEST 2017 - Services starting ...
+LOGGER (Server): Thu Jul 13 13:15:47 CEST 2017 - AuthService Service running at 9999 port...
+LOGGER (Server): Thu Jul 13 13:15:47 CEST 2017 - Services started correctly ...
+LOGGER (Server): Thu Jul 13 13:15:47 CEST 2017 - GameService Service is running at 10000 port...
+LOGGER (Server): Thu Jul 13 13:15:51 CEST 2017 - Invoked login with username=a AND password=a
+LOGGER (Server): Thu Jul 13 13:15:51 CEST 2017 - Login successfull
+LOGGER (Server): Thu Jul 13 13:15:53 CEST 2017 - Invoked logout with username=a AND token=8e462nrn7or1750ik15gsm1ha2
+LOGGER (Server): Thu Jul 13 13:15:53 CEST 2017 - Logout successfull
+LOGGER (Server): Thu Jul 13 13:15:53 CEST 2017 - Logout successfull (but something gone wrong)
+LOGGER (Server): Thu Jul 13 13:15:55 CEST 2017 - Invoked login with username=b AND password=b
+LOGGER (Server): Thu Jul 13 13:15:55 CEST 2017 - Login successfull
+LOGGER (Server): Thu Jul 13 13:16:02 CEST 2017 - Invoked login with username=a AND password=a
+LOGGER (Server): Thu Jul 13 13:16:02 CEST 2017 - Login successfull
+LOGGER (Server): Thu Jul 13 13:19:30 CEST 2017 - Services starting ...
+LOGGER (Server): Thu Jul 13 13:19:30 CEST 2017 - AuthService Service running at 9999 port...
+LOGGER (Server): Thu Jul 13 13:19:30 CEST 2017 - Services started correctly ...
+LOGGER (Server): Thu Jul 13 13:19:30 CEST 2017 - GameService Service is running at 10000 port...
+LOGGER (Server): Thu Jul 13 13:19:35 CEST 2017 - Invoked login with username=a AND password=a
+LOGGER (Server): Thu Jul 13 13:19:35 CEST 2017 - Login successfull
+LOGGER (Server): Thu Jul 13 13:19:37 CEST 2017 - Invoked login with username=b AND password=b
+LOGGER (Server): Thu Jul 13 13:19:37 CEST 2017 - Login successfull
+LOGGER (Server): Thu Jul 13 13:53:43 CEST 2017 - Services starting ...
+LOGGER (Server): Thu Jul 13 13:53:43 CEST 2017 - AuthService Service running at 9999 port...
+LOGGER (Server): Thu Jul 13 13:53:43 CEST 2017 - Services started correctly ...
+LOGGER (Server): Thu Jul 13 13:53:43 CEST 2017 - GameService Service is running at 10000 port...
+LOGGER (Server): Thu Jul 13 13:53:49 CEST 2017 - Invoked login with username=a AND password=a
+LOGGER (Server): Thu Jul 13 13:53:49 CEST 2017 - Login successfull
+LOGGER (Server): Thu Jul 13 13:53:52 CEST 2017 - Invoked login with username=b AND password=b
+LOGGER (Server): Thu Jul 13 13:53:52 CEST 2017 - Login successfull
+LOGGER (Server): Thu Jul 13 13:59:25 CEST 2017 - Services starting ...
+LOGGER (Server): Thu Jul 13 13:59:25 CEST 2017 - AuthService Service running at 9999 port...
+LOGGER (Server): Thu Jul 13 13:59:25 CEST 2017 - Services started correctly ...
+LOGGER (Server): Thu Jul 13 13:59:25 CEST 2017 - GameService Service is running at 10000 port...
+LOGGER (Server): Thu Jul 13 13:59:37 CEST 2017 - Invoked login with username=a AND password=a
+LOGGER (Server): Thu Jul 13 13:59:37 CEST 2017 - Login successfull
+LOGGER (Server): Thu Jul 13 13:59:41 CEST 2017 - Invoked login with username=b AND password=b
+LOGGER (Server): Thu Jul 13 13:59:41 CEST 2017 - Login successfull
+LOGGER (Server): Thu Jul 13 13:59:46 CEST 2017 - Invoked login with username=asd AND password=sad
+LOGGER (Server): Thu Jul 13 13:59:46 CEST 2017 - Login unsuccessfull
+LOGGER (Server): Thu Jul 13 13:59:50 CEST 2017 - Invoked login with username=asd AND password=asd
+LOGGER (Server): Thu Jul 13 13:59:50 CEST 2017 - Login successfull
+LOGGER (Server): Thu Jul 13 13:59:55 CEST 2017 - Invoked login with username=dd AND password=dd
+LOGGER (Server): Thu Jul 13 13:59:55 CEST 2017 - Login successfull
+LOGGER (Server): Thu Jul 13 14:01:58 CEST 2017 - Invoked register with username=ss AND password=ss
+LOGGER (Server): Thu Jul 13 14:01:58 CEST 2017 - Registration successfull
+LOGGER (Server): Thu Jul 13 14:02:00 CEST 2017 - Invoked login with username=ss AND password=ss
+LOGGER (Server): Thu Jul 13 14:02:00 CEST 2017 - Login successfull
+LOGGER (Server): Thu Jul 13 14:02:05 CEST 2017 - Invoked register with username=aa AND password=aa
+LOGGER (Server): Thu Jul 13 14:02:05 CEST 2017 - Registration successfull
+LOGGER (Server): Thu Jul 13 14:02:08 CEST 2017 - Invoked login with username=aa AND password=aa
+LOGGER (Server): Thu Jul 13 14:02:08 CEST 2017 - Login successfull
+LOGGER (Server): Thu Jul 13 14:02:43 CEST 2017 - Services starting ...
+LOGGER (Server): Thu Jul 13 14:02:44 CEST 2017 - AuthService Service running at 9999 port...
+LOGGER (Server): Thu Jul 13 14:02:44 CEST 2017 - Services started correctly ...
+LOGGER (Server): Thu Jul 13 14:02:44 CEST 2017 - GameService Service is running at 10000 port...
+LOGGER (Server): Thu Jul 13 14:03:08 CEST 2017 - Invoked login with username=a AND password=a
+LOGGER (Server): Thu Jul 13 14:03:08 CEST 2017 - Login successfull
+LOGGER (Server): Thu Jul 13 14:03:10 CEST 2017 - Invoked login with username=b AND password=b
+LOGGER (Server): Thu Jul 13 14:03:10 CEST 2017 - Login successfull
+LOGGER (Server): Thu Jul 13 14:03:12 CEST 2017 - Invoked login with username=asd AND password=asd
+LOGGER (Server): Thu Jul 13 14:03:12 CEST 2017 - Login successfull
+LOGGER (Server): Thu Jul 13 14:03:14 CEST 2017 - Invoked login with username=dd AND password=dd
+LOGGER (Server): Thu Jul 13 14:03:14 CEST 2017 - Login successfull
+LOGGER (Server): Thu Jul 13 14:10:29 CEST 2017 - Services starting ...
+LOGGER (Server): Thu Jul 13 14:10:29 CEST 2017 - AuthService Service running at 9999 port...
+LOGGER (Server): Thu Jul 13 14:10:30 CEST 2017 - Services started correctly ...
+LOGGER (Server): Thu Jul 13 14:10:30 CEST 2017 - GameService Service is running at 10000 port...
+LOGGER (Server): Thu Jul 13 14:10:34 CEST 2017 - Invoked login with username=a AND password=a
+LOGGER (Server): Thu Jul 13 14:10:34 CEST 2017 - Login successfull
+LOGGER (Server): Thu Jul 13 14:10:40 CEST 2017 - Invoked login with username=b AND password=b
+LOGGER (Server): Thu Jul 13 14:10:40 CEST 2017 - Login successfull
+LOGGER (Server): Thu Jul 13 14:10:45 CEST 2017 - Invoked login with username=dd AND password=dd
+LOGGER (Server): Thu Jul 13 14:10:45 CEST 2017 - Login successfull
+LOGGER (Server): Thu Jul 13 14:10:49 CEST 2017 - Invoked login with username=asd AND password=asd
+LOGGER (Server): Thu Jul 13 14:10:49 CEST 2017 - Login successfull
+LOGGER (Server): Thu Jul 13 14:14:11 CEST 2017 - Services starting ...
+LOGGER (Server): Thu Jul 13 14:14:11 CEST 2017 - AuthService Service running at 9999 port...
+LOGGER (Server): Thu Jul 13 14:14:11 CEST 2017 - Services started correctly ...
+LOGGER (Server): Thu Jul 13 14:14:11 CEST 2017 - GameService Service is running at 10000 port...
+LOGGER (Server): Thu Jul 13 14:14:24 CEST 2017 - Invoked login with username=a AND password=a
+LOGGER (Server): Thu Jul 13 14:14:24 CEST 2017 - Login successfull
+LOGGER (Server): Thu Jul 13 14:14:26 CEST 2017 - Invoked login with username=b AND password=b
+LOGGER (Server): Thu Jul 13 14:14:26 CEST 2017 - Login successfull
+LOGGER (Server): Thu Jul 13 14:14:30 CEST 2017 - Invoked login with username=asd AND password=asd
+LOGGER (Server): Thu Jul 13 14:14:30 CEST 2017 - Login successfull
+LOGGER (Server): Thu Jul 13 14:14:36 CEST 2017 - Invoked login with username=dd AND password=dd
+LOGGER (Server): Thu Jul 13 14:14:36 CEST 2017 - Login successfull