From b7dba32a0b0d384eb68968380e02ff8012fdf7e5 Mon Sep 17 00:00:00 2001
From: brausjonas <47791011+jonasbraus@users.noreply.github.com>
Date: Thu, 23 Mar 2023 22:25:20 +0000
Subject: [PATCH] Comments
---
.idea/workspace.xml | 39 ++++++++++++------------
Server/src/Client.java | 3 ++
Server/src/Main.java | 4 +++
Server/src/Room.java | 64 ++++++++++++++++++++++++++++++++++++---
Server/src/Server.java | 67 +++++++++++++++++++++++++++++++++--------
Server/src/Vector3.java | 4 +++
6 files changed, 145 insertions(+), 36 deletions(-)
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index 263d08d..e7865d1 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -2,16 +2,7 @@
-
-
-
-
-
-
-
-
-
@@ -29,18 +20,20 @@
- {
+ "keyToString": {
+ "RunOnceActivity.GIT_CREDENTIAL_SETUP": "true",
+ "RunOnceActivity.OpenProjectViewOnStart": "true",
+ "RunOnceActivity.ShowReadmeOnStart": "true",
+ "WebServerToolWindowFactoryState": "false",
+ "last_opened_file_path": "C:/flufflparty/Server",
+ "project.structure.last.edited": "Project",
+ "project.structure.proportion": "0.15",
+ "project.structure.side.proportion": "0.0",
+ "settings.editor.selected.configurable": "preferences.lookFeel",
+ "vue.rearranger.settings.migration": "true"
}
-}]]>
+}
@@ -66,6 +59,8 @@
1676488026665
+
+
@@ -83,4 +78,8 @@
+
+
+
+
\ No newline at end of file
diff --git a/Server/src/Client.java b/Server/src/Client.java
index 9aa83af..d0eceea 100644
--- a/Server/src/Client.java
+++ b/Server/src/Client.java
@@ -2,6 +2,9 @@ import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.Socket;
+/**
+ * Instance of a Client connected
+ */
public class Client
{
public DataOutputStream output;
diff --git a/Server/src/Main.java b/Server/src/Main.java
index 549ed79..851f130 100644
--- a/Server/src/Main.java
+++ b/Server/src/Main.java
@@ -1,5 +1,9 @@
public class Main
{
+ /**
+ * Main Function
+ * @param args
+ */
public static void main(String[] args)
{
new Server().start();
diff --git a/Server/src/Room.java b/Server/src/Room.java
index a9c8069..4634dae 100644
--- a/Server/src/Room.java
+++ b/Server/src/Room.java
@@ -8,17 +8,27 @@ import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
+/**
+ * this class handels all operations / syncs performed in a single room
+ */
public class Room
{
+ //tells how many clients can connect to a room
private Client[] players = new Client[2];
+ //the array of players start positions
private Vector3[] startPositions;
+ //the generated roomcode
private String roomCode;
+ //the instance to the main server
private Server server;
+ //all threads created stored in this list to close them after room closure
private List threads = new ArrayList<>();
+ //count of players in the game
private int playerCount = 0;
+ //tells players turn (array index)
private int currentPlayer = 0;
private long timeOut = 0;
@@ -31,6 +41,7 @@ public class Room
this.roomCode = roomCode;
startPositions = new Vector3[4];
+ //set up the start positions
startPositions[0] = new Vector3(96, 1, 126);
startPositions[1] = new Vector3(92, 1, 126);
startPositions[2] = new Vector3(96, 1, 128);
@@ -38,6 +49,7 @@ public class Room
this.server = server;
+ //calculates a room timeout
try
{
t = new Timer();
@@ -79,29 +91,40 @@ public class Room
}
}
+ /**
+ * Adds a Client to the game (on new player joined the room)
+ * @param client
+ */
public void addClient(Client client)
{
+ //the timeout variable for a single player
timeOut = System.currentTimeMillis();
+ //loops through all players existing and sends the needed information
for (int i = 0; i < players.length; i++)
{
+ //places the new joined player in the next free slot
if (players[i] == null)
{
players[i] = client;
playerCount++;
+ //LOG
System.out.println("[" + Server.getDateTime() + "] " + client.name.replace(" ", "") + " joined room " + roomCode + " successfully as player " + i);
+ //creates a thread for the connection with the joined player
Thread t = new Thread(new Runnable()
{
@Override
public void run()
{
+ //assignes a player id
int player = playerCount - 1;
DataInputStream input = null;
try
{
+ //tries to get the input stream (TCP)
input = new DataInputStream(players[player].socket.getInputStream());
} catch (IOException e)
{
@@ -112,10 +135,13 @@ public class Room
{
try
{
+ //this is a buffer for all data being received by the player
byte[] readData = new byte[10];
+ //read the data to the buffer
input.read(readData);
+ //reset the timeout once something is received
timeOut = System.currentTimeMillis();
@@ -128,6 +154,7 @@ public class Room
----------------------------------------
----------------------------------------
*/
+ //Checks which action (array[0]) is received
switch (readData[0])
{
@@ -136,6 +163,7 @@ public class Room
case 3:
for (int i = 0; i < players.length; i++)
{
+ //sync to all OTHER players
if (i != player)
{
players[i].output.write(new byte[]{3, (byte) player, readData[1], 0, 0, 0, 0, 0, 0, 0});
@@ -147,6 +175,7 @@ public class Room
case 4:
for (int i = 0; i < players.length; i++)
{
+ //sync to all OTHER players
if (i != player)
{
players[i].output.write(new byte[]{4, (byte) player, readData[1], 0, 0, 0, 0, 0, 0, 0});
@@ -157,11 +186,13 @@ public class Room
//Spieler ist fertig mit seinem Zug
//1 x, x = next player
case 5:
+ //calculate the next player
currentPlayer++;
if (currentPlayer >= players.length)
{
currentPlayer = 0;
}
+ //sync the activation of the current player to ALL clients
for (int i = 0; i < players.length; i++)
{
players[i].output.write(new byte[]{2, (byte) currentPlayer, 0, 0, 0, 0, 0, 0, 0, 0});
@@ -173,6 +204,7 @@ public class Room
case 6:
for (int i = 0; i < players.length; i++)
{
+ //sync to OTHER players
if (i != player)
{
players[i].output.write(new byte[]{6, (byte)player, readData[1], 0, 0, 0, 0, 0, 0, 0});
@@ -180,18 +212,20 @@ public class Room
}
break;
- //Eventstop (ItemShop, BuyStar, ...) ist fertig
+ //Eventstop (ItemShop, BuyStar, ...) ist fertig
//1 x, x = player
case 7:
+ //sync to ALL players
for (int i = 0; i < players.length; i++)
{
- players[i].output.write(new byte[]{7, (byte)player, 0, 0, 0, 0, 0, 0, 0, 0});
+ players[i].output.write(new byte[]{7, (byte)player, 0, 0, 0, 0, 0, 0, 0, 0});
}
break;
//Spieler hat einen Stern gekauft
case 8:
for (int i = 0; i < players.length; i++)
{
+ //sync to OTHER players
if (i != player)
{
players[i].output.write(new byte[]{8, (byte)player, 0, 0, 0, 0, 0, 0, 0, 0});
@@ -204,12 +238,14 @@ public class Room
case 9:
for (int i = 0; i < players.length; i++)
{
+ //Sync to OTHER players
if (i != player)
{
players[i].output.write(new byte[]{9, (byte)player, readData[1], 0, 0, 0, 0, 0, 0, 0});
}
}
break;
+ //the timeout check action
case 126:
players[player].lastTimeSendTimeOutCheck = System.currentTimeMillis();
break;
@@ -217,13 +253,17 @@ public class Room
} catch (IOException e)
{
+ //if something is crashing, the room is being deleted
server.deleteRoom(roomCode);
}
}
}
});
+ //name the thread for better debugging
t.setName("Thread Player: " + (playerCount - 1));
+ //start the thread
t.start();
+ //add the thread to the threads list
threads.add(t);
break;
}
@@ -241,11 +281,16 @@ public class Room
//1 1 playable character
//2-3-4 default pos
//5 player index
+
+ //if the player should be playable
if (j == k)
{
try
{
+ //sends the inital message to the player
players[j].output.write(new byte[]{1, 1, (byte) startPositions[k].x, (byte) startPositions[k].y, (byte) startPositions[k].z, (byte) k, 0, 0, 0, 0});
+
+ //sends the name of the player (ASCII encoding)............................................................................
byte[] name = players[k].name.substring(0, 8).getBytes(StandardCharsets.US_ASCII);
byte[] send = new byte[10];
send[0] = 5;
@@ -257,11 +302,14 @@ public class Room
}
players[j].output.write(send);
+ //stop sending the name................................................................................
} catch (IOException e)
{
}
- } else
+ }
+ //if the player should be a bot
+ else
{
try
{
@@ -287,6 +335,8 @@ public class Room
//0 2, activate a player
//1 x, x = idx
+
+ //send the inital activation message
try
{
for (Client c : players)
@@ -300,13 +350,18 @@ public class Room
}
}
+ /**
+ * Closes the room
+ */
public void closeRoom()
{
+ //try to cick all the players (still connected) of the room
try
{
-
+
if (players[0] != null)
{
+ //127 is the action for room cick
players[0].output.write(new byte[]{127, 0, 0, 0, 0, 0, 0, 0, 0, 0});
}
@@ -348,6 +403,7 @@ public class Room
}
+ //try to close all open threads (not crashed yet)
for (int i = 0; i < threads.size(); i++)
{
try
diff --git a/Server/src/Server.java b/Server/src/Server.java
index b7f7085..be52b39 100644
--- a/Server/src/Server.java
+++ b/Server/src/Server.java
@@ -10,20 +10,29 @@ import java.util.HashMap;
public class Server
{
+ //the server socket (for accepting new connections)
private ServerSocket serverSocket;
+ //Roomcodes and Room objects are mapped here
private HashMap rooms = new HashMap<>();
- //hier ArrayList für public rooms
-
+ //Server reference
private final Server server = this;
+ //A Formatter for date and time log outputs
private static DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
+ /**
+ * returns a date and time stamp
+ * @return
+ */
public static String getDateTime()
{
return dtf.format(LocalDateTime.now());
}
+ /**
+ * tries to delete a room by its roomcode
+ */
public void deleteRoom(String code)
{
rooms.get(code).closeRoom();
@@ -33,73 +42,96 @@ public class Server
System.out.println("[" + getDateTime() + "] Room" + code + " successfully deleted");
}
+ /**
+ * Starts the Server
+ */
public void start()
{
try
{
+ //create the listening server socket on port 8501
serverSocket = new ServerSocket(8051);
+ //LOG
System.out.println("[" + getDateTime() + "] Server started! IP 185.245.96.48 PORT 8051");
+ //a endless loop for accepting new connections
while(true)
{
+ //accept a connection from a client
Socket tempClient = serverSocket.accept();
+ //LOG
System.out.println("[" + getDateTime() + "] Client with IP " + tempClient.getInetAddress().getHostName() + " connected!");
+ //create a new thread for the connected client to free up main thread resources for new connections
new Thread(new Runnable()
{
@Override
public void run()
{
+ //cache the connected client in the thread (if not it could be overwritten by a new connection)
Socket client = tempClient;
try
{
+ //get the input stream of the client (TCP)
DataInputStream input = new DataInputStream(client.getInputStream());
+ //get the output stream of the client (TCP)
DataOutputStream output = new DataOutputStream(client.getOutputStream());
+ //A buffer for incoming data
byte[] readData = new byte[10];
+ //read incoming data into the buffer
input.read(readData);
+ //check for the incoming actions
switch(readData[0])
{
- //hier case 3 für public match making
- //dsfjlksdfjlöasdfjlsdkjflksdjflksdjflksdjflksdjflksdjflksdjflkjsdlkfjsdlkfsdjlkfsdlkfjsdlkfjsdlkfjlsdkfjlsdkjfldksjfjlk
- //fsjfklsdjflksdjflsdjflksdjflksdfjlksdjflksdjflksdjflksdjflksdjflksdjflksdjflksdjflksdjflsdkjflksdjflksdjflksdjflksdjf
-
- //schleife um zu checken ob ein offener room existiert (Liste)
- //ansonsten einen neuen room erstellen und zur liste inhzufügen
-
+ //this case generates a new room and sends the room code to the requester (not for join)
case 2:
+ //cache the generated room code
byte[] code = generateRoomCode();
+ //send the room code to the requester
output.write(code);
+ //create the room object
Room room = new Room(new String(code, StandardCharsets.US_ASCII), server);
+ //map the room object to the room code
rooms.put(new String(code, StandardCharsets.US_ASCII), room);
+ //LOG
System.out.println("[" + getDateTime() + "] Room " + new String(code, StandardCharsets.US_ASCII) + " successfully created!");
break;
+ //in this case a player wants to join an existing room (even the room creator will join via this method)
case 1:
+ //fill the buffer with the incoming data (second data send after inital data transfer)
input.read(readData);
+ //deocde the roomcode to a string (ascii -> string)
String roomCode = new String(readData, StandardCharsets.US_ASCII);
+ //read the third message
input.read(readData);
+ //deocde the players name
String name = new String(readData, StandardCharsets.US_ASCII);
name = name.replace("?", " ");
+ //check if the room exists
if(rooms.containsKey(roomCode))
{
+ //create the reference to the client
Client client1 = new Client(output, input, client, name);
+ //move the client to the room
rooms.get(roomCode).addClient(client1);
}
else
{
+ //room is not available, so the player should automatically go back to the start menu (kick action)
output.write(new byte[]{127, 0, 0, 0, 0, 0, 0, 0, 0, 0});
}
@@ -107,34 +139,45 @@ public class Server
}
} catch (Exception e){
-
+ //do not end the program on any main thread errors (unwated connection losses), because other players wont be able to connect to the server
}
}
}).start();
}
}
- catch(Exception e){}
+ catch(Exception e){
+ //do not end the program on any main thread errors (unwated connection losses), because other players wont be able to connect to the server
+ }
}
+ /**
+ * Generates a ascii byte[] room code
+ * please see the ascii table
+ * @return
+ */
private byte[] generateRoomCode()
{
+ //buffer to store the code
byte[] code = new byte[10];
for(int i = 0; i < code.length; i++)
{
+ //for the first 5 indexes user numbers (1-9)
if(i < code.length / 2)
{
code[i] = (byte)(Math.random() * 8 + 49);
}
+ //for the last 5 indexes use letters (A-Z)
else
{
code[i] = (byte)(Math.random() * 25 + 97);
}
}
+ //decode the generated room code to a string
String roomCode = new String(code, StandardCharsets.US_ASCII);
- //avoide double codes (just in case^^)
+ //in case the room code does allready exists, the roomcode generation will be called recursively
if(rooms.containsKey(roomCode))
{
code = generateRoomCode();
diff --git a/Server/src/Vector3.java b/Server/src/Vector3.java
index 89578f8..0c97ea3 100644
--- a/Server/src/Vector3.java
+++ b/Server/src/Vector3.java
@@ -1,3 +1,7 @@
+/**
+ * A Simple Vector class according to the Unity vector
+ */
+
public class Vector3
{
public float x, y, z;