OOP IRC Client

MWin123

Bekanntes Mitglied
Hallo,

als mein erstes größeres Projekt möchte ich mir einen Twitch Client für Windows schreiben.

Zuerst möchte ich mal nur den Chat implementieren.
Den Twitch Chat gibt es über ein IRC Interface.
https://github.com/justintv/Twitch-API/blob/master/IRC.md

Bisher habe ich eine Verbindung aufgebaut und konnte auch einen Channel joinen und die gesendeten Nachrichten lesen. Jedoch ist mir nicht ganz klar, wie ich den Output vom IRC Server "analysieren" soll. Also z.B. warten bis die Verbindung hergestellt wurde oder auf private Nachrichten reagieren.

Bisher habe ich:
Java:
package chat;

import java.io.*;
import java.net.Socket;

public class Client {

    private String server;
    private int port;
    private String nick;
    private String password;
    private String channel;

    private Socket socket;
    private BufferedWriter writer;
    private BufferedReader reader;

    private final String NEWLINE = "\r\n";

    public BufferedReader getReader() {
        return reader;
    }

    public Client(String server, int port, String nick, String password) throws IOException {
        this.server = server;
        this.port = port;
        this.nick = nick;
        this.password = password;

        socket = new Socket(server, port);
        writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    }

    public void connect() throws IOException {
        writer.write("PASS " + password + NEWLINE);
        writer.write("NICK " + nick + NEWLINE);
        writer.flush();

        // Read lines from the server until it tells us we have connected.
        waitForCode("004");

        Thread listener = new Thread(() ->
        {
            IRCAdapter ircAdapter = new IRCAdapter(writer, reader);
            ircAdapter.setDaemon(true);
            ircAdapter.start();
        });
        listener.start();
    }

    public void disconnect() {

    }

    public void join(String channel) throws IOException {
        writer.write("JOIN " + channel + NEWLINE);
        writer.flush();

        waitForCode("366");
    }

    public void leave(String channel) {

    }

    public void message(String message) throws IOException {
        //TODO doesnt work
        writer.write("PRIVMSG " + channel + " :" + message + NEWLINE);
        writer.flush();
    }

    //TODO Bessere Implementierung, eventuell mit Listener
    private void waitForCode(String code) throws IOException {
        String line;
        while ((line = reader.readLine()) != null) {
            System.out.println(line);

            if (line.contains(code)) {
                return;
            }
        }
    }
}

Java:
package chat;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.util.Objects;

public class Helper extends Thread {
    private BufferedWriter writer;
    private BufferedReader reader;

    private final String NEWLINE = "\r\n";

    public Helper(BufferedWriter writer, BufferedReader reader) {
        this.writer = writer;
        this.reader = reader;
    }

    @Override
    public synchronized void start() {
        super.start();
        Objects.requireNonNull(writer);
        Objects.requireNonNull(reader);

        String line;
        try {
            while ((line = reader.readLine()) != null) {
                if (line.startsWith("PING ")) {
                    writer.write("PONG " + line.substring(5) + NEWLINE);
                    writer.flush();
                    System.out.println("PONG");
                }
                System.out.println(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
Java:
import chat.Client;

import java.io.IOException;

public class MainApp {

    public static void main(String[] args) throws IOException {
        Client client = new Client("irc.twitch.tv", 6667, "-entfernt-", "-entfernt-");

        client.connect();
        client.join("#-entfernt-");

        System.out.println("reached");
    }
}

Meine Probleme sind: Implementierung von Listenern, Threads

Ich habe mir schon die Klassen für Listener und Events geschrieben, jedoch weiß ich nicht, wo ich die hinpacken soll.
Java:
package chat;

import java.util.EventListener;

public interface Listener extends EventListener {

    void onEvent(Event event);
}
Java:
package chat;

import java.util.EventObject;

public abstract class Event extends EventObject {

    private Client client;

    public Event(Object source) {
        super(source);
        this.client = (Client) source;
    }

    public Client getClient() {
        return client;
    }
}

Java:
package chat;

public class ConnectEvent extends Event {

    public ConnectEvent(Object source) {
        super(source);
    }
}

Bisher warte ich mit der Methode waitForCode(String code) bis eine Verbindung herstellt wurde. Die Methode blockiert solange, bis der BufferedWriter eine gewissen Code vom IRC Server erhält.

Was wäre hier eine schönere Lösung?
 

eldrior

Aktives Mitglied
Um die waitForCode(...) wirst du wohl kaum rumkommen, allerdings könntest du diese in einen zusätzlichen Thread auslagern, dann wird nur dieser blockiert. Die Benachrichtigung könntest du dann entweder lösen, indem du dem Thread das zu benachrichtigende Objekt übergibst, oder du machst das schön ;)
 

MWin123

Bekanntes Mitglied
Hallo,
ich habe die beiden Bände der Insel bei mir zu Hause stehen und habe die Kapitel zu Threads und Design-Pattern schon gelesen.

Nur weiß ich nicht, wie ich die Listener hier umsetzen soll.

Soll ich den BufferReader, der die Nachrichten vom Server empfängt, in einem Thread auslagern, der jede Line analysiert und bei einem Treffer ein Event auslöst?
 

eldrior

Aktives Mitglied
Das wäre ja in sofern gut, als dass bei vielen Benachrichtigungen die Analysen auf verschiedene Threads verteilt werden, also vom Ding her ne gute Möglichkeit.
Alternativ kannst du auch mit jeder Nachricht ein Objekt benachrichtigen, das den Spaß dann analysiert und dann weiter gibt, aber das wäre keine so schöne Lösung.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
F InfluxDB Client, fehlende Referenz Allgemeine Java-Themen 5
F Einfacher TCP Client (non blocking) Allgemeine Java-Themen 1
OnDemand ApacheCommon FTP Client zuckt nicht Allgemeine Java-Themen 3
E Server Client Audio Allgemeine Java-Themen 6
E Server Client Audio Allgemeine Java-Themen 0
TonioTec Api für Datenaustausch zwischen Client und Server Allgemeine Java-Themen 0
C Java RMI Client - Server Allgemeine Java-Themen 0
S Simples Client Server Setup in Java Allgemeine Java-Themen 4
M JVM: Client Software Logging und Profiling aktivieren Allgemeine Java-Themen 1
OnDemand REST Client programmierens Allgemeine Java-Themen 4
J Soap Client mit mehreren URLs in Servlets Allgemeine Java-Themen 0
T Google Distance Matrix API Hello World/ Client Secret Allgemeine Java-Themen 3
C Hang Man Server Client Allgemeine Java-Themen 3
C Hang man mit Server/Client Allgemeine Java-Themen 2
B Web-Anwendung funktioniert mit Java 1.8, aber nicht mit Java 1.7 (auf Client) Allgemeine Java-Themen 5
D JAVA Basiertes Spiel aus dem Internet in eigenem Client laden Allgemeine Java-Themen 3
P CXF 3.0.1 WebService- Client Allgemeine Java-Themen 0
M Checksummenprüfung bei Client Server kommunikation Allgemeine Java-Themen 3
B Java Mail Client als Outlook ausgeben Allgemeine Java-Themen 2
Z Java E-Mail Client mit End-to-End-Verschlüsselung Allgemeine Java-Themen 4
E Socket Client-Server-Programmierung Allgemeine Java-Themen 44
T Java Streaming-Server & Streaming-Client Allgemeine Java-Themen 4
0 Lösungsweg Client Server Kommunikation Fehlermeldung ausgeben Allgemeine Java-Themen 12
D Client / Server Allgemeine Java-Themen 23
M HTTP Client Zertifikat sicher übertragen? Wie? Allgemeine Java-Themen 2
eskimo328 Swing Client Anwendung für MAC OS (Update Routine) Allgemeine Java-Themen 6
Z Threads Thread für einen Client Allgemeine Java-Themen 9
J Zugriff auf Poker-Client Fenster Allgemeine Java-Themen 14
G REST Client / URL Parser Allgemeine Java-Themen 2
S Java Kommandozeilen - Client Allgemeine Java-Themen 3
T JPA Entity im Client-Server-Umfeld Allgemeine Java-Themen 19
M Client für einen Webservice erstellen (ONVIF) Allgemeine Java-Themen 3
B mehrere services in einem client Allgemeine Java-Themen 10
D Versuch Server - Client anwendung Allgemeine Java-Themen 9
T Welcher Server? JSP und Client-Anwendung Allgemeine Java-Themen 4
MQue Server- Thread Client Allgemeine Java-Themen 2
D design client server Allgemeine Java-Themen 10
O binärer Suchbaum mit client server., objekte speichern. Allgemeine Java-Themen 2
F Java Server VM/ Client VM Allgemeine Java-Themen 7
J JSP Client LInk einbauen Allgemeine Java-Themen 15
J Client Allgemein Allgemeine Java-Themen 10
V Ausführung Client- oder Serverseitig? Allgemeine Java-Themen 13
A Client/Server-Anwendung Allgemeine Java-Themen 3
T Proxys: Idee für den Callback vom Server zum Client? Allgemeine Java-Themen 3
S SMTP-Limit bei Newsletter-Client Allgemeine Java-Themen 5
thE_29 Simpler FTP Client Allgemeine Java-Themen 3
G Performance Problem bei der Übertragung Server zum Client Allgemeine Java-Themen 3
J java vnc client verbessern: KeyEvent.VK_ALT keine Wirkung? Allgemeine Java-Themen 12
E NT-Anmeldung in Java Client-Applikation nutzen. JAAS ? Allgemeine Java-Themen 5
T einen SVN- oder QVCS-Client selber programmieren Allgemeine Java-Themen 2
M Tool zum autom. Client-Update Allgemeine Java-Themen 2
M kennt jemand nen gute email client in java mit imap? Allgemeine Java-Themen 3
H Datenbank an ein Java Client Server Programm anschliessen Allgemeine Java-Themen 3
A Was ist bei einem Servlet beim Client notwendig? Allgemeine Java-Themen 22
D ldap zugriff mit Java Client Allgemeine Java-Themen 2
A Daten-Synchronisation Client <-> Datenquelle (DB) ? Allgemeine Java-Themen 6
G Servlet - "Client immer am neuesten Stand" Allgemeine Java-Themen 2
G EMail Client Allgemeine Java-Themen 7

Ähnliche Java Themen


Oben