Warum sind Sockets für einen Live-Chat sinnvoll?

jemand

Mitglied
Hi Java-Devs,

ich bin gerade dabei, einen Live-Chat zu schreiben und hab mich im unteren Thread mal darüber schlau gemacht.
Aber wieso sollte ich unbedingt auf Sockets zurückgreifen? Der Socket-Server würde ja auch über eine Endlosschleife auf neue Chat-Nachrichten warten und diese an den Client weitergeben, sodass es ja keine Geschwindigkeitsvorteile gibt und ich meinen Chat auch ohne Sockets schreiben kann.

Kann mich mal jemand darüber aufklären?

Danke :)
 

Tobse

Top Contributor
Wie willst du denn den Chat ohne Sockets schreiben?

HTTP Polling:
Ist vieeeel langsamer und verschwendet Ressourcen. Außerdem geht HTTP auch nur über Sockets.

HTTP Long Polling:
Ist vllt gleich schnell wie rohe Sockets, verschwendet aber auch Ressourcen und ist unnötiger Mehraufwand.

Websockets:
Ist das selbe wie ein Socket, nur mit mehr Overhead.
 

jemand

Mitglied
Ja klar muss ich auf irgendein Socket zurückgreifen. Ich meinte natürlich, ohne einen eigenen entwickeln zu müssen. Aber wenns über http natürlich langsamer geht, kann ich auch einen eigenen entwickeln. Ist angekommen. Wenn ich mir einen server miete, kann ich ja dort dann den Dienst automatisch starten lassen und gebe meinen eigenen Port frei.
 

Tobse

Top Contributor
Ja klar muss ich auf irgendein Socket zurückgreifen. Ich meinte natürlich, ohne einen eigenen entwickeln zu müssen. Aber wenns über http natürlich langsamer geht, kann ich auch einen eigenen entwickeln. Ist angekommen.
Ein eigenes Protokoll für soetwas zu entwerfen ist nicht so schwierig, wie du jetzt vielleicht denkst. Und in jedem Fall ist es eine Lehrreiche Erfahrung :) Ich würde sagen: go, mach rohe Sockets mit deinem eigenen Protokoll. Ein bisschen Frust und viele Erfolgserlebnisse später steht dein Chat und du bist klüger als davor ;)

Wenn ich mir einen server miete, kann ich ja dort dann den Dienst automatisch starten lassen und gebe meinen eigenen Port frei.

Richtig.

----
Wenn du auf ein bestehendes Protokoll zurückgreifen willst kann ich dir XMPP empfehlen; wenn du das Protokoll nutzt kann deine Software auch mit vielen anderen Servern und Clients kommunizieren.
 

JuKu

Top Contributor
Sockets sind der Grundbaustein für Networking allgemein. Auch eine HTTP Verbindung basiert auf Sockets. Ohne Socket gibt es kein Networking (korrigiert mich, wenn ich falsch liege! Bei UDP bin ich mir gerade unsicher).
Du könntest entweder eine der Methode von @Tobse verwenden, oder einfach alle x Millisekunden eine HTTP Anfrage an den Server stellen. Letzteres kostet aber viel mehr Performance, da TCP einen sog. "Slow Start" besitzt:
https://de.wikipedia.org/wiki/Transmission_Control_Protocol#Slow_Start_und_Congestion_Avoidance
https://de.wikipedia.org/wiki/Transmission_Control_Protocol#Slow_Start_und_Congestion_Avoidance
D.h. konkret, dass es vergleichsweise lange dauert, eh eine Verbindung aufgebaut wird. Und deshalb willst du für einen Chat nicht ständig Verbindungen neu öffnen und direkt wieder schließen, sondern hälst sie lieber offen ("normaler" Socket).
 

jemand

Mitglied
So, roher Socket steht und es wird jede Sekunde aktualisiert. Aber ich will eben nicht jede Sekunde eine neue Connection öffnen. Deswegen hab ich eine Abfrage reingemacht, ob die Verbindung offen ist oder nicht. Jetzt lässt sich aber socket.getInputStream() nicht resetten. Gibt es dafür eine Möglichkeit?
 

JuKu

Top Contributor
Aber ich will eben nicht jede Sekunde eine neue Connection öffnen.

Genau deshalb nutzt du ja gerade Sockets.

Deswegen hab ich eine Abfrage reingemacht, ob die Verbindung offen ist oder nicht. Jetzt lässt sich aber socket.getInputStream() nicht resetten. Gibt es dafür eine Möglichkeit?

Wenn dein Client startet, dann verbindet er sich zum Server.
Wieso willst du socket.getInputStream() denn resetten? Welchen Sinn soll das haben?

Ich glaube es ist für dich einfacher, wenn du erst einmal eine Library wie Vertx verwendest. Anscheinend hast du noch nie mit Networking in Java gearbeitet, da ist etwas Abstraktion vllt. um einiges einfacher.
Dazu verweise ich immer wieder gerne auf meine beiden Tutorials, wie man einen Chat Server & Client mit Vertx schreibt (vollständiger Code liegt auch bei):
 

jemand

Mitglied
Danke für die Antworten. Ich kann ja mal den Code schicken, so wie ich mir das vorgestellt habe. Ich habe auch nicht vor, ein professionelles Chat-System zu schreiben, sondern es dient nur als Nebenprodukt für meine App. Nun ist es aber so, dass ich die Server-Seite per PHP realisiere. Trotzdem kann ich ja mal den Code schicken und vielleicht habt ihr paar Tipps, wie ich es schaffen kann, dass ich die Connection nur einmal öffnen brauche. So wie ich es gemacht habe, wird zwar die Connection nur einmal geöffnet, aber beim zweiten Mal ist dann der InputStream vom Socket leer.

Client:

Java:
public class SocketTask extends AsyncTask<String, Void, String> {

    private int port;
    private List<String> paramList = new ArrayList<String>();

    public SocketTask(int port, List<String> paramList) {
        this.port = port;
        this.paramList = paramList;
    }

    @Override
    protected String doInBackground(String... params) {
        try {
            if (SocketProvider.socket == null) {
                SocketProvider.socket = openConnection(port);
            }
            sendToServer(SocketProvider.socket);
            return readFromServer(SocketProvider.socket);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

    private Socket openConnection(int port) throws Exception {
        SocketAddress socketAddress = new InetSocketAddress(ServerData.HOST_NAME, port);
        Socket socket = new Socket();
        socket.connect(socketAddress, 10000);
        return socket;
    }

    private void sendToServer(Socket socket) throws IOException {
        OutputStream outputStream = socket.getOutputStream();
        PrintStream printStream = new PrintStream(outputStream);

        for (String string : paramList) {
            printStream.println(string);
        }
    }

    private String readFromServer(Socket socket) throws IOException {
        InputStream inputStream = socket.getInputStream();
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));

        StringBuilder stringBuilder = new StringBuilder();

        String line = null;
        while ((line = bufferedReader.readLine()) != null) {
            stringBuilder.append(line);
        }

        return stringBuilder.toString();
    }

}

PHP:
<?php

    require_once "Connection.php";
    $connection = connect();

    set_time_limit (0);
    ob_implicit_flush ();

    $address = '192.168.43.59';
    $port = 10000;

    if (($sock = socket_create(AF_INET, SOCK_STREAM, 0)) === false) {
        echo socket_strerror(socket_last_error())."\n"; 
    }
   
    if (socket_bind($sock, $address, $port) === false) {
        echo socket_strerror(socket_last_error())."\n";
    }
   
    if (socket_listen($sock, 1000) === false) {
        echo socket_strerror(socket_last_error())."\n";
    }

    while (true) {
        if (($client = socket_accept($sock)) === false) {
            echo socket_strerror(socket_last_error())."\n";
            break;
        }
           
        $buffer = socket_read($client, 2048, PHP_NORMAL_READ);
       
        echo "input:".$buffer;
       
        $jsonOfBuffer = json_decode($buffer, true);
        $loggedUser = $jsonOfBuffer["loggedUser"];
        $partner = $jsonOfBuffer["partner"];
       
        require_once "getMessages.php"; // beinhaltet SELECT-Command für Messages
       
        $result = getMessages($connection, $loggedUser, $partner);
        socket_write($client, $result, strlen($result));
       
        echo "output:".$result;
       
        socket_close($client);
    }
   
    socket_close ($sock);
   
    close($connection);
?>
 

JuKu

Top Contributor
@jemand Ich habe selbst lange Zeit PHP programmiert und bin für mich persönlich zu dem Fazit gekommen, dass Sockets in PHP eher nicht so die geilste Lösung sind.
PHP ist eher für "normale" HTTP Anwendungen gedacht gewesen, also für Anwendungen die eine Verbindung zum Server aufbauen, Daten hinschicken, PHP eine Antwort generiert und die Verbindung dann schließt.
Vermutlich erzeugen da Sockets eher Overhead, aber das müsste man wohl mal richtig evaluieren.

Willst du wirklich PHP verwenden? Was spricht gegen ein Java Backend? Dass ein Webspace nicht reicht?
Bitte bedenke: Wenn du einen normalen Webspace hast, dann werden solche Chat Systeme in den AGBs meist nicht geduldet und Sockets werden bei Webspace normalerweise auch gar nicht zugelassen. Einen richtigen (Root / vServer) Server brauchst du also sowieso.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Kirby.exe Wann sind Transactionen Serialisierbar? Datenbankprogrammierung 2
M Oracle Query umbauen (sind die Querys gleich?) Datenbankprogrammierung 5
I Oracle Wie ermitteln, welche Benutzer-(!)Tabellen in einer DB sind? Datenbankprogrammierung 1
G MySQL Java Problem: Nullpointer Exception obwohl Daten vorhanden sind? Datenbankprogrammierung 2
E Wie kann ich textdateien, die als BLOB abgespeichert sind, aus der Datenbanktabelle auslesen? Datenbankprogrammierung 23
E Was sind die Vorteile von DB2 im Gegensatz zu einer Oracle-Datenbank? Datenbankprogrammierung 5
G HSQLDB Inserts/Updates sind nach Neustart der Anwendung Datenbankprogrammierung 1
D MySQL Daten werden aus Datenbank gelesen, obwohl sie dort gar nicht angekommen sind Datenbankprogrammierung 8
U Nur den ersten Datensatz löschen wenn mehrere gleiche da sind Datenbankprogrammierung 2
J Mit einer Abfrage Worte suchen die in Zwei Tabellen enthalten sind Datenbankprogrammierung 5
J Tabellen auflisten, die in einer Datenbank enthalten sind Datenbankprogrammierung 16
G Hilfe: Werte sind alle x2 (oder mehr) nach JOIN Datenbankprogrammierung 13
C Daten finden, die nicht länger als 60 Minuten vergangen sind Datenbankprogrammierung 2
G Select-Abfragen sind sehr langsam Datenbankprogrammierung 7
D Verknüpfung auflösen für Frontend Datenbankprogrammierung 7
R Beste Lösung für User Erstellung in mongodb Datenbankprogrammierung 1
I SaaS Applikation: pro Kunde eine Datenbank / Schema oder eine DB für alle Kunden? Datenbankprogrammierung 76
O apache derby in eclipse für Datenbanken einbauen Datenbankprogrammierung 3
Zrebna Empfehlung für ein kostenloses DB-Hosting gesucht Datenbankprogrammierung 6
M Lösungsvorschläge für Multi-User Datenbankprogrammierung 1
M Alle Records Felder kriegen für DB Abfrage Datenbankprogrammierung 14
pkm PostgreSQL Kann mit mybatis einen Parameter für eine postgreSQL-Abfrage nicht übergeben. Datenbankprogrammierung 5
Kirby.exe Denkanstoß für Ranking Datenbankprogrammierung 1
L Oracle Repräsentative Namen für die Column Types Datenbankprogrammierung 9
OnDemand Struktur für Parent / Child Produkt Datenbankprogrammierung 5
N ORM für Sqlite Datenbankprogrammierung 4
I Konzept: Klasse / Entity für Einstellung der Software Datenbankprogrammierung 3
H suche eine Login system Bibliothek für Java Datenbankprogrammierung 5
ruutaiokwu MySQL MariaDB-Client-Zertifkate, nur für einen bestimmten User Datenbankprogrammierung 5
B Datenmodell für Regeln + Bedingungen & Referenz auf andere Tabelle Datenbankprogrammierung 12
O Dokumentation für MariaDB 10.3. Datenbankprogrammierung 2
F MariaDatabase Einstellungen für Verbindungen Datenbankprogrammierung 5
Dimax MySQL Trigger für eine Spalte Datenbankprogrammierung 5
Dimax MySQL Maximale Datenlänge für eine Spalte einer Datenbank in java ermitteln Datenbankprogrammierung 15
platofan23 MySQL Java Programm findet Treiber für mySQL auf Debian-Server nicht? Datenbankprogrammierung 11
B Brauche Tipps für Datenbankdesign Datenbankprogrammierung 8
B Tabelle für "wiederkehrende Rechnungen" Datenbankprogrammierung 12
Danloc Informationen für Datenbankverbindung wo/wie speichern? Datenbankprogrammierung 11
R Java-Befehle/Operatoren für copy&paste Datenbankprogrammierung 2
X PostgreSQL Datenbankdesign für Vokabeltrainer Datenbankprogrammierung 48
@SupressWarnings() HSQLDB Datenbank für mein Dorfbauspiel "Time of Kings" Datenbankprogrammierung 6
M Idee Umsetzung //NFC Eintrittskarten für Geburtstag Datenbankprogrammierung 2
looparda Architektur für JPA Hibernate Umstieg Datenbankprogrammierung 14
P Datanbank für Java-Programmierung Datenbankprogrammierung 10
M Feedback für neues Buch über "Java und Datenbanken" erwünscht Datenbankprogrammierung 8
J SQLite Ich muss für mein Projekt meine Datenbank Kapseln Datenbankprogrammierung 2
J Tipps für ERM Datenbankprogrammierung 4
P Highlevel-Lösung für Speicherung von Baumstruktur mit unbekannter Tiefe Datenbankprogrammierung 1
F welche Datenbank für Messwerte? Datenbankprogrammierung 4
E Warum werden für Datenbanktabellen Schemanamen festgelegt? Datenbankprogrammierung 1
M DB Schema für Vokabeltrainer Datenbankprogrammierung 2
U SQLite Für mich etwa komplexe Abfrage via 2 Tabellen Datenbankprogrammierung 5
E Kann man, wenn man in DB2 Tabellen erstellt hat für dessen auch einen Command-File erstellen? Datenbankprogrammierung 1
T NoSQL Connection für die Thesis [GWT] Datenbankprogrammierung 1
J SQLite Abfrage ausführen stoppt für Zyklus? Wie es zu lösen? Datenbankprogrammierung 3
S HSQLDB Fehlermeldung für den Bildschirm Datenbankprogrammierung 3
L Datenmodell erstellen für eine Nutzertanalyse Datenbankprogrammierung 1
I Query für Geburtstage Datenbankprogrammierung 6
L Zentrale Datenbank im Internet für Spiele Highscores? Datenbankprogrammierung 1
P Derby/JavaDB Csv Datei für dieses Musterprogramm Datenbankprogrammierung 12
ruutaiokwu code-formatter für t-sql... Datenbankprogrammierung 12
J Plug-In-Framework für Hibernate-Klassen Datenbankprogrammierung 0
T Mehrsprachigkeit für Tabellenfelder Datenbankprogrammierung 6
E MySQL Große Datenmengen reibungslos speichern für Gameserver Datenbankprogrammierung 6
F MSSql oder MongoDB für die Speicherung von POI Datenbankprogrammierung 9
G SQLite SQLite Select für View vereinfachen/optimieren Datenbankprogrammierung 4
P MySQL Historie für ein Objekt anlegen Datenbankprogrammierung 5
P MySQL eine richtige Datenbank für einen routenplaner erstellen Datenbankprogrammierung 2
K JDBC- In Java "stored procedure" erstellen für DB2,OracleSql ... Datenbankprogrammierung 3
J Datenbank für Fragen/ Antworten Datenbankprogrammierung 7
O Datenbankschnittstelle für Java Datenbankprogrammierung 8
L Datenbank für kleinere Anwendungen Datenbankprogrammierung 3
N Query für Derby DB mit Enterbrise Bean Datenbankprogrammierung 4
S ich brauche tipps für JDBC Datenbankprogrammierung 4
I Hibernate - Best Practice für Lazy Loading Datenbankprogrammierung 3
R MySQL Voraussetzungen für eine erfolgreiche Datenbankanbindung mittels JDBC Datenbankprogrammierung 2
GianaSisters SQL Befehl für allgemeine Datenbankexistenz Datenbankprogrammierung 4
B Beispiel für sicheres DBUsername/DBPassword handling Datenbankprogrammierung 4
I Anfänger-Tutorial für Hibernate gesucht Datenbankprogrammierung 3
heart_disease Beratung für Datenbankdesign Datenbankprogrammierung 13
C Embedded DB für Java Datenbankprogrammierung 26
J Unterstützung für verschiedene Datenbanken Datenbankprogrammierung 2
L MySQL Probleme mit PreparedStatement für SQL-Abfrage in Java Datenbankprogrammierung 2
F suche Erstanschub für DB-Zugriff Datenbankprogrammierung 9
F MySQL SQL Abfrage für u.a. Spaltenname key Datenbankprogrammierung 4
T ResultSet befehl für leere Spalte nicht lesen Datenbankprogrammierung 4
F Performance-Tool für Oracle Datenbankprogrammierung 2
T Kleine Tabellen für schnellere abfragen? Datenbankprogrammierung 3
C Split String für SQl query Datenbankprogrammierung 10
A update methode für datenbank Datenbankprogrammierung 2
N Datenbank für Dateien Datenbankprogrammierung 6
N Datenbank für einen Stundenplan Datenbankprogrammierung 4
G welche Datenbanktabellen für folgende Attribute Datenbankprogrammierung 3
R Connection Problem für eine externe DB mit Java (JDBC) Datenbankprogrammierung 9
S JPA (EntityManager für jeden Nutzer?) Datenbankprogrammierung 8
J Buffer Manager für Datenbank Datenbankprogrammierung 4
F SQL Voraussetzung für JDBC? Datenbankprogrammierung 10
R Bei Webformular DropDown Felder JA, NEIN! Was für einen Datentyp verwenden? Datenbankprogrammierung 7
T SSL Zertifikat für mysql datenbankzugriff Datenbankprogrammierung 6
T Debugger für SQL? Datenbankprogrammierung 5

Ähnliche Java Themen

Neue Themen


Oben