Compare commits
1 commit
master
...
alternativ
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
04f900c389 |
22 changed files with 1278 additions and 1456 deletions
1182
.idea/workspace.xml
generated
1182
.idea/workspace.xml
generated
File diff suppressed because it is too large
Load diff
|
|
@ -141,7 +141,7 @@ public class GamePage extends Page {
|
|||
return null;
|
||||
}
|
||||
}),
|
||||
Config.timeoutGame
|
||||
Config.gameTimeout
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
|
|
|
|||
|
|
@ -1,13 +1,13 @@
|
|||
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();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 AuthService 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 ");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
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;
|
||||
|
|
@ -11,12 +11,11 @@ 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.
|
||||
|
|
@ -155,7 +154,7 @@ public class Match {
|
|||
|
||||
|
||||
private int generateMulticastId(){
|
||||
return GameServer.multicastID++;
|
||||
return MessageService.multicastID++;
|
||||
}
|
||||
public void setLetters(DefaultListModel<String> letters){
|
||||
this.letters = letters;
|
||||
|
|
|
|||
|
|
@ -1,221 +1,213 @@
|
|||
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<Boolean> {
|
||||
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<Boolean> onlineUsers = threadPool.submit(new CheckOnlineUsers(request.data));
|
||||
try {
|
||||
Boolean usersOnline = onlineUsers.get();
|
||||
if(usersOnline){
|
||||
Future<Boolean> 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<String> matchName = new DefaultListModel<>();
|
||||
matchName.addElement(request.sender);
|
||||
|
||||
Future<Boolean> 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<Boolean> joinTimeout = threadPool.submit(new JoinTimeout(match));
|
||||
joinTimeout.get();
|
||||
if(match.joinTimeout){
|
||||
Future<Boolean> 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<DefaultListModel<String>> computeHighscores = threadPool.submit(new ComputeHighscores());
|
||||
try {
|
||||
DefaultListModel<String> 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<Boolean> 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<DefaultListModel<String>> 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.models.servers;
|
||||
|
||||
import com.texttwist.server.models.Match;
|
||||
import com.texttwist.server.services.SessionsService;
|
||||
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;
|
||||
|
||||
/**
|
||||
* Created by loke on 18/06/2017.
|
||||
*/
|
||||
public class ThreadProxy implements Callable<Boolean> {
|
||||
protected final ExecutorService threadPool = Executors.newCachedThreadPool();
|
||||
private final Message request;
|
||||
private final SocketChannel socketChannel;
|
||||
private ByteBuffer bufferMessage;
|
||||
boolean matchNotAvailable =false;
|
||||
|
||||
|
||||
public 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(SessionsService.getInstance().isValidToken(request.token)){
|
||||
switch(request.message){
|
||||
case "START_GAME":
|
||||
Future<Boolean> onlineUsers = threadPool.submit(new CheckOnlineUsers(request.data));
|
||||
try {
|
||||
Boolean usersOnline = onlineUsers.get();
|
||||
if(usersOnline){
|
||||
Future<Boolean> 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<String> matchName = new DefaultListModel<>();
|
||||
matchName.addElement(request.sender);
|
||||
|
||||
Future<Boolean> 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<Boolean> joinTimeout = threadPool.submit(new JoinTimeout(match));
|
||||
joinTimeout.get();
|
||||
if(match.joinTimeout){
|
||||
Future<Boolean> 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<DefaultListModel<String>> computeHighscores = threadPool.submit(new ComputeHighscores());
|
||||
try {
|
||||
DefaultListModel<String> 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<Boolean> 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<DefaultListModel<String>> 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;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,79 +1,79 @@
|
|||
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<User> users = Collections.synchronizedList(new ArrayList<User>());
|
||||
|
||||
private static class Holder {
|
||||
static final AccountsManager INSTANCE = new AccountsManager();
|
||||
}
|
||||
|
||||
public static AccountsManager getInstance() {
|
||||
return AccountsManager.Holder.INSTANCE;
|
||||
}
|
||||
|
||||
private AccountsManager(){
|
||||
List<Serializable> l = JedisService.get("users");
|
||||
for(int i=0; i<l.size(); i++) {
|
||||
users.add((User) l.get(i));
|
||||
}
|
||||
}
|
||||
|
||||
public boolean register(String userName, String password) {
|
||||
if(!exists(userName)){
|
||||
User newUser = new User(userName, password,0);
|
||||
Boolean res = users.add(newUser);
|
||||
JedisService.add("users", newUser);
|
||||
return res;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public boolean exists(String userName) {
|
||||
Iterator<User> i = users.iterator();
|
||||
while (i.hasNext()) {
|
||||
if (i.next().userName.equals(userName)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
public boolean checkPassword(String userName, String password) {
|
||||
Iterator<User> 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<User> 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.*;
|
||||
|
||||
|
||||
/**
|
||||
* Created by loke on 18/06/2017.
|
||||
*/
|
||||
public class AccountsService {
|
||||
|
||||
public List<User> users = Collections.synchronizedList(new ArrayList<User>());
|
||||
|
||||
private static class Holder {
|
||||
static final AccountsService INSTANCE = new AccountsService();
|
||||
}
|
||||
|
||||
public static AccountsService getInstance() {
|
||||
return AccountsService.Holder.INSTANCE;
|
||||
}
|
||||
|
||||
private AccountsService(){
|
||||
List<Serializable> l = JedisService.get("users");
|
||||
for(int i=0; i<l.size(); i++) {
|
||||
users.add((User) l.get(i));
|
||||
}
|
||||
}
|
||||
|
||||
public boolean register(String userName, String password) {
|
||||
if(!exists(userName)){
|
||||
User newUser = new User(userName, password,0);
|
||||
Boolean res = users.add(newUser);
|
||||
JedisService.add("users", newUser);
|
||||
return res;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public boolean exists(String userName) {
|
||||
Iterator<User> i = users.iterator();
|
||||
while (i.hasNext()) {
|
||||
if (i.next().userName.equals(userName)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
public boolean checkPassword(String userName, String password) {
|
||||
Iterator<User> 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<User> 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();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,83 +1,83 @@
|
|||
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("<html><center>Registration unsuccessfull: <br/> Username exist!</center></html>", 400, null);
|
||||
}
|
||||
}
|
||||
return new Response("<html><center>Registration unsuccessfull! <br/> All fields are mandatories</center></html>", 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;
|
||||
|
||||
/**
|
||||
* Created by loke on 15/06/2017.
|
||||
*/
|
||||
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("<html><center>Registration unsuccessfull: <br/> Username exist!</center></html>", 400, null);
|
||||
}
|
||||
}
|
||||
return new Response("<html><center>Registration unsuccessfull! <br/> All fields are mandatories</center></html>", 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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -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;
|
||||
|
|
@ -1,138 +1,136 @@
|
|||
|
||||
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<Match> 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<SelectionKey> 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.models.Dictionary;
|
||||
import com.texttwist.server.models.Match;
|
||||
import com.texttwist.server.models.servers.ThreadProxy;
|
||||
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;
|
||||
|
||||
public class MessageService 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<Match> activeMatches = Collections.synchronizedList(new ArrayList<>());
|
||||
public static Integer multicastID = 30000;
|
||||
|
||||
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("MessageService 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<SelectionKey> 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 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,62 +1,62 @@
|
|||
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<INotificationClient> 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<String> 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;
|
||||
|
||||
|
||||
/**
|
||||
* Created by loke on 19/06/2017.
|
||||
*/
|
||||
public class NotificationService implements INotificationServer {
|
||||
|
||||
private List<INotificationClient> 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<String> 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -1,88 +1,87 @@
|
|||
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<Session> sessions = Collections.synchronizedList(new ArrayList<Session>());
|
||||
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<Session> 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<Session> 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<Session> 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<Session> i = sessions.iterator();
|
||||
while (i.hasNext()) {
|
||||
if (i.next().token.equals(token)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
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;
|
||||
|
||||
/**
|
||||
* Created by loke on 17/06/2017.
|
||||
*/
|
||||
public class SessionsService {
|
||||
|
||||
private List<Session> sessions = Collections.synchronizedList(new ArrayList<Session>());
|
||||
private static class Holder {
|
||||
static final SessionsService INSTANCE = new SessionsService();
|
||||
}
|
||||
|
||||
public static SessionsService getInstance() {
|
||||
return Holder.INSTANCE;
|
||||
}
|
||||
|
||||
private SessionsService(){}
|
||||
|
||||
public boolean add(String userName, String token) {
|
||||
remove(userName);
|
||||
return sessions.add(new Session(new User(userName,"",0), token));
|
||||
}
|
||||
|
||||
public void printAll(){
|
||||
Iterator<Session> 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<Session> 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<Session> 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<Session> i = sessions.iterator();
|
||||
while (i.hasNext()) {
|
||||
if (i.next().token.equals(token)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
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;
|
||||
|
|
@ -18,7 +18,7 @@ public class CheckOnlineUsers implements Callable<Boolean> {
|
|||
@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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,13 +1,11 @@
|
|||
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;
|
||||
|
||||
/**
|
||||
|
|
@ -21,16 +19,16 @@ public class ComputeHighscores implements Callable<DefaultListModel<String>> {
|
|||
public DefaultListModel<String> call() throws Exception {
|
||||
DefaultListModel<String> l = new DefaultListModel<>();
|
||||
|
||||
AccountsManager.getInstance().users.sort(new Comparator<User>() {
|
||||
AccountsService.getInstance().users.sort(new Comparator<User>() {
|
||||
@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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,24 +1,12 @@
|
|||
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.
|
||||
*/
|
||||
|
|
@ -52,7 +40,7 @@ public class ComputeScore implements Callable<Integer> {
|
|||
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()) {
|
||||
|
|
|
|||
|
|
@ -1,12 +1,8 @@
|
|||
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;
|
||||
|
||||
/**
|
||||
|
|
@ -23,7 +19,7 @@ public class GenerateLetters implements Callable<DefaultListModel<String>> {
|
|||
public DefaultListModel<String> call() throws Exception {
|
||||
DefaultListModel<String> l = new DefaultListModel<String>();
|
||||
|
||||
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)));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ 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.
|
||||
|
|
|
|||
|
|
@ -1,17 +1,9 @@
|
|||
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.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
@ -53,7 +53,7 @@ public class ReceiveWords implements Callable<Boolean>{
|
|||
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);
|
||||
threadPool.submit(new ComputeScore(msg.sender, msg.data, match));
|
||||
|
|
|
|||
|
|
@ -1,15 +1,8 @@
|
|||
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;
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -1296,3 +1296,51 @@ 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 14:22:29 CEST 2017 - Server starting ...
|
||||
LOGGER (Server): Thu Jul 13 14:22:30 CEST 2017 - Auth Service running at 9999 port...
|
||||
LOGGER (Server): Thu Jul 13 14:22:30 CEST 2017 - GameService Service is running at 10000 port...
|
||||
LOGGER (Server): Thu Jul 13 14:22:30 CEST 2017 - Server started
|
||||
LOGGER (Server): Thu Jul 13 14:22:35 CEST 2017 - Invoked login with username=a AND password=a
|
||||
LOGGER (Server): Thu Jul 13 14:22:35 CEST 2017 - Login successfull
|
||||
LOGGER (Server): Thu Jul 13 14:22:39 CEST 2017 - Invoked login with username=b AND password=b
|
||||
LOGGER (Server): Thu Jul 13 14:22:39 CEST 2017 - Login successfull
|
||||
LOGGER (Server): Thu Jul 13 14:22:46 CEST 2017 - Invoked login with username=dd AND password=dd
|
||||
LOGGER (Server): Thu Jul 13 14:22:46 CEST 2017 - Login successfull
|
||||
LOGGER (Server): Thu Jul 13 14:22:50 CEST 2017 - Invoked login with username=asd AND password=asd
|
||||
LOGGER (Server): Thu Jul 13 14:22:50 CEST 2017 - Login successfull
|
||||
LOGGER (Server): Thu Jul 13 14:23:30 CEST 2017 - Server starting ...
|
||||
LOGGER (Server): Thu Jul 13 14:23:31 CEST 2017 - Auth Service running at 9999 port...
|
||||
LOGGER (Server): Thu Jul 13 14:23:31 CEST 2017 - GameService Service is running at 10000 port...
|
||||
LOGGER (Server): Thu Jul 13 14:23:31 CEST 2017 - Server started
|
||||
LOGGER (Server): Thu Jul 13 14:23:40 CEST 2017 - Invoked login with username=asd AND password=asd
|
||||
LOGGER (Server): Thu Jul 13 14:23:40 CEST 2017 - Login successfull
|
||||
LOGGER (Server): Thu Jul 13 14:23:43 CEST 2017 - Invoked login with username=a AND password=a
|
||||
LOGGER (Server): Thu Jul 13 14:23:43 CEST 2017 - Login successfull
|
||||
LOGGER (Server): Thu Jul 13 14:23:49 CEST 2017 - Invoked login with username=b AND password=b
|
||||
LOGGER (Server): Thu Jul 13 14:23:49 CEST 2017 - Login successfull
|
||||
LOGGER (Server): Thu Jul 13 14:23:55 CEST 2017 - Invoked login with username=dd AND password=dd
|
||||
LOGGER (Server): Thu Jul 13 14:23:55 CEST 2017 - Login successfull
|
||||
LOGGER (Server): Thu Jul 13 14:28:32 CEST 2017 - Server starting ...
|
||||
LOGGER (Server): Thu Jul 13 14:28:33 CEST 2017 - Auth Service running at 9999 port...
|
||||
LOGGER (Server): Thu Jul 13 14:28:33 CEST 2017 - GameService Service is running at 10000 port...
|
||||
LOGGER (Server): Thu Jul 13 14:28:33 CEST 2017 - Server started
|
||||
LOGGER (Server): Thu Jul 13 14:28:43 CEST 2017 - Invoked login with username=a AND password=a
|
||||
LOGGER (Server): Thu Jul 13 14:28:43 CEST 2017 - Login successfull
|
||||
LOGGER (Server): Thu Jul 13 14:28:46 CEST 2017 - Invoked login with username=b AND password=b
|
||||
LOGGER (Server): Thu Jul 13 14:28:46 CEST 2017 - Login successfull
|
||||
LOGGER (Server): Thu Jul 13 14:28:49 CEST 2017 - Invoked login with username=dd AND password=dd
|
||||
LOGGER (Server): Thu Jul 13 14:28:49 CEST 2017 - Login successfull
|
||||
LOGGER (Server): Thu Jul 13 14:28:54 CEST 2017 - Invoked login with username=asd AND password=asd
|
||||
LOGGER (Server): Thu Jul 13 14:28:54 CEST 2017 - Login successfull
|
||||
LOGGER (Server): Thu Jul 13 14:37:57 CEST 2017 - Services starting ...
|
||||
LOGGER (Server): Thu Jul 13 14:37:57 CEST 2017 - AuthService Service running at 9999 port...
|
||||
LOGGER (Server): Thu Jul 13 14:37:57 CEST 2017 - Services started correctly ...
|
||||
LOGGER (Server): Thu Jul 13 14:37:57 CEST 2017 - MessageService Service is running at 10000 port...
|
||||
LOGGER (Server): Thu Jul 13 14:38:06 CEST 2017 - Invoked login with username=asd AND password=asd
|
||||
LOGGER (Server): Thu Jul 13 14:38:06 CEST 2017 - Login successfull
|
||||
LOGGER (Server): Thu Jul 13 14:38:09 CEST 2017 - Invoked login with username=a AND password=a
|
||||
LOGGER (Server): Thu Jul 13 14:38:09 CEST 2017 - Login successfull
|
||||
LOGGER (Server): Thu Jul 13 14:38:13 CEST 2017 - Invoked login with username=b AND password=b
|
||||
LOGGER (Server): Thu Jul 13 14:38:13 CEST 2017 - Login successfull
|
||||
LOGGER (Server): Thu Jul 13 14:38:17 CEST 2017 - Invoked login with username=dd AND password=dd
|
||||
LOGGER (Server): Thu Jul 13 14:38:17 CEST 2017 - Login successfull
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue