From 5117b28e2cd298d6827fc073626d874e946b22a5 Mon Sep 17 00:00:00 2001 From: Lorenzo Iovino Date: Thu, 13 Jul 2017 14:17:32 +0200 Subject: [PATCH] non funziona --- .idea/workspace.xml | 1432 ++++++++--------- Client/src/com/texttwist/client/App.java | 2 +- .../com/texttwist/client/pages/GamePage.java | 2 +- Commons/src/constants/Config.java | 9 +- Server/src/com/texttwist/server/Main.java | 11 +- Server/src/com/texttwist/server/Server.java | 79 +- .../server/components/SessionsManager.java | 88 - .../texttwist/server/models/Dictionary.java | 26 +- .../com/texttwist/server/models/Match.java | 161 +- .../ProxyDispatcher.java} | 435 +++-- .../AccountsService.java} | 159 +- .../Auth.java => services/AuthService.java} | 167 +- .../JedisService.java | 6 +- .../MessageService.java} | 277 ++-- .../NotificationService.java} | 125 +- .../server/services/SessionsService.java | 77 + .../server/tasks/CheckOnlineUsers.java | 7 +- .../server/tasks/ComputeHighscores.java | 17 +- .../texttwist/server/tasks/ComputeScore.java | 21 +- .../server/tasks/GenerateLetters.java | 11 +- .../com/texttwist/server/tasks/JoinMatch.java | 5 +- .../texttwist/server/tasks/JoinTimeout.java | 3 +- .../texttwist/server/tasks/MatchTimeout.java | 14 +- .../texttwist/server/tasks/ReceiveWords.java | 9 +- .../server/tasks/SendInvitations.java | 10 +- .../server/tasks/SendMessageToAllPlayers.java | 3 +- .../texttwist/server/tasks/SendScores.java | 46 + .../texttwist/server/tasks/TokenInvalid.java | 9 +- notificationServer.log | 159 ++ 29 files changed, 1707 insertions(+), 1663 deletions(-) delete mode 100644 Server/src/com/texttwist/server/components/SessionsManager.java rename Server/src/com/texttwist/server/{components/ThreadProxy.java => servers/ProxyDispatcher.java} (92%) rename Server/src/com/texttwist/server/{components/AccountsManager.java => services/AccountsService.java} (80%) rename Server/src/com/texttwist/server/{components/Auth.java => services/AuthService.java} (79%) rename Server/src/com/texttwist/server/{components => services}/JedisService.java (95%) rename Server/src/com/texttwist/server/{components/GameServer.java => services/MessageService.java} (90%) rename Server/src/com/texttwist/server/{components/NotificationServer.java => services/NotificationService.java} (86%) create mode 100644 Server/src/com/texttwist/server/services/SessionsService.java create mode 100644 Server/src/com/texttwist/server/tasks/SendScores.java 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 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -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