INITIAL COMMIT

This commit is contained in:
Yandrik 2023-10-28 14:14:39 +02:00
commit 914edad949
10 changed files with 144 additions and 0 deletions

8
.idea/.gitignore vendored Normal file
View File

@ -0,0 +1,8 @@
# Default ignored files
/shelf/
/workspace.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

6
.idea/misc.xml Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" project-jdk-name="16" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

8
.idea/modules.xml Normal file
View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/s9-grn-programmieraufgaben.iml" filepath="$PROJECT_DIR$/.idea/s9-grn-programmieraufgaben.iml" />
</modules>
</component>
</project>

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/a1/src" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

6
.idea/vcs.xml Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
</component>
</project>

BIN
a1/src/.DS_Store vendored Normal file

Binary file not shown.

View File

@ -0,0 +1,71 @@
package de.uulm.in.vs.vns.p1a;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.concurrent.ThreadLocalRandom;
/*
*
* Implementieren Sie eine Klasse NumberGuessingGameRequestHandler im Paket de.uulm.in.vs.vns.p1a welche die Spiellogik des Single-Threaded Servers aus der Übung enthält.
* Darüber hinaus soll die Klasse aber als neuer Thread ausführbar sein, dafür muss sie das Interface Runnable implementieren.
* Implementieren Sie eine Klasse NumberGuessingGameThreadedServer im Paket de.uulm.in.vs.vns.p1a, die nach einem Verbindungsaufbau einen neuen Spielprozess (Thread) startet. Verwenden Sie dazu die Java Thread-Klasse.
* Um den Server vor einer Überlastung durch zu viele Verbindungen zu schützen, begrenzen Sie die maximale Anzahl von gleichzeitig laufenden Spielprozessen auf 4.
* Erweitern Sie dafür die Klasse NumberGuessingGameThreadedServer um einen Threadpool durch Verwendung der Klassen ExecutorService bzw. Executor. Kommentieren Sie Ihre ursprüngliche Lösung ohne Threadpool aus, statt diese zu löschen.
* (Hinweis: Die Klasse NumberGuessingGameRequestHandler muss für diese Aufgabe nicht mehr verändert werden.)
*
*/
public class NumberGuessingGameRequestHandler implements Runnable {
private final Socket connectionSocket;
public NumberGuessingGameRequestHandler(Socket socket) {
this.connectionSocket = socket;
}
@Override
public void run() {
try (BufferedReader reader = new BufferedReader(
new InputStreamReader(connectionSocket.getInputStream()));
PrintWriter writer = new PrintWriter(
new OutputStreamWriter(connectionSocket.getOutputStream()))) {
writer.println("hey client, guess my secret number!");
writer.flush();
int secret = ThreadLocalRandom.current().nextInt(50) + 1;
int tries = 6;
String input;
while ((input = reader.readLine()) != null) {
try {
int guess = Integer.parseInt(input);
if (guess == secret) {
writer.println("you've won");
break;
} else if (guess > secret) {
writer.println("your guess is too high");
} else {
writer.println("your guess is too low");
}
tries -= 1;
if (tries == 0) {
writer.println("You lose!");
break;
}
} catch (NumberFormatException e) {
writer.println("Please enter a valid number!");
} finally {
writer.flush();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

View File

@ -0,0 +1,34 @@
package de.uulm.in.vs.vns.p1a;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class NumberGuessingGameThreadedServer {
public static void main(String[] args) throws IOException {
// Erzeugen eines ExecutorService mit einem Threadpool von 4 Threads
ExecutorService threadPool = Executors.newFixedThreadPool(4); // Alternative .newCachedThreadPool();
try (ServerSocket serverSocket = new ServerSocket(5555)) {
while (true) {
System.out.println("waiting for connection");
Socket connectionSocket = serverSocket.accept();
System.out.println("connection accepted");
// ExecutorService, um die Anfrage zu bearbeiten
threadPool.execute(new NumberGuessingGameRequestHandler(connectionSocket));
/*
/ SOLUTION: Ohne Threadpool
Thread thread = new Thread(new NumberGuessingGameRequestHandler(connectionSocket));
thread.start();
*/
}
} finally {
threadPool.shutdown(); // Wichtig, um den ExecutorService ordnungsgemäß herunterzufahren
}
}
}