# Chatprogramm



## Joob (4. Nov 2021)

Hallo, 
ich möchte in ein Programm eine Chatfunktionalität einbauen.

Momentan schaue ich mir verschiedene Videos an und bin an SimpleServerClient von DeBukkit hängengeblieben.
Da ich aber keinen Überblick habe würde ich gerne mal fragen ob meine geplante Vorgehensweise OK ist 
oder ob man das sinnvollerweise anders macht.

Ich schaue mir gerade die Video an.
Dann wollte ich seine Sources runterladen und damit experimentieren. (Dabei meine Frage, die sind schon recht alt sollte ich mich da woanders orientieren)
Dann will ich die Sources anpassen.
Dann in mein Projekt integrieren.

Ich bin für jeden Hinweis dankbar.


----------



## Oneixee5 (5. Nov 2021)

Meinst du das: https://github.com/DeBukkIt/SimpleServerClient?
Ich habe mal so kurz darüber geschaut. Es sieht nicht schlecht aus. Das Alter der Quellen sollte auch kein Problem sein. Java 8 ist nicht veraltet oder so. Nicht beurteilen kann ich, so auf die schnelle, ob das nur im Netzwerk funktioniert oder ich per Internet. Deine Anforderungen kenne ich auch nicht - "Chatfunktionalität" ist als Beschreibung etwas dürftig.
Kannst du deine Anforderungen noch genauer beschreiben? Willst du einen zentralen Server betreiben oder wie stellst du dir das vor? Welche Technologien nutzt deine Anwendung?


----------



## Joob (5. Nov 2021)

Ich habe einen zentralen Server auf dem eine Datenbank läuft.
Meine Anwendung greift darauf zu und verwendet Ftp.

Ich würde nun gerne den Benutzern welche die Anwendung in verschiedenen Gruppen nutzen nun  die Möglichkeit bieten sich innerhalb eines Chats auszutauschen. Dieser Chat soll vom einem Member der Gruppe geöffnet werden und auch wieder geschlossen werden.

So etwas wie einen Chat habe ich noch nicht gemacht.
Ich frage mich wie soll ich aus einer Java App die auf einem PC oder Mobil läuft einen Chat auf dem Server starten.
Wie kann ich die Ports auf dem Server von der Java App öffnen und schließen.
Produziere ich dadurch ein Sicherheitsproblem auf dem Server.

Ich weiß nicht so recht wie ich das anfassen soll, und versuche mich in mit dem Problemen vertraut zu machen.
Momentan denke ich, vielleicht muss ich erst auf dem Server ein Programm installieren welches die Kommunikation im Chat steuert.
Ich kann mir nicht so recht vorstellen wie das von der App auf dem Device gemacht werden soll.

Es wäre gut wenn ich Sackgassen vermeiden könnte.


----------



## Joob (5. Nov 2021)

Ich hör mir gerade Video an, welche Servlets verwenden.
Dabei wird gesagt das Servlet ist Teil eines Webservers.

Kann ich also davon ausgehen das ich auf dem Server nichts installieren muss 
sondern der bestehende WebServer bei mir Appache enthält die Funktionalität schon.


----------



## Joob (5. Nov 2021)

Das was ich vom ServLet gesehen habe ist nicht besonders hilfreich.

Beim ServerClient von oben habe ich Sorge das das nicht hinhaut weil ich den Server vom Device aus starte, der müsste dann aber auf meinem zentralen Server laufen. Geht das überhaupt? 

Ich könnte den Chat auch DB-Basiert bauen das wäre für mich kein Problem.
Ich müsste den Server nicht anfassen, hätte https, und müsste keine Ports freigeben.
Alle zwei Sekunden würden die Chatmembers die letzten x Einträge abfragen und alles wäre erledigt.

Ich hatte gedacht es würde performanter sein wenn ich es anders mache
bin mir aber nicht mehr sicher ob das wirklich so ist und selbst dann ob nicht
die anderen Nachteile überwiegen.

Ich wäre echt dankbar für ein paar Meinungen. Vielleicht sehe ich alles komplett falsch.


----------



## kneitzel (5. Nov 2021)

Das klingt alles sehr dubios.

Generell ist es unüblich, dass direkt auf Datenbanken zugegriffen wird von Clients. Das läuft in der Regel über Zwischenschichten wie Webservices und so. Alleine schon das Absichern ist sonst ein Alptraum, wenn man da Clients direkt drauf lässt.

Servlets laufen nicht einfach in einem Webserver wie Apache. Statt dessen ist normalerweise ein AppServer verantwortlich, also z.B ein Tomcat oder ähnliches (Ist auch von Apache aber nicht mit dem Apache Webserver zu verwechseln).



Joob hat gesagt.:


> Meine Anwendung greift darauf zu und verwendet Ftp.


FTP ist auch unsicher. Würde ich also auch ganz klar von abraten. Wenn es wenigstens per SSL verschlüsselt wäre (FTPS) wobei das eigentlich tot ist - das SFTP aus der SSH Ecke hat hier wohl das Rennen für File-Transfers gemacht. 

Nicht desto trotz ist heute eigentlich ein REST Webservice meist das Mittel der Wahl, so es um universelle Zugriffe geht, sprich; Mehr als nur Dateien hochgeladen werden sollen.


----------



## Oneixee5 (6. Nov 2021)

Um noch einmal zum Chat zurückzukommen. In deinem Fall ist der Code von DeBukkit ungeeignet. Wenn es nicht um 10000de Nutzer geht, würde ich hier ganz klar auf Websockets setzen. Auf deinem Server würde dann ein Dienst/Service laufen, welcher die Chatfunktion beinhaltet. Der Client benötigt im Prinzip nur einen Browser mit der entsprechenden Webseite. Websockets können aber auch in eine Anwendung integriert werden. Dieser Service kann über deinen Apache nach außen ins Internet verfügbar gemacht werden. Es ist üblich das so zu machen. Solche Services lassen sich z.B.: auch in Docker-Containern betreiben. So wird dein restliches System etwas vor Fehlfunktionen oder Sicherheitslücken abgeschirmt. Natürlich kann ich hier die Funktion von Websockets nicht ausführlich erläutern, du muss dir das weitgehend selbst erarbeiten, Das ist aber nicht so schlimm.








						The WebSocket API (WebSockets) - Web APIs | MDN
					

The WebSocket API is an advanced technology that makes it possible to open a two-way interactive communication session between the user's browser and a server. With this API, you can send messages to a server and receive event-driven responses without having to poll the server for a reply.




					developer.mozilla.org
				



Als Beispiel nur mal so: https://blog.oio.de/2020/04/08/http-client-websocket-chat-application-using-spring-boot/
Das Beispiel verwendet Spring Boot, diese bringt schon gesamte Umgebung mit welche zur Laufzeit benötigt wird, außer Java. Also, wenn du möchtest, einen Tomcat, sowie Sicherheitsfeatures. Du könntest für den Chat auch deine bestehende Datenbank nutzen.


----------



## Joob (6. Nov 2021)

Erst mal schönen Dank für eure Antworten, bevor ich mich jetzt auf den einen oder anderen Weg mache 
würde ich gerne noch ein paar Fragen stellen.

Grundsätzlich gehe ich von Gruppen bis zu 50 Personen aus und von vielleicht max. 50 gleichzeitigen Gruppen auf dem Server.

1. Meine App verwendet JavaFX, beim Web Socket ist immer so viel die Rede von Browsern, welche ich ja gar nicht verwende.
Das irritiert mich, aber in den Videos, welche ich gesehen habe ist das unerheblich gewesen, da Browser oder JavaFx nur das UI sind
und das kann man verwenden wie man will. Stimmt das ?

2. Kann ich mir ein Web Socket so vorstellen, das ich auf meinem Server einen Port öffne der nur vom Web Socket genutzt wird
und darüber eine bestimmte Art Datentausch, in meinem Fall eben das Austauschen von Strings im Chat läuft. Und dort
im Rahmen der Funktionalität des Web Sockets die Möglichkeit besteht quasi automatisch alle Members eine Gruppe
mit den gesendeten Daten zu synchronisieren. ( Mit synchronisiert meine ich: alle an das Web Socket gesendeten Daten
werden automatisch an alle Members verteilt)

3. Ist es im Web Socket möglich, mehrere Gruppen gleichzeitig zu verwalten um nur diese untereinander zu synchronisieren.

4. Ist die Verwendung von Web Socket deutlich performanter, wie die Lösung DB. 
Dazu muss ich anmerken das auf die DB via PHP zugegriffen wird. 

5. Wo liegt die Ursache der Performancesteigerung beim Web Socket?


----------



## Oneixee5 (6. Nov 2021)

Die Nutzer-Gruppen eines Services habe erst mal nichts mit der verwendeten Technologie zu tun. Gruppen sind eine logische Einteilung, keine technische.

Zu 1.: Websocket ist nicht an Browser gebunden: https://stackoverflow.com/questions/26452903/javax-websocket-client-simple-example

Zu 2.) Websocket ist nicht unbedingt an einen Port ungleich 80/443 gebunden. Websocket ist ein Protokoll wie HTTP oder HTTPS, also WS bzw. WSS: https://stackoverflow.com/questions...-port-80-for-both-http-and-web-socket-traffic. Weiterhin ist Websocket ein "full duplex"-Protokoll. Also es werden Daten in beide Richtungen gesendet. Ein Server kann also unaufgefordert Daten zum Client senden. Somit auch die Namen von neuen Gruppenmitgliedern etc.

Zu 3.) Websockets verwaltet keine Gruppen - Websockets ist ein Protokoll zur Datenübertragung. Die Gruppen kannst du im Programm des Servers verwalten und die Gruppendaten in deiner DB ablegen.
Zu 4.) Die Frage ist Unsinn. Eine "Lösung DB" hat keine Chatfunktion, ist also keine Lösung. Der Datenbankzugriff für andere Anwendungen kann weiterhin mit PHP erfolgen. Das hat aber nichts mit dem Chatprogramm zu tun. Solltest du einen Chat-Server in Java implementieren, dann erfolgt der DB-Zugriff natürlich auch mit Java.

Zu 5.) Es wurden bisher gar keine Aussagen zur Performance gemacht. Wo soll dann bitte eine Performancesteigerung herkommen - gegenüber welcher Aussage/welcher Messung?

Ein Forum kann dir nicht die Beschäftigung mit der Technologie abnehmen. Du musst dich selbst damit beschäftigen und deine Lösung finden. Das Forum kann dich mit Ratschlägen unterstützen, aber nicht eigenes Wissen ersetzen.


----------



## Joob (6. Nov 2021)

zu 4, das ist kein Unsinn sondern nur eine andere, wenn was ich eben nicht weiß, eine mit zu hohem Resourcenverbrauch.

Ich hatte oben beschrieben wie ich die Funktionalität des Chats in einer DB darstellen kann und wollte eine 
Meinung zu Resourcenverbrauch gegenüber einem Websockets oder den anderen Möglichkeiten um 
dann eine Variante zu bauen.

Ich habe mich heute auch mit verschieden Möglichkeiten hinsichtlich des Websockets beschäftigt.
Ist es richtig, das ich erst einen WebSocket auf meinem Server installiere.








						Setting-up Secure WebSockets on Ubuntu Servers
					

The purpose of this guide is to help someone setup a secure websocket server on any Ubuntu VM (AWS/Linode/Digital Ocean/Azure etc.).  Given the current state of the world, supporting features such as collaborative editing and real-time chat became almost essential to TunePad's long term success...




					amartya.in
				




Wenn ich das gemacht habe wollte ich das installierte Websocket von den Clients aus verwenden.
Dabei habe ich aber nur Lösung gesehen bei denen ich jede Menge Abhängigkeiten schaffe. Ist das notwendig.








						Using The Java Api For Websocket To Create A Chat Server
					

In this post, I’ll use Web sockets to create a tiny chat server using Tyrus, the reference implementation of the Java API for WebSocket (JSR 356).




					www.codepedia.org


----------



## Oneixee5 (6. Nov 2021)

Das ist Unsinn: "Funktionalität des Chats in einer DB" es gibt keine DB mit Chatfunktion, eine DB speichert Daten. Mögliche Zusatzprogramme zur DB hast du nicht beschrieben.

Was du laut deinem Link installieren willst ist Javascript.

Dein 2 Link bezieht sich sich auf einen Beitrag aus 2016. Das ist, als wollte man ein Haus bauen, nach einer Bauanleitung aus der Steinzeit.

Als Abhängikeit für Java benötigst du ein 27KB großes JAR-File.
<!-- https://mvnrepository.com/artifact/javax.websocket/javax.websocket-client-api -->
<dependency>
    <groupId>javax.websocket</groupId>
    <artifactId>javax.websocket-client-api</artifactId>
    <version>1.1</version>
</dependency>


----------



## Joob (6. Nov 2021)

Der erste Link ist doch eine Installationsanleitung für Web Socket auf einem Ubuntu Server.
Das ist doch Voraussetzung oder nicht ?

Der zweite Link war was mich irritier hat. Wegen eben der Abhängigkeiten.

Hinsichtlich der Abhängigkeiten verwende ich Gradle und habe dies gerade eingebaut, da hatte ich mit der Notation vertan.
Läuft jetzt.

Hoffentlich finde ich eine Beschreibung für die Umsetzung die mich nicht wieder in
die Irre führt. Ich kenne das noch nicht und möchte eben solche Fehler vermeiden.

Und dann noch das was ich mit der DB vorhabe.
User schreibt Text. 
Der Text wird in einer Tabelle gespeichert.
Die letzten x Einträge der Tabelle werden vom User alle x Sekunden abgefragt und angezeigt.
Damit wäre das für den Benutzer identisch.


----------



## Oneixee5 (6. Nov 2021)

Joob hat gesagt.:


> Die letzten x Einträge der Tabelle werden vom User alle x Sekunden abgefragt und angezeigt.


Ja sowas hat man früher mal gemacht. Das will man aber gerade vermeiden. Stell dir mal vor du hast 1000 User, dann hast du pro Sekunde 1000 Abfragen ob es was neues gibt - ohne weitere Funktionalität. Wenn dich jemand ärgern will - und der Tag kommt - dann bombt er dich mit Anfragen zu bis dein Server aufgibt.


----------



## Oneixee5 (6. Nov 2021)

Joob hat gesagt.:


> Der erste Link ist doch eine Installationsanleitung für Web Socket auf einem Ubuntu Server.


Nein es ist eine Anleitung zur Installation von serverseitigem Javascript + einer kleinen Anwendung dazu. Du kannst natürlich deinen Chatserver auch mit Javascript schreiben wenn du willst.


----------



## Joob (6. Nov 2021)

Und das Web Socket kann das besser lösen weil es keinen Overhead für die kurze zu verteilende Message gibt.
Ist das so ?

Allerdings ist es so das sich nur zugelassene Benutzer eine vorher definierten Gruppe am Chat anmelden können.
Trotzdem habe ich auch das Gefühl das das kein guter Weg ist
und außerdem finde ich wenn ich Web Soket umsetzte den Einstieg in was neues.


----------



## Oneixee5 (6. Nov 2021)

Oneixee5 hat gesagt.:


> Weiterhin ist Websocket ein "full duplex"-Protokoll. Also es werden Daten in beide Richtungen gesendet. Ein Server kann also unaufgefordert Daten zum Client senden.


----------



## Joob (6. Nov 2021)

Muss ich denn auf meinem Server gar nichts vorbereiten um  Web Socket zu benutzen.
Ich hab ja gelesen das es ein Teil von http ist und der Unterschied eben die Bidirectionalität ist.

Wird das alles durch javax.websocket über den WebServer geregelt ?


----------



## Oneixee5 (6. Nov 2021)

Du musst dich damit beschäftigen und die offiziellen Dokus/Webseiten lesen um das zu verstehen.


----------



## Joob (6. Nov 2021)

OK, erst mal schönen Dank für deine Mühe.

Hast du  vielleicht noch einen Link mit zu eine Erklärung.


----------



## kneitzel (6. Nov 2021)

WebSocket ist einfach ein Standard. Der wird dann von konkreten Implementationen implementiert.

Und http ist einfach ein Protokoll. Ob es da einen expliziten Webserver gibt oder nicht, ist da wieder egal. Du brauchst du etwas, das dieses Protokoll implementiert.

Und das kann die Java Applikation selbst sein und die kann alles beinhalten. Das kann aber von mir aus auch ein Mega System für Großrechner sein, das sonst was macht aber eben auch irgendwo WebSockets anbietet ... 

Also wie Fahrzeug. Das ist einfach nur eine abstrakte Idee.
Du brauchst keinen 80t schweren Panzer (ist aber natürlich auch ein Fahrzeug). Du kannst auch einfach ein Skateboard nehmen.

Nur wenn der einfache Weg mit dem Skateboard ausreicjt: was schaust du dir Panzer an? Oder überlegst, was für Rollen aus dem Baumarkt du unter einen Konzertflügel Schrauben könntest....


----------



## Joob (6. Nov 2021)

Mach ich mir das Leben unnütz schwer ?

Aber in allen Beispielen wird immer localhost verwendet.
Da denke ich, klar auf meinem Rechner kann ich den Server betreiben.
Wenn ich aber meinen Server verwenden will, muss ich mich doch erst mal anmelden und und.

Dann werden in den Beispielen immer solche Frameworks wie Spring usw. verwendet.
Muss ich das überhaupt so machen. Was tun die Teile.
Kann ich das selber machen ?









						HTTP Client WebSocket Chat Application using Spring Boot
					

Have you ever thought about what the logic behind a chat application is? How could it be written and how does it work? If yes, here is the right place to look for an answer. It is called WebSocket! But what is this?    What is WebSocket?    WebSocket is a communication protocol exactly like HTTP pro



					blog.oio.de
				




Ich will ja nur wissen wie ich das anfassen soll.


----------



## kneitzel (6. Nov 2021)

Natürlich kannst du alles alleine machen. Aber die Frameworks decken Dinge ab, die du auch abdecken solltest um sicher zu sein.


----------



## Joob (6. Nov 2021)

Ich habe da ja keine Erfahrung, meinst du ich sollte mit dem Beispiel oben mal anfangen und versuchen es so machen,
wobei ich immer noch nicht versteht was dann auf meinem Server abgeht.

Da kommen doch die Daten an und an einer Stelle müssen auch die Benutzer bekannt gemacht werden 
und der Broadcast wird auch im Server ausgelöst, also muss der Server ja wissen an wen er 
schickt.


----------



## Oneixee5 (6. Nov 2021)

kneitzel hat gesagt.:


> WebSocket ist einfach ein Standard.


Websocket ist auch "nur" ein Protokoll: https://de.wikipedia.org/wiki/WebSocket, der Standard ist HTML5.


----------



## kneitzel (6. Nov 2021)

Da hast Du natürlich Recht.


----------



## Joob (6. Nov 2021)

Ich versuchs jetzt erst mal dann klären sich vielleicht einige Fragen.

Ich möchte mich noch mal bedanken für eure Hilfe..


----------

