Compare commits

..

No commits in common. "master" and "0.1.0" have entirely different histories.

10 changed files with 210 additions and 198 deletions

1
.gitignore vendored
View File

@ -21,4 +21,3 @@
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid* hs_err_pid*
.idea/

View File

@ -7,22 +7,6 @@
</content> </content>
<orderEntry type="inheritedJdk" /> <orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" /> <orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="junit-4.13.1" level="project" />
<orderEntry type="module-library">
<library name="JUnit5.4">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/junit/jupiter/junit-jupiter/5.4.2/junit-jupiter-5.4.2.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/junit/jupiter/junit-jupiter-api/5.4.2/junit-jupiter-api-5.4.2.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/apiguardian/apiguardian-api/1.0.0/apiguardian-api-1.0.0.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/opentest4j/opentest4j/1.1.1/opentest4j-1.1.1.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/junit/platform/junit-platform-commons/1.4.2/junit-platform-commons-1.4.2.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/junit/jupiter/junit-jupiter-params/5.4.2/junit-jupiter-params-5.4.2.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/junit/jupiter/junit-jupiter-engine/5.4.2/junit-jupiter-engine-5.4.2.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/junit/platform/junit-platform-engine/1.4.2/junit-platform-engine-1.4.2.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
</component> </component>
</module> </module>

View File

@ -1,65 +1,35 @@
package at.reisinger.server; package at.reisinger.server;
import at.reisinger.server.msg.MsgHandler; import at.reisinger.server.msg.MsgHandler;
import at.reisinger.server.objects.Request; import at.reisinger.server.thread.ClientThread;
import at.reisinger.server.objects.Response;
import java.io.IOException; import java.io.IOException;
import java.net.ServerSocket; import java.net.ServerSocket;
import java.net.Socket; import java.net.Socket;
import java.util.concurrent.ConcurrentHashMap;
/**
* Grundlegende Server logic
* Vereint alle anderen Klassen
*/
public class Main { public class Main {
static final int port = 80; static final int port = 80;
private Socket socket;
private int id;
private MsgHandler msgHandler;
/**
* Initial Start
* @param args Nicht Verwendet
*/
public static void main(String[] args) { public static void main(String[] args) {
System.out.println("Starte Server auf Port 80"); System.out.println("Starte Server auf Port 80");
new Main(port);
}
/**
* Öffnet den Server Socket und akzepiert diesen
* @param port Port auf dem der Server läuft
*/
public Main(int port){
ServerSocket serverSocket = null; ServerSocket serverSocket = null;
try { try {
serverSocket = new ServerSocket(port); serverSocket = new ServerSocket(port);
this.msgHandler = new MsgHandler(); int id = 0;
this.id = 0;
while (true){ while (true){
this.socket = serverSocket.accept(); Socket socket = serverSocket.accept();
requestResponding(); Thread client = new ClientThread(id, socket);
client.start();
try {
client.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
} }
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
/**
* Jeder Request durchläuft diese Funktion, reagiert auf requests
*/
public void requestResponding(){
try{
System.out.println("Socket von Client #" + this.id + " wurde gestartet!");
Request rq = new Request(this.socket, this.id);
Response rp = new Response(this.id, rq.getUrl(), rq.getCmd(), rq.getOut(), this.msgHandler, rq.getPayload());
this.msgHandler = rp.getMsghandler();
this.socket.close();
System.out.println("Socket von Client #" + this.id + " wurde geschlossen!");
}catch (IOException e){
e.printStackTrace();
}
}
} }

View File

@ -4,11 +4,6 @@ import at.reisinger.server.objects.Msg;
import java.util.HashMap; import java.util.HashMap;
/**
* Der Speicher der Nachrichten
* Mit hilfe einer HashMap werden die MsgId und die Msg selbst gespeichert
* @author Georg Reisinger
*/
public class MsgHandler { public class MsgHandler {
private HashMap<Integer , String> msgHashMap; private HashMap<Integer , String> msgHashMap;
private int lastID; private int lastID;
@ -30,7 +25,7 @@ public class MsgHandler {
* Ermitelt die nächste freie Id * Ermitelt die nächste freie Id
* @return Next ID * @return Next ID
*/ */
private int nextId(){ public int nextId(){
return this.lastID + 1; return this.lastID + 1;
} }
@ -49,8 +44,8 @@ public class MsgHandler {
* Msg löschen * Msg löschen
* @param id Message Id * @param id Message Id
*/ */
public String delMsg(int id){ public void delMsg(int id){
return msgHashMap.remove(id); msgHashMap.remove(id);
} }
/** /**
@ -58,8 +53,8 @@ public class MsgHandler {
* @param id Message Id * @param id Message Id
* @param msg Message Text * @param msg Message Text
*/ */
public String editMsg(int id, String msg){ public void editMsg(int id, String msg){
return msgHashMap.replace(id, msg); msgHashMap.replace(id, msg);
} }
/** /**
@ -80,7 +75,7 @@ public class MsgHandler {
String returnStr = ""; String returnStr = "";
// Print keys and values // Print keys and values
for (Integer i : msgHashMap.keySet()) { for (Integer i : msgHashMap.keySet()) {
String item = "key: " + i + " value: " + msgHashMap.get(i) + "\n"; String item = "key: " + i + " value: " + msgHashMap.get(i);
returnStr += item; returnStr += item;
} }
System.out.println(returnStr); System.out.println(returnStr);

View File

@ -1,8 +1,7 @@
package at.reisinger.server.objects; package at.reisinger.server.objects;
/** /**
* Message Objekt beinmhaltet die MsgId und die Msg selbst * Message Objekt
* @author Georg Reisinger
*/ */
public class Msg { public class Msg {
private int id; private int id;
@ -26,6 +25,15 @@ public class Msg {
return this.id; return this.id;
} }
/**
* set field
*
* @param id Message Id
*/
public void setId(int id) {
this.id = id;
}
/** /**
* get field * get field
* *
@ -34,4 +42,13 @@ public class Msg {
public String getMsg() { public String getMsg() {
return this.msg; return this.msg;
} }
/**
* set field
*
* @param msg Message String
*/
public void setMsg(String msg) {
this.msg = msg;
}
} }

View File

@ -8,10 +8,6 @@ import java.net.Socket;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
/**
* Verarbeitet einen Request
* @author Georg Reisinger
*/
public class Request { public class Request {
private final Socket socket; private final Socket socket;
@ -33,11 +29,9 @@ public class Request {
this.id = id; this.id = id;
this.out = new PrintStream(this.socket.getOutputStream()); this.out = new PrintStream(this.socket.getOutputStream());
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line = bufferedReader.readLine(); String line;
while (!line.isBlank()) { while (!(line = bufferedReader.readLine()).isBlank()) {
rqBuilder.append(line + "\r\n"); rqBuilder.append(line + "\r\n");
line = bufferedReader.readLine();
System.out.println(line);
} }
String request = rqBuilder.toString(); String request = rqBuilder.toString();
String[] requestsLines = request.split("\r\n"); String[] requestsLines = request.split("\r\n");
@ -72,39 +66,74 @@ public class Request {
/** /**
* Get PrintStream --> Output * get field
* *
* @return out PrintStream --> Output * @return out
*/ */
public PrintStream getOut() { public PrintStream getOut() {
return this.out; return this.out;
} }
/** /**
* Command wie GET, PUT, POST, DEL * set field
* *
* @return cmd als String * @param out
*/
public void setOut(PrintStream out) {
this.out = out;
}
/**
* get field
*
* @return cmd
*/ */
public String getCmd() { public String getCmd() {
return this.cmd; return this.cmd;
} }
/** /**
* Request url * set field
* *
* @return url als String * @param cmd
*/
public void setCmd(String cmd) {
this.cmd = cmd;
}
/**
* get field
*
* @return url
*/ */
public String getUrl() { public String getUrl() {
return this.url; return this.url;
} }
/** /**
* Payload des Request * set field
* *
* @return payload als String * @param url
*/
public void setUrl(String url) {
this.url = url;
}
/**
* get field
*
* @return payload
*/ */
public String getPayload() { public String getPayload() {
return this.payload; return this.payload;
} }
/**
* set field
*
* @param payload
*/
public void setPayload(String payload) {
this.payload = payload;
}
} }

View File

@ -5,10 +5,6 @@ import at.reisinger.server.msg.MsgHandler;
import java.io.PrintStream; import java.io.PrintStream;
import java.net.Socket; import java.net.Socket;
/**
* Erstellt und sendet eine Response anhand des Requests
* @author Georg Reisinger
*/
public class Response { public class Response {
//private final Socket socket; //private final Socket socket;
@ -16,8 +12,8 @@ public class Response {
private PrintStream out; private PrintStream out;
private String cmd; private String cmd;
private String url; private String url;
private final StringBuilder rqBuilder;
private MsgHandler msgHandler; private MsgHandler msgHandler;
private StringBuilder rqBuilder;
/** /**
* Nimmt die Daten des requests und generiert eine Response * Nimmt die Daten des requests und generiert eine Response
@ -44,60 +40,33 @@ public class Response {
if(lastBit.equals("messages")){ if(lastBit.equals("messages")){
listAllMsg(); listAllMsg();
}else{ }else{
String message = msgHandler.getMsg(Integer.parseInt(lastBit)).getMsg(); sendResponse(msgHandler.getMsg(Integer.parseInt(lastBit)).getMsg());
if(message == null){
sendError("404");
}else {
sendResponse(message, "200");
}
} }
} else if (this.url.startsWith("/")) { } else if (this.url.startsWith("/")) {
startseite(); startseite();
} }
}else if (this.cmd.equals("POST")){ }else if (this.cmd.equals("POST")){
if (this.url.startsWith("/messages")) { if (this.url.startsWith("/messages")) {
sendResponse(msgHandler.addMsg(payload) + "", "201"); sendResponse(msgHandler.addMsg(payload) + "");
} }
}else if (this.cmd.equals("PUT")){ }else if (this.cmd.equals("PUT")){
if (this.url.startsWith("/messages")) { if (this.url.startsWith("/messages")) {
String lastBit = this.url.substring(this.url.lastIndexOf('/') + 1); msgHandler.editMsg(id, "Edit");
System.out.println("Last Bit: " + lastBit);
System.out.println("Payload" + payload);
String message = msgHandler.editMsg(Integer.parseInt(lastBit), payload);
if(message == null){
sendError("404");
}else {
sendResponse("","200");
}
} }
}else if (this.cmd.equals("DELETE")){ }else if (this.cmd.equals("DELETE")){
if (this.url.startsWith("/messages")) { if (this.url.startsWith("/messages")) {
String lastBit = this.url.substring(this.url.lastIndexOf('/') + 1); msgHandler.delMsg(id);
String message = msgHandler.delMsg(Integer.parseInt(lastBit));
if(message == null){
sendError("404");
}else {
sendResponse("", "200");
}
} }
}else{ }else{
sendError("405"); sendResponse(sendError());
} }
} }
} }
/**
* Sendet einen Error Response private String sendError() {
* @param errorCode Der Error Code return "";
*/
private void sendError(String errorCode) {
out.print("HTTP/1.0 "+errorCode+"\r\n");
out.print("Server: Apache/0.8.4\r\n");
out.print("Content-Type: text/plain\r\n");
out.print("Content-Length: 1\r\n");
out.print("\r\n");
//out.print(responseText);
} }
private void startseite() { private void startseite() {
@ -106,35 +75,95 @@ public class Response {
"show first message: GET /messages/1<br>" + "show first message: GET /messages/1<br>" +
"show third message: GET /messages/3<br>" + "show third message: GET /messages/3<br>" +
"update first message: PUT /messages/1 (Payload: the message)<br>" + "update first message: PUT /messages/1 (Payload: the message)<br>" +
"remove first message: DELETE /messages/1<br>", "200"); "remove first message: DELETE /messages/1<br>");
} }
private void listAllMsg() { private void listAllMsg() {
sendResponse(msgHandler.getAllMsg(), "200"); sendResponse(msgHandler.getAllMsg());
//sendResponse("Test"); //sendResponse("Test");
} }
/** private void sendResponse(String responseText){
* Sendet eine Response out.print("HTTP/1.0 200 OK\r\n");
* @param responseText Text der zu senden ist out.print("Date: Fri, 31 Dec 2020 23:59:59 GMT\r\n");
* @param code Http code
*/
private void sendResponse(String responseText, String code){
out.print("HTTP/1.0 "+code+"\r\n");
out.print("Server: Apache/0.8.4\r\n"); out.print("Server: Apache/0.8.4\r\n");
out.print("Content-Type: text/plain\r\n"); out.print("Content-Type: text/plain\r\n");
out.print("Content-Length: "+responseText.length()+"\r\n"); out.print("Content-Length: 59\r\n");
out.print("Expires: Sat, 01 Jan 2025 00:59:59 GMT\r\n");
out.print("Last-modified: Fri, 09 Aug 1996 14:21:40 GMT\r\n");
out.print("\r\n"); out.print("\r\n");
out.print(responseText); out.print(responseText);
} }
/** /**
* Get Msg Handler * get field
* *
* @return msgHandler Handler der Nachrichten * @return out
*/
public PrintStream getOut() {
return this.out;
}
/**
* set field
*
* @param out
*/
public void setOut(PrintStream out) {
this.out = out;
}
/**
* get field
*
* @return cmd
*/
public String getCmd() {
return this.cmd;
}
/**
* set field
*
* @param cmd
*/
public void setCmd(String cmd) {
this.cmd = cmd;
}
/**
* get field
*
* @return url
*/
public String getUrl() {
return this.url;
}
/**
* set field
*
* @param url
*/
public void setUrl(String url) {
this.url = url;
}
/**
* get field
*
* @return msgHandler
*/ */
public MsgHandler getMsghandler() { public MsgHandler getMsghandler() {
return this.msgHandler; return this.msgHandler;
} }
/**
* set field
*
* @param msgHandler
*/
public void setMsghandler(MsgHandler msgHandler) {
this.msgHandler = msgHandler;
}
} }

View File

@ -0,0 +1,46 @@
package at.reisinger.server.thread;
import at.reisinger.server.msg.MsgHandler;
import at.reisinger.server.objects.Request;
import at.reisinger.server.objects.Response;
import java.io.*;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
public class ClientThread extends Thread{
private final Socket socket;
private final int id;
private MsgHandler msgHandler;
/**
* Neuer Client wird erstellt
* @param id Id des Clients
* @param socket Socket des Clients
*/
public ClientThread(int id, Socket socket) {
this.id = id;
this.socket = socket;
}
/**
* Hauptmethode des ClientThreads
*/
@Override
public void run() {
try{
System.out.println("Socket von Client #" + this.id + " wurde gestartet!");
Request rq = new Request(this.socket, this.id);
Response rp = new Response(this.id, rq.getUrl(), rq.getCmd(), rq.getOut(), this.msgHandler, rq.getPayload());
this.msgHandler = rp.getMsghandler();
this.socket.close();
System.out.println("Socket von Client #" + this.id + " wurde geschlossen!");
}catch (IOException e){
e.printStackTrace();
}
}
}

View File

@ -1,57 +0,0 @@
package test;
import at.reisinger.server.msg.MsgHandler;
import at.reisinger.server.objects.Msg;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import static org.junit.Assert.assertTrue;
public class MyTests{
@Test
@DisplayName("Msg - GetMsg")
public void msgTest(){
Msg msg = new Msg(1, "Nachricht");
assertTrue(msg.getMsg().equals("Nachricht"));
}
@Test
@DisplayName("Msg - getId")
public void msgIdTest(){
Msg msg = new Msg(1, "Nachricht");
assertTrue(msg.getId() == 1);
}
@Test
@DisplayName("MsgHandler - GetMsg")
public void msgHandlerGetTest(){
MsgHandler msgHandler = new MsgHandler();
assertTrue(msgHandler.getMsg(5).getMsg().equals("Dir?"));
}
@Test
@DisplayName("MsgHandler - AddMsg")
public void msgHandlerAddTest(){
MsgHandler msgHandler = new MsgHandler();
msgHandler.addMsg("Nachricht"); //id = 6
assertTrue(msgHandler.getMsg(6).getMsg().equals("Nachricht"));
}
@Test
@DisplayName("MsgHandler - editMsg")
public void msgHandlerEditTest(){
MsgHandler msgHandler = new MsgHandler();
msgHandler.addMsg("Nachricht"); //id = 6
msgHandler.editMsg(6, "Neu");
assertTrue(msgHandler.getMsg(6).getMsg().equals("Neu"));
}
@Test
@DisplayName("MsgHandler - DelMsg")
public void msgHandlerDelTest(){
MsgHandler msgHandler = new MsgHandler();
msgHandler.addMsg("Nachricht"); //id = 6
msgHandler.delMsg(6);
assertTrue(msgHandler.getMsg(6).getMsg() == null);
}
}