Socket IRC Client nicht kompatibel mit Server

purzel

Bekanntes Mitglied
Hallo,

ich suche mir jetzt schon den Wolf ab. Ich habe einen IRC-Client geschrieben. Das Problem besteht darin, das ich immer wieder folgende Fehlermeldung erhalte:


:underworld2.no.quakenet.org 513 tester85 :Your client may not be compatible with this server.
:underworld2.no.quakenet.org 513 tester85 :Compatible clients are available at ftp://ftp.undernet.org/pub/irc/clients
ERROR :Closing Link: tester85 by underworld2.no.quakenet.org (Registration Timeout)


Wer hat einen Rat für mich wie ich das umgehen kann?

Falls Code oder andere Meldungen erwünscht sind, bitte Bescheid geben!

Gruß

Purzel
 

purzel

Bekanntes Mitglied
Mh, hört sich gut an! Werde es auf jeden Fall probieren. Danke schonmal :)

€dit: hat leider nichts gebracht, gleiches Ergebnis :(
 
Zuletzt bearbeitet:

HoaX

Top Contributor
Gibts deinen Client irgendwo zum Download? Dann schau ich später mal drüber

Quakenet sollte ja auch ohne Ident gehn.
 

purzel

Bekanntes Mitglied
Hier der Quellcode, leider etwas verspätet :noe:

Java:
package name.purzel;

import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;

public class IRC_Client implements Runnable {
	public static final int PORT = 6667;
	public static final String HOST = "irc.de.quakenet.eu.org";
	Socket socket;
	DataInputStream in;
	DataOutputStream out;
	JTextField inputfield;
	JTextArea outputarea;
	Thread thread;
	
	public IRC_Client() {
		/*
		 * LAYOUT
		 */
		JFrame f = new JFrame("Java IRC Client");
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setSize(600, 300);
		f.setLayout(new BorderLayout());

		inputfield = new JTextField();
		outputarea = new JTextArea();
		outputarea.setFont(new Font("Dialog", Font.PLAIN, 12));
		outputarea.setEditable(false);

		f.add("South", inputfield);
		f.add("Center", outputarea);
		f.setBackground(Color.lightGray);
		f.setForeground(Color.black);
		inputfield.setBackground(Color.white);
		inputfield.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				String text = inputfield.getText();
				outputarea.append(text + " \n");
				try {
					out.write(text.getBytes());
					out.flush();
				} catch (IOException e1) {
					e1.printStackTrace();
				}
				inputfield.setText("");
			}
		});
		outputarea.setBackground(Color.white);
		
		//f.pack();
		f.setVisible(true);
		
		/*
		 * TECHNIK
		 */
		//Start
		try {
			socket = new Socket(HOST, PORT);
			in = new DataInputStream(socket.getInputStream());
			out = new DataOutputStream(socket.getOutputStream());
		} catch (IOException e) {
			System.out.println("Verbindung zum Server fehlgeschlagen!");
			System.exit(1);
		}
		outputarea.append("Verbindung zum Server aufgenommen...\n");
		try {
			out.write("PASS test \n".getBytes());
		    out.flush();
		    out.write("NICK tester85 \n".getBytes());
		    out.flush();
		    out.write("USER tester85 0 0 :Christian \n".getBytes());
		    out.flush();
		    out.write("JOIN mychannel \n".getBytes());
		    out.flush();
		} catch (IOException e1) {
			e1.printStackTrace();
		}
		run();

		if (thread == null) {
			thread = new Thread(this);
			thread.setPriority(Thread.MIN_PRIORITY);
			thread.start();
		}
		
		//Stop
		/*try {
			socket.close();
		} catch (IOException e) {
			
		}*/

		if ((thread != null) && thread.isAlive()) {
			thread.stop();
			thread = null;
			try {
				socket.close();
			} catch (IOException e1) {
				e1.printStackTrace();
			}
		}
	}

	public static void main(String[] args) {
		new IRC_Client();
	}

	public void run() {
		String line;

		try {
			while(true) {
				line = in.readLine();
				if(line != null) {
					outputarea.append(line + " \n");
				}
			}
		} catch (IOException e) {
			try {
				out.write("Verbindung zum Server abgebrochen".getBytes());
			} catch (IOException e1) {
				e1.printStackTrace();
			}
			inputfield.setEnabled(false);
		}
	}
}
 

HoaX

Top Contributor
Hä? Der Identd läuft wenn dann auf dem Clientrechner, wieso soll sich der Client da nochmal verbinden?

Edit: Hab mir eben den Code durchgesehen, und is für mich eigentlich klar was fehlt: du beantwortest den PING vom Server nicht! Dadurch fliegst du nach einer bestimmten Zeit dann vom Server. Siehe RFC 1459, Abschnitt 4.6.2 und 4.6.3.
 
Zuletzt bearbeitet:

purzel

Bekanntes Mitglied
Hä? Der Identd läuft wenn dann auf dem Clientrechner, wieso soll sich der Client da nochmal verbinden?

Versteh ich leider nicht! PS: der Tipp von raiL hat leider nix gebracht - gleiches Ergebnis...

Edit: Hab mir eben den Code durchgesehen, und is für mich eigentlich klar was fehlt: du beantwortest den PING vom Server nicht! Dadurch fliegst du nach einer bestimmten Zeit dann vom Server. Siehe RFC 1459, Abschnitt 4.6.2 und 4.6.3.

Ok, ich müsste also rein therotisch gesehen den PING abfangen (z.B. PING 1234567890) und dann ein PONG 1234567890 machen?

Verstehe ich das richtig?

Falls ja, wie komme ich an den Wert vom PING?

€dit: Ok, die Fehlermeldung von meinem ersten Post ist weg, dafür kommt nun folgendes:

Verbindung zum Server aufgenommen...
NOTICE AUTH :*** Looking up your hostname
NOTICE AUTH :*** Checking Ident
NOTICE AUTH :*** Found your hostname
NOTICE AUTH :*** No ident response
NOTICE AUTH :*** No ident response
ERROR :Closing Link: by clanserver4u1.de.quakenet.org (Registration Timeout)
 
Zuletzt bearbeitet:

musiKk

Top Contributor
Örm. Also PING-Anfragen zu beantworten gehört ja wirklich zum Urschleim des Protokolls. Dass es daran gehapert hat... Vielleicht solltest Du mal die entsprechenden RFCs lesen. Das mag vielleicht trocken und umständlich scheinen, wenn man ein Protokoll umsetzen möchte, ist das aber sehr hilfreich. Sonst hangelt man sich nur von einem Fehler zum nächsten.

Der jetzige Fehler kommt offensichtlich vom oben bereits angesprochenen fehlenden Ident.
 

purzel

Bekanntes Mitglied
Alles klar, danke für den Hinweis. Das Problem liegt ja darin, das ich noch nie vorher mit Netzwerkprogrammierung was zu tun hatte. Ist eben neu für mich :shock:

€dit: wie komme ich eigentlich an meine empfangenen Daten, wie das PING? Mit einem

Java:
public void pong(JTextArea output) {
	LineNumberReader lnr = new LineNumberReader(new StringReader(output.getText()));
	String line;
	try {
		while((line = lnr.readLine()) != null) {
			System.out.println(lnr.getLineNumber() + " > " + line);
		}
	} catch(IOException e) {
		e.printStackTrace();
	}
}

funktioniert es nicht wirklich, da ich nur

Code:
1 > Verbindung zum Server aufgenommen...

erhalte, statt:

Code:
1 > Verbindung zum Server aufgenommen...
2 > NOTICE AUTH :*** Looking up your hostname 
3 > NOTICE AUTH :*** Checking Ident 
4 > NOTICE AUTH :*** Found your hostname 
5 > PING :1297319964
...

LG Purzel
 
Zuletzt bearbeitet von einem Moderator:

purzel

Bekanntes Mitglied
So, ich habe nun etwas länger gebraucht um die richtige Methode zu schreiben, Sie funktioniert so weit, aber es gibt einen neuen Fehler (vllt. kann mir einer dabei helfen, was das bedeutet (Übersetzt weiß ich es ja, aber der Sinn ???:L)).

Hier erstmal der erweiterte QT:

Java:
package name.purzel;

import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.Popup;
import javax.swing.PopupFactory;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.LineNumberReader;
import java.io.StringReader;
import java.net.Socket;

public class IRC_Client implements Runnable {
	public static final int PORT = 6667;
	public static final String HOST = "irc.de.quakenet.eu.org";
	public static final String TEST_HOST = "masterpurzel.dyndns-server.com";
	JFrame f;
        Socket socket;
	DataInputStream in;
	DataOutputStream out;
	JTextField inputfield;
	JTextArea outputarea;
	Thread thread;
	
	public IRC_Client() {
		/*
		 * LAYOUT
		 */
		f = new JFrame("Java IRC Client");
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setSize(750, 450);
		f.setLayout(new BorderLayout());

		inputfield = new JTextField();
		outputarea = new JTextArea();
		outputarea.setFont(new Font("Dialog", Font.PLAIN, 12));
		outputarea.setEditable(false);

		f.add("South", inputfield);
		f.add("Center", outputarea);
		f.setBackground(Color.lightGray);
		f.setForeground(Color.black);
		inputfield.setBackground(Color.white);
		inputfield.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				String text = inputfield.getText();
				outputarea.append(text + " \n");
				try {
					out.write(text.getBytes());
					out.flush();
				} catch (IOException e1) {
					e1.printStackTrace();
				}
				inputfield.setText("");
			}
		});
		outputarea.setBackground(Color.white);
		
		//f.pack();
		f.setVisible(true);
		
		/*
		 * TECHNIK
		 */
		//Start
		try {
			socket = new Socket(HOST, PORT);
			in = new DataInputStream(socket.getInputStream());
			out = new DataOutputStream(socket.getOutputStream());
		} catch (IOException e) {
			System.out.println("Verbindung zum Server fehlgeschlagen!");
			System.exit(1);
		}
		outputarea.append("Verbindung zum Server aufgenommen...\n");
		try {
			out.write("1029, 113 : purzel : UNIX : debian".getBytes());
		        out.flush();		    
		        out.write("USER tester85 localhost irc.de.quakenet.eu.org :Tester85".getBytes());
		        out.flush();
		        out.write("NICK tester85 \r\n".getBytes());
		        out.flush();
		        //out.write("PASS test".getBytes());
		        //out.flush();
		        out.write("SERVER 127.0.0.1 5 :Experimental server; New server test.purzel.name introducing itself and attempting to register. The name in []'s is the hostname for the host running test.purzel.name.".getBytes());
		        out.flush();
		        //out.write("PRIVMSG NickServ :IDENTIFY test".getBytes());
		        //out.flush();
		        out.write("JOIN cynamite".getBytes());
		        out.flush();
		} catch (IOException e1) {
			e1.printStackTrace();
		}
		run();

		if (thread == null) {
			thread = new Thread(this);
			thread.setPriority(Thread.MIN_PRIORITY);
			thread.start();
		}
		
		//Stop
		/*try {
			socket.close();
		} catch (IOException e) {
			
		}*/

		if ((thread != null) && thread.isAlive()) {
			thread.stop();
			thread = null;
			try {
				socket.close();
			} catch (IOException e1) {
				e1.printStackTrace();
			}
		}
	}

	public static void main(String[] args) {
		new IRC_Client();
	}

	@SuppressWarnings("deprecation")
	public void run() {
		String line;

		try {
			while(true) {
				line = in.readLine();
				if(line != null) {
					outputarea.append(line + " \n");
					out.write(line.getBytes());
					pong(outputarea);
				}
			}
		} catch (IOException e) {
			try {
				out.write("Verbindung zum Server abgebrochen".getBytes());
			} catch (IOException e1) {
				e1.printStackTrace();
			}
			inputfield.setEnabled(false);
		}
	}
	
	public void pong(JTextArea output) {
		LineNumberReader lnr = new LineNumberReader(new StringReader(output.getText()));
		String line;
		try {
			while((line = lnr.readLine()) != null) {
				System.out.println(lnr.getLineNumber() + " > " + line);
				if(line.indexOf("PING") != -1) {
					System.out.println("test");
					String[] ping = line.split(":");
					System.err.println(ping[1]);
					String[] pong = {"PONG " + ping[1] + "\r\n"};
					out.write(pong[0].getBytes());
					System.err.println(pong[0]);
				}
				if(line.indexOf("Closing Link") != -1) {
					System.err.println("Verbindung zum Server wurde unerwartet geschlossen!");
					PopupFactory factory = PopupFactory.getSharedInstance();
					JLabel hinweis = new JLabel("Die Verbindung zum Server wurde unerwartet geschlossen!");
					JButton ok = new JButton("Close");
					final Popup l_popup = factory.getPopup(f, hinweis, 50, 150);
					final Popup b_popup = factory.getPopup(f, ok, 50, 165);
					ok.addActionListener(new ActionListener() {
			            public void actionPerformed(ActionEvent arg0) {
			                l_popup.hide();
			                b_popup.hide();
			            }
			        });
				    l_popup.show();
				    b_popup.show();
					socket.close();
					inputfield.setEnabled(false);
				}
			}
		} catch(IOException e) {
			e.printStackTrace();
		}
	}
}

als Ausgabe erhalte ich:

1 > Verbindung zum Server aufgenommen...
2 > NOTICE AUTH :*** Looking up your hostname
3 > NOTICE AUTH :*** Checking Ident
4 > NOTICE AUTH :*** Found your hostname
5 > PING :1876835940
test
1876835940
PONG 1876835940

6 > ERROR :Closing Link: tester85 by clanserver4u2.de.quakenet.org (Cannot connect a server to a user port)

Wer findet den Fehler?

LG

Purzel
 
Zuletzt bearbeitet:

purzel

Bekanntes Mitglied
Hallo,

ich habe nun mein Programm gänzlich umgebaut. Eine neue Methode ist dazugekommen. Wenn ich das Programm starte kommt immer wieder der gleiche Fehler, Register first etc., wenn ich allerdings den neuen JButton mit der neuen Methode anklicke, dann kommt folgendes:

13 > :clanserver4u2.de.quakenet.org 451 tester85 :Register first.
14 > :clanserver4u2.de.quakenet.org 451 tester85 tester85 :Register first.
15 > :clanserver4u2.de.quakenet.org 451 tester85 tester85 :Register first.
16 > NOTICE AUTH :*** No ident response
17 > :clanserver4u2.de.quakenet.org 001 tester85 :Welcome to the QuakeNet IRC Network, tester85
18 > :clanserver4u2.de.quakenet.org 002 tester85 :Your host is clanserver4u2.de.quakenet.org, running version u2.10.12.10+snircd(1.3.4a)
19 > :clanserver4u2.de.quakenet.org 003 tester85 :This server was created Sat Mar 15 2008 at 06:32:28 CET
20 > :clanserver4u2.de.quakenet.org 004 tester85 clanserver4u2.de.quakenet.org u2.10.12.10+snircd(1.3.4a) dioswkgxRXInP biklmnopstvrDcCNuMT bklov
21 > :clanserver4u2.de.quakenet.org 005 tester85 WHOX WALLCHOPS WALLVOICES USERIP CPRIVMSG CNOTICE SILENCE=15 MODES=6 MAXCHANNELS=20 MAXBANS=45 NICKLEN=15 :are supported by this server
22 > :clanserver4u2.de.quakenet.org 005 tester85 MAXNICKLEN=15 TOPICLEN=250 AWAYLEN=160 KICKLEN=250 CHANNELLEN=200 MAXCHANNELLEN=200 CHANTYPES=#& PREFIX=(ov)@+ STATUSMSG=@+ CHANMODES=b,k,l,imnpstrDducCNMT CASEMAPPING=rfc1459 NETWORK=QuakeNet :are supported by this server
test
clanserver4u2.de.quakenet.org 005 tester85 MAXNICKLEN=15 TOPICLEN=250 AWAYLEN=160 KICKLEN=250 CHANNELLEN=200 MAXCHANNELLEN=200 CHANTYPES=#& PREFIX=(ov)@+ STATUSMSG=@+ CHANMODES=b,k,l,imnpstrDducCNMT CASEMAPPING=rfc1459 NETWORK=QuakeNet
PONG clanserver4u2.de.quakenet.org 005 tester85 MAXNICKLEN=15 TOPICLEN=250 AWAYLEN=160 KICKLEN=250 CHANNELLEN=200 MAXCHANNELLEN=200 CHANTYPES=#& PREFIX=(ov)@+ STATUSMSG=@+ CHANMODES=b,k,l,imnpstrDducCNMT CASEMAPPING=rfc1459 NETWORK=QuakeNet

23 > :clanserver4u2.de.quakenet.org 251 tester85 :There are 15 users and 65309 invisible on 43 servers
24 > :clanserver4u2.de.quakenet.org 252 tester85i 70 :eek:perator(s) online
25 > :clanserver4u2.de.quakenet.org 253 tester85 3 :unknown connection(s)
26 > :clanserver4u2.de.quakenet.org 254 tester85 53121 :channels formed
27 > :clanserver4u2.de.quakenet.org 255 tester85 :I have 5388 clients and 1 servers
28 > :clanserver4u2.de.quakenet.org NOTICE tester85 :Highest connection count: 7271 (7270 clients)
29 > :clanserver4u2.de.quakenet.org 375 tester85 :- clanserver4u2.de.quakenet.org Message of the Day -
30 > :clanserver4u2.de.quakenet.org 372 tester85 :- 2008-1-7 0:53
31 > :clanserver4u2.de.quakenet.org 372 tester85 :- _ _ _
32 > :clanserver4u2.de.quakenet.org 372 tester85 :- ___| | __ _ _ __ ___ ___ _ ____ _____ _ __| || | _ _
33 > :clanserver4u2.de.quakenet.org 372 tester85 :- / __| |/ _` | '_ \/ __|/ _ \ '__\ \ / / _ \ '__| || |_| | | |
34 > :clanserver4u2.de.quakenet.org 372 tester85 :- | (__| | (_| | | | \__ \ __/ | \ V / __/ | |__ _| |_| |
35 > :clanserver4u2.de.quakenet.org 372 tester85 :- \___|_|\__,_|_| |_|___/\___|_| \_/ \___|_| |_| \__,_|
36 > :clanserver4u2.de.quakenet.org 372 tester85 :-

Heißt das jetzt, das ich im IRC drin bin?

LG

Purzel
 

musiKk

Top Contributor
Zumindest die Meldung 16 sollte egal sein. Ich meine zumindest mich zu erinnern, dass das auch bei anderen Clients beim Connect immer vorbei geflogen ist.

Bzgl. Join: Benutzt Du die richtige Syntax? Das Protokoll verwendet ja keine vorangestellten Schrägstriche bei den Befehlen. Ich verweise wieder auf das RFC, da gibt es auch Beispiele. Wenn das alles stimmt: Was passiert? Was heißt "nicht angenommen"? Gibt es Fehlermeldungen?
 

purzel

Bekanntes Mitglied
Bzgl. Join: Benutzt Du die richtige Syntax? Das Protokoll verwendet ja keine vorangestellten Schrägstriche bei den Befehlen. Ich verweise wieder auf das RFC, da gibt es auch Beispiele. Wenn das alles stimmt: Was passiert? Was heißt "nicht angenommen"? Gibt es Fehlermeldungen?

Meine Anweisung sieht so aus:

Java:
out.write("JOIN channel \r\n".getBytes());
out.flush();

und wenn ich es im Programm eingebe, so:


Ltd. dem RFC muss es so eingegeben werden, wie ich es im Code habe! Nicht angenommen heißt, es gibt keine Reaktion, keine Fehlermeldung etc.!!
 

bERt0r

Top Contributor
1. Du musst deine Runnable mit new Thread(this).start() nicht mit run() starten. Creating a Java Thread by implementing Runnable Interface
2. Machst du die Raute (#) vor den Channelnamen bei deinen Join Kommandos?
3. Zu deiner Programmstruktur würde ich dir raten die GUI und den Thread der mit dem IRC Server kommuniziert zu trennen und jeweils in eine eigene Klasse zu packen. Dann kannst du auch algorythmisch das ganze sauberer lösen:
Code:
1. Gui starten
2. Benutzer klickt auf Connect
3. Verbindungs Objekt erstellen
4. Mit Server verbinden
5. Chatten was das zeug hält
 

purzel

Bekanntes Mitglied
@bERt0r: Danke für den Hinweis! Werde das mal umsetzen und mich dann wieder melden.

Btw. 2.: im Quellcode nein, aber im Programm schon

Btw. 3.: das mit 2 Klassen ist mir auch schon in den Sinn gekommen, wollte es aber erst mal so lösen...

€dit: jetzt ist der Fehler schon wieder da! Weiß aber nicht mehr wodurch er wieder kam ???:L

Verbindung zum Server aufgenommen...
NOTICE AUTH :*** Looking up your hostname
NOTICE AUTH :*** Checking Ident
NOTICE AUTH :*** Found your hostname
PING :171657833
PONG 171657833
:clanserver4u1.de.quakenet.org 451 purzel purzel :Register first.
PONG 171657833
:clanserver4u1.de.quakenet.org 451 purzel purzel :Register first.
PONG 171657833
NOTICE AUTH :*** No ident response
PONG 171657833
NOTICE AUTH :*** No ident response
PONG 171657833
:clanserver4u1.de.quakenet.org 513 purzel :Your client may not be compatible with this server.
PONG 171657833
:clanserver4u1.de.quakenet.org 513 purzel :Compatible clients are available at ftp://ftp.undernet.org/pub/irc/clients
PONG 171657833
ERROR :Closing Link: purzel by clanserver4u1.de.quakenet.org (Registration Timeout)
PONG 171657833

Die vielen "PONG xxx" sind derzeit noch in einer Schleife drin - ich lasse das erst mal so, sollte ja nicht stören - später ja, aber bei der Entwicklung net wirklich ;)

Für einen Tipp freu ich mich sehr! :)

PS: falls Codeänderungen erwünscht sind, bitte melden! DANKE!!

€dit 2:

Nun kommt nach einer Änderung das hier:

Verbindung zum Server aufgenommen...NOTICE AUTH :*** Looking up your hostname
NOTICE AUTH :*** Checking Ident
NOTICE AUTH :*** Found your hostname
NOTICE AUTH :*** No ident response
NOTICE AUTH :*** No ident response
ERROR :Closing Link: by clanserver4u2.de.quakenet.org (Registration Timeout)

Habe mich eigentlich im QN registriert und auch die Benutzerdaten angegeben (Auth). Eine Idee? :rtfm:
 
Zuletzt bearbeitet:

bERt0r

Top Contributor
Du kannst nicht einfach 1000 pongs in einer schleife abschicken. Du schickst nur ein Pong wenn du ein Ping vom Server erhältst. Ausserdem wirst du auf deinem Server den Nick noch registrieren müssen.
 

purzel

Bekanntes Mitglied
Das mit den Pongs habe ich geändert, nur kommt jetzt nicht mal mehr ein Ping an!

Was dem Server angeht, es ist der Quakenet-Server (öffentlich). Bei meinem eigenen geht es auch nicht...
 

XHelp

Top Contributor
So wie ich verstanden habe hast du einfach irgendwas in eine einzige Klasse reingehakt und hoffst, dass es läuft. Lies die die RFC durch, und programmiere das, was da steht und zwar so, wie es da steht.
 

purzel

Bekanntes Mitglied
Lies die die RFC durch, und programmiere das, was da steht und zwar so, wie es da steht.

Habe ich ja schon, so wie beschrieben - leider ohne Erfolg!

€dit: Mein Problem ist ja jetzt, das ich nicht mal einen Ping bekomme! :(

€dit 2: Ich habe zwischenzeitlich noch ein paar Tests gemacht:
  1. Mit Telnet funktioniert es
  2. Wenn ich direkt nach "found your hostname" was eingebe erhalte ich die Ausgabe dazu, bzw. wird an den Server geschickt
  3. Wenn ich allerdings nach dem "No ident response" was eingebe, kommt nichts mehr am Server an - komisch
 
Zuletzt bearbeitet:

purzel

Bekanntes Mitglied
1. Du musst deine Runnable mit new Thread(this).start() nicht mit run() starten. Creating a Java Thread by implementing Runnable Interface
2. Machst du die Raute (#) vor den Channelnamen bei deinen Join Kommandos?
3. Zu deiner Programmstruktur würde ich dir raten die GUI und den Thread der mit dem IRC Server kommuniziert zu trennen und jeweils in eine eigene Klasse zu packen. Dann kannst du auch algorythmisch das ganze sauberer lösen:
Code:
1. Gui starten
2. Benutzer klickt auf Connect
3. Verbindungs Objekt erstellen
4. Mit Server verbinden
5. Chatten was das zeug hält

Stellst Du dir das in etwa so vor?

Java:
package name.purzel;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import java.awt.Color;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.io.PrintWriter;
import java.io.StringReader;
import java.net.InetAddress;
import java.net.Socket;
import java.net.SocketException;

public class IRC_Client {
	public static final int PORT = 6667;
	public static final String HOST = "irc.de.quakenet.eu.org";
	public static final String TEST_HOST = "masterpurzel.dyndns-server.com";
	public static String USERNAME = "tester85";
	static JFrame f;
	static Socket socket;
	public static DataInputStream in;
	static DataOutputStream out;
	static JButton reconnect;
	static JButton exit;
	static JTextArea outputarea;
	static JTextField inputfield;
	IRC_Thread thread;
	
	public IRC_Client() {
		
	}
	
	public static void main(String[] args) {
		f = new JFrame("Java IRC Client");
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setSize(750, 450);
		f.setLayout(new GridBagLayout());
		GridBagConstraints c = new GridBagConstraints();
		
		reconnect = new JButton("Connect");
		reconnect.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				connectionStart();
			}
		});
		exit = new JButton("Exit");
		exit.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				System.exit(0);
			}
		});
		outputarea = new JTextArea(30, 50);
		JScrollPane scrollbar = new JScrollPane(outputarea);
		inputfield = new JTextField();
		outputarea.setFont(new Font("Dialog", Font.PLAIN, 12));
		outputarea.setEditable(false);
		
		c.fill = GridBagConstraints.HORIZONTAL;
		c.weightx = 0;
		c.gridx = 0;
		c.gridy = 0;
		c.gridwidth = 1;
		f.add(reconnect, c);
		
		c.fill = GridBagConstraints.HORIZONTAL;
		c.weightx = 0;
		c.gridx = 1;
		c.gridy = 0;
		c.gridwidth = 1;
		f.add(exit, c);
		
		c.fill = GridBagConstraints.HORIZONTAL;
		c.weightx = 0;
		c.gridx = 0;
		c.gridy = 1;
		c.gridwidth = 3;
		f.add(scrollbar, c);
		
		c.fill = GridBagConstraints.HORIZONTAL;
		c.weightx = 0;
		c.gridx = 0;
		c.gridy = 2;
		c.gridwidth = 3;
		f.add(inputfield, c);
		
		f.setBackground(Color.lightGray);
		f.setForeground(Color.black);
		inputfield.setBackground(Color.white);
		inputfield.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				String text = inputfield.getText();
				send(text);
				inputfield.setText("");
			}
		});
		outputarea.setBackground(Color.white);
		
		f.pack();
		f.setVisible(true);
		
		
		//new IRC_Client().connectionStart();
		new IRC_Client();
	}
	
	public static void connectionStart() {
		inputfield.setEnabled(true);
		try {
			socket = new Socket(HOST, PORT);
			in = new DataInputStream(socket.getInputStream());
			out = new DataOutputStream(socket.getOutputStream());
		} catch (IOException e) {
			System.out.println("Verbindung zum Server fehlgeschlagen!");
			System.exit(1);
		}
		
		//try {
			//out.write("1029, 113 : USERID : UNIX : debian \r\n".getBytes());
		    //out.flush();
		    //out.write("PASS a88kV3Wtp4".getBytes());
		    //out.flush();
		    /*String write_username = "USER " + USERNAME + " localhost purzel.name purzel";
		    out.write(write_username.getBytes("UTF8"));
		    out.flush();
		    String write_nick = "NICK " + USERNAME;
		    out.write(write_nick.getBytes("UTF8"));
		    out.flush();*/
		    /*out.writeBytes("USER " + USERNAME + "localhost purzel.name christian");
		    out.flush();
		    out.writeBytes("NICK " + USERNAME);
		    out.flush();
			out.writeBytes("JOIN cynamite");
			out.flush();*/
		    //out.write("SERVER 127.0.0.1 5 :Experimental server".getBytes());
		    //out.flush();
		    //out.write("PRIVMSG NickServ :IDENTIFY a88kV3Wtp4".getBytes());
		    //out.flush();
		    //out.write("JOIN cynamite".getBytes());
		    //out.flush();
		    //pong(outputarea);
		//} catch (IOException e) {
			//e.printStackTrace();
		//}
		IRC_Thread t = new IRC_Thread();
        new Thread(t).start();
		outputarea.append("Verbindung zum Server aufgenommen...");
		send("USER " + USERNAME + " localhost purzel.name :christian");
		send("NICK " + USERNAME);
	}
	
	public static void send(String s) {
		try {
			out.writeBytes(s);
			out.flush();
		} catch(IOException ioe) {
			ioe.printStackTrace();
		}
	}
	
	public void pong(JTextArea output) {
		LineNumberReader lnr = new LineNumberReader(new StringReader(output.getText()));
		String line;
		try {
			while((line = lnr.readLine()) != null) {
				System.out.println(lnr.getLineNumber() + " > " + line);
				if(line.indexOf("PING") != -1) {
					String[] ping = line.split(":");
					String[] pong = {"PONG :" + ping[1].trim()};
					System.err.println(pong[0]);
					IRC_Client client = new IRC_Client();
					client.send(pong[0]);
					//output.append(pong[0]);
				}
				if(line.indexOf("Closing Link") != -1) {
					System.err.println("Verbindung zum Server wurde unerwartet geschlossen!");
				    JOptionPane.showMessageDialog(f, "Die Verbindung zum Server wurde unerwartet geschlossen.", "Fehler!", JOptionPane.ERROR_MESSAGE);
					thread = null;
				    try {
						socket.close();
						inputfield.setEnabled(false);
					} catch(SocketException e) {
						System.err.println("Fehler beim Schließen vom Socket!");
					}
				}
				if(line.indexOf("ERROR :Your host is trying to (re)connect too fast -- throttled") != -1) {
					JOptionPane.showMessageDialog(f, "Der Client hat sich mehrmals zu schnell angemeldet - bitte warten und dann noch einmal versuchen!", "Fehler!", JOptionPane.ERROR_MESSAGE);
					thread = null;
				    try {
						socket.close();
						inputfield.setEnabled(false);
					} catch(SocketException e) {
						System.err.println("Fehler beim Schließen vom Socket!");
					}
				}
			}
		} catch(IOException e) {
			e.printStackTrace();
		}
	}
}

Java:
package name.purzel;

import java.io.IOException;

public class IRC_Thread implements Runnable {
	Thread thread;
	
	public IRC_Thread() {
		
	}
	
	@SuppressWarnings("deprecation")
	public void run() {
		IRC_Client irc = new IRC_Client();
		String line;
		 
        try {
            while(true) {
                try {
                	line = irc.in.readLine();
                	if(line != null) {
                    	irc.send(line);
                        irc.outputarea.append(line + " \n");
                        irc.pong(irc.outputarea);
                    }
                } catch(NullPointerException npe) {
                	//System.err.println("KEINE DATEN! - NullPointerException!!");
                }
                
            }
        } catch (IOException e) {
            try {
                irc.out.write("Verbindung zum Server abgebrochen".getBytes());
            } catch (IOException io) {
                io.printStackTrace();
            }
            irc.inputfield.setEnabled(false);
        }
	}
}

so nun denn muss ich nur noch den Server dazu bringen meine Befehle anzunehmen^^
 
Zuletzt bearbeitet:

purzel

Bekanntes Mitglied
So, endlich konnte ich wieder auf den Server! :)

Hier mein aktueller Code:

GUI
Java:
package name.purzel;

import java.awt.Color;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.LineNumberReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StringReader;
import java.net.Socket;
import java.net.SocketException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class IRC_Client {
	public static final int PORT = 6667;
	public static final String HOST = "irc.de.quakenet.eu.org";
	public static final String TEST_HOST = "masterpurzel.dyndns-server.com";
	public static String USERNAME = "tester85";
	static JFrame f;
	static Socket socket;
	public static DataInputStream in;
	//static DataOutputStream out;
	static PrintWriter out;
	static JButton reconnect;
	static JButton exit;
	static JTextArea outputarea;
	static JTextField inputfield;
	IRC_Thread thread;
	
	public IRC_Client() {
		
	}
	
	public static void main(String[] args) {
		f = new JFrame("Java IRC Client");
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setSize(750, 450);
		f.setLayout(new GridBagLayout());
		GridBagConstraints c = new GridBagConstraints();
		
		reconnect = new JButton("Connect");
		reconnect.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				connectionStart();
			}
		});
		exit = new JButton("Exit");
		exit.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				try {
					socket.close();
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
				System.exit(0);
			}
		});
		outputarea = new JTextArea(30, 50);
		JScrollPane scrollbar = new JScrollPane(outputarea);
		inputfield = new JTextField();
		outputarea.setFont(new Font("Dialog", Font.PLAIN, 12));
		outputarea.setEditable(false);
		
		c.fill = GridBagConstraints.HORIZONTAL;
		c.weightx = 0;
		c.gridx = 0;
		c.gridy = 0;
		c.gridwidth = 1;
		f.add(reconnect, c);
		
		c.fill = GridBagConstraints.HORIZONTAL;
		c.weightx = 0;
		c.gridx = 1;
		c.gridy = 0;
		c.gridwidth = 1;
		f.add(exit, c);
		
		c.fill = GridBagConstraints.HORIZONTAL;
		c.weightx = 0;
		c.gridx = 0;
		c.gridy = 1;
		c.gridwidth = 3;
		f.add(scrollbar, c);
		
		c.fill = GridBagConstraints.HORIZONTAL;
		c.weightx = 0;
		c.gridx = 0;
		c.gridy = 2;
		c.gridwidth = 3;
		f.add(inputfield, c);
		
		f.setBackground(Color.lightGray);
		f.setForeground(Color.black);
		inputfield.setBackground(Color.white);
		inputfield.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				String text = inputfield.getText();
				send(text);
				inputfield.setText("");
			}
		});
		outputarea.setBackground(Color.white);
		
		f.pack();
		f.setVisible(true);
		
		
		//new IRC_Client().connectionStart();
		new IRC_Client();
	}
	
	public static void connectionStart() {
		inputfield.setEnabled(true);
		try {
			socket = new Socket(HOST, PORT);
			in = new DataInputStream(socket.getInputStream());
			//out = new DataOutputStream(socket.getOutputStream());
			out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
		} catch (IOException e) {
			System.out.println("Verbindung zum Server fehlgeschlagen!");
			try {
				socket.close();
			} catch (IOException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			System.exit(1);
		}
		
		//try {
			//out.write("1029, 113 : USERID : UNIX : debian \r\n".getBytes());
		    //out.flush();
		    //out.write("PASS xxxx".getBytes());
		    //out.flush();
		    /*String write_username = "USER " + USERNAME + " localhost purzel.name purzel";
		    out.write(write_username.getBytes("UTF8"));
		    out.flush();
		    String write_nick = "NICK " + USERNAME;
		    out.write(write_nick.getBytes("UTF8"));
		    out.flush();*/
		    /*out.writeBytes("USER " + USERNAME + "localhost purzel.name christian");
		    out.flush();
		    out.writeBytes("NICK " + USERNAME);
		    out.flush();
			out.writeBytes("JOIN cynamite");
			out.flush();*/
		    //out.write("SERVER 127.0.0.1 5 :Experimental server".getBytes());
		    //out.flush();
		    //out.write("PRIVMSG NickServ :IDENTIFY xxxx".getBytes());
		    //out.flush();
		    //out.write("JOIN cynamite".getBytes());
		    //out.flush();
		    //pong(outputarea);
		//} catch (IOException e) {
			//e.printStackTrace();
		//}
		IRC_Thread t = new IRC_Thread();
        new Thread(t).start();
		outputarea.append("Verbindung zum Server aufgenommen...\r\n");
		send("USER " + USERNAME + " localhost purzel.name christian");
		send("NICK " + USERNAME);
	}
	
	public static void send(String s) {
		//try {
			//out.writeUTF(s);
			out.println(s);
			out.flush();
		//} catch(IOException ioe) {
			//ioe.printStackTrace();
		//}
	}
	
	public void pong(JTextArea output) {
		LineNumberReader lnr = new LineNumberReader(new StringReader(output.getText()));
		String line;
		try {
			while((line = lnr.readLine()) != null) {
				System.out.println(lnr.getLineNumber() + " > " + line);
				if(line.indexOf("PING") != -1) {
					String[] ping = line.split(":");
					String[] pong = {"PONG :" + ping[1].trim()};
					System.err.println(pong[0]);
					//IRC_Client client = new IRC_Client();
					IRC_Client.send(pong[0]);
					//output.append(pong[0]);
				}
				if(line.indexOf("Closing Link") != -1) {
					System.err.println("Verbindung zum Server wurde unerwartet geschlossen!");
				    JOptionPane.showMessageDialog(f, "Die Verbindung zum Server wurde unerwartet geschlossen.", "Fehler!", JOptionPane.ERROR_MESSAGE);
					thread = null;
				    try {
						socket.close();
						inputfield.setEnabled(false);
					} catch(SocketException e) {
						System.err.println("Fehler beim Schließen vom Socket!");
					}
				}
				if(line.indexOf("ERROR :Your host is trying to (re)connect too fast -- throttled") != -1) {
					JOptionPane.showMessageDialog(f, "Der Client hat sich mehrmals zu schnell angemeldet - bitte warten und dann noch einmal versuchen!", "Fehler!", JOptionPane.ERROR_MESSAGE);
					thread = null;
				    try {
						socket.close();
						inputfield.setEnabled(false);
					} catch(SocketException e) {
						System.err.println("Fehler beim Schließen vom Socket!");
					}
				}
			}
		} catch(IOException e) {
			e.printStackTrace();
		}
	}
}

Thread
Java:
package name.purzel;

import java.io.IOException;

public class IRC_Thread implements Runnable {
	Thread thread;
	
	public IRC_Thread() {
		
	}
	
	@SuppressWarnings("deprecation")
	public void run() {
		IRC_Client irc = new IRC_Client();
		String line;
		 
        try {
            while(true) {
                try {
                	line = IRC_Client.in.readLine();
                	if(line != null) {
                		IRC_Client.send(line);
                		IRC_Client.outputarea.append(line + " \n");
                    	irc.pong(IRC_Client.outputarea);
                    }
                } catch(NullPointerException npe) {
                	//System.err.println("KEINE DATEN! - NullPointerException!!");
                }
                
            }
        } catch (IOException e) {
            IRC_Client.send("Verbindung zum Server abgebrochen");
            IRC_Client.inputfield.setEnabled(false);
        }
	}
}

Ausgabe
Verbindung zum Server aufgenommen...
NOTICE AUTH :*** Looking up your hostname
NOTICE AUTH :*** Checking Ident
NOTICE AUTH :*** Found your hostname
PING :211661948
:clanserver4u2.de.quakenet.org 451 tester85 tester85 :Register first.
:clanserver4u2.de.quakenet.org 451 tester85 tester85 :Register first.
NOTICE AUTH :*** No ident response
:clanserver4u2.de.quakenet.org 001 tester85 :Welcome to the QuakeNet IRC Network, tester85
:clanserver4u2.de.quakenet.org 002 tester85 :Your host is clanserver4u2.de.quakenet.org, running version u2.10.12.10+snircd(1.3.4a)
:clanserver4u2.de.quakenet.org 003 tester85 :This server was created Sat Mar 15 2008 at 06:32:28 CET
:clanserver4u2.de.quakenet.org 004 tester85 clanserver4u2.de.quakenet.org u2.10.12.10+snircd(1.3.4a) dioswkgxRXInP biklmnopstvrDcCNuMT bklov
:clanserver4u2.de.quakenet.org 005 tester85 WHOX WALLCHOPS WALLVOICES USERIP CPRIVMSG CNOTICE SILENCE=15 MODES=6 MAXCHANNELS=20 MAXBANS=45 NICKLEN=15 :are supported by this server
:clanserver4u2.de.quakenet.org 005 tester85 MAXNICKLEN=15 TOPICLEN=250 AWAYLEN=160 KICKLEN=250 CHANNELLEN=200 MAXCHANNELLEN=200 CHANTYPES=#& PREFIX=(ov)@+ STATUSMSG=@+ CHANMODES=b,k,l,imnpstrDducCNMT CASEMAPPING=rfc1459 NETWORK=QuakeNet :are supported by this server
:clanserver4u2.de.quakenet.org 251 tester85 :There are 21 users and 60017 invisible on 45 servers
:clanserver4u2.de.quakenet.org 252 tester85 69 :eek:perator(s) online
:clanserver4u2.de.quakenet.org 253 tester85 9 :unknown connection(s)
:clanserver4u2.de.quakenet.org 254 tester85 51224 :channels formed
:clanserver4u2.de.quakenet.org 255 tester85 :I have 4223 clients and 1 servers
:clanserver4u2.de.quakenet.org NOTICE tester85 :Highest connection count: 7271 (7270 clients)
:clanserver4u2.de.quakenet.org 375 tester85 :- clanserver4u2.de.quakenet.org Message of the Day -
:clanserver4u2.de.quakenet.org 372 tester85 :- 2008-1-7 0:53
:clanserver4u2.de.quakenet.org 372 tester85 :- _ _ _
:clanserver4u2.de.quakenet.org 372 tester85 :- ___| | __ _ _ __ ___ ___ _ ____ _____ _ __| || | _ _
:clanserver4u2.de.quakenet.org 372 tester85 :- / __| |/ _` | '_ \/ __|/ _ \ '__\ \ / / _ \ '__| || |_| | | |
:clanserver4u2.de.quakenet.org 372 tester85 :- | (__| | (_| | | | \__ \ __/ | \ V / __/ | |__ _| |_| |
:clanserver4u2.de.quakenet.org 372 tester85 :- \___|_|\__,_|_| |_|___/\___|_| \_/ \___|_| |_| \__,_|
:clanserver4u2.de.quakenet.org 372 tester85 :-
:clanserver4u2.de.quakenet.org 372 tester85 :- Welcome to the QuakeNet IRC Network!
:clanserver4u2.de.quakenet.org 372 tester85 :-
:clanserver4u2.de.quakenet.org 372 tester85 :- You are connected to clanserver4u.de.quakenet.org
:clanserver4u2.de.quakenet.org 372 tester85 :- This IRC Server is operated by The QuakeNet IRC Network
:clanserver4u2.de.quakenet.org 372 tester85 :-
:clanserver4u2.de.quakenet.org 372 tester85 :- o Listening on ports: 6665 - 6669 o
:clanserver4u2.de.quakenet.org 372 tester85 :- o Visit us @ The official website for the QuakeNet IRC network o
:clanserver4u2.de.quakenet.org 372 tester85 :-
:clanserver4u2.de.quakenet.org 372 tester85 :-
:clanserver4u2.de.quakenet.org 372 tester85 :- --- Server Rules ---------------------------------------------------------
:clanserver4u2.de.quakenet.org 372 tester85 :-
:clanserver4u2.de.quakenet.org 372 tester85 :- Continued use of this server indicates your acceptance of the network's
:clanserver4u2.de.quakenet.org 372 tester85 :- terms of service available at The official website for the QuakeNet IRC network
:clanserver4u2.de.quakenet.org 372 tester85 :-
:clanserver4u2.de.quakenet.org 372 tester85 :- Please note that the network may not be used for the following:
:clanserver4u2.de.quakenet.org 372 tester85 :-
:clanserver4u2.de.quakenet.org 372 tester85 :- o No Flooding
:clanserver4u2.de.quakenet.org 372 tester85 :- o No DoS bots / Virus / Cheats / Trojan distribution
:clanserver4u2.de.quakenet.org 372 tester85 :- o No Distribution of Warez / Pornography / Copyright material
:clanserver4u2.de.quakenet.org 372 tester85 :- o No Spamming / Advertising
:clanserver4u2.de.quakenet.org 372 tester85 :- o No Takeovers
:clanserver4u2.de.quakenet.org 372 tester85 :- o No Phishing
:clanserver4u2.de.quakenet.org 372 tester85 :- o No Racism / Nazism
:clanserver4u2.de.quakenet.org 372 tester85 :-
:clanserver4u2.de.quakenet.org 372 tester85 :- --- Information & Help
 
Zuletzt bearbeitet:

purzel

Bekanntes Mitglied
Hallo, ich darf mit freude berichten, ich kann mich nun auf den Server einloggen und auch chatten! :)

Das einzige was mich noch stört ist, dass er irgendwelche Befehle/Zeichenketten sendet und ich damit folgendes erhalte:

:clanserver4u2.de.quakenet.org 421 tester85 421 :Unknown command
:clanserver4u2.de.quakenet.org 421 tester85 421 :Unknown command
:clanserver4u2.de.quakenet.org 421 tester85 421 :Unknown command
:clanserver4u2.de.quakenet.org 421 tester85i 421 :Unknown command
:clanserver4u2.de.quakenet.org 421 tester85 421 :Unknown command
:clanserver4u2.de.quakenet.org 421 tester85 421 :Unknown command
:clanserver4u2.de.quakenet.org 421 tester85 421 :Unknown command
:clanserver4u2.de.quakenet.org 421 tester85 421 :Unknown command
:clanserver4u2.de.quakenet.org 421 tester85 421 :Unknown command

Ebenfalls erhalte ich als letzte Meldung:

[DUKE]ERROR :Closing Link: tester85 by clanserver4u2.de.quakenet.org (Excess Flood)[/DUKE]

Eine Idee was das sein könnte?

GUI
Java:
package name.purzel;

import java.awt.Color;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class IRC_Client {
	public static final int PORT = 6667;
	public static final String HOST = "irc.de.quakenet.eu.org";
	public static final String TEST_HOST = "masterpurzel.dyndns-server.com";
	public static String USERNAME = "tester85";
	static JFrame f;
	static Socket socket;
	public static DataInputStream in;
	//static DataOutputStream out;
	static PrintWriter out;
	static JButton reconnect;
	static JButton exit;
	static JTextArea outputarea;
	static JTextField inputfield;
	static IRC_Thread thread;
	public static String text;
	
	public IRC_Client() {
		
	}
	
	public static void main(String[] args) {
		f = new JFrame("Java IRC Client");
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setSize(750, 450);
		f.setLayout(new GridBagLayout());
		GridBagConstraints c = new GridBagConstraints();
		
		reconnect = new JButton("Connect");
		reconnect.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				connectionStart();
			}
		});
		exit = new JButton("Exit");
		exit.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				try {
					socket.close();
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
				System.exit(0);
			}
		});
		outputarea = new JTextArea(35, 60);
		JScrollPane scrollbar = new JScrollPane(outputarea);
		inputfield = new JTextField();
		outputarea.setFont(new Font("Dialog", Font.PLAIN, 12));
		outputarea.setEditable(false);
		
		c.fill = GridBagConstraints.HORIZONTAL;
		c.weightx = 0;
		c.gridx = 0;
		c.gridy = 0;
		c.gridwidth = 1;
		f.add(reconnect, c);
		
		c.fill = GridBagConstraints.HORIZONTAL;
		c.weightx = 0;
		c.gridx = 1;
		c.gridy = 0;
		c.gridwidth = 1;
		f.add(exit, c);
		
		c.fill = GridBagConstraints.HORIZONTAL;
		c.weightx = 0;
		c.gridx = 0;
		c.gridy = 1;
		c.gridwidth = 3;
		f.add(scrollbar, c);
		
		c.fill = GridBagConstraints.HORIZONTAL;
		c.weightx = 0;
		c.gridx = 0;
		c.gridy = 2;
		c.gridwidth = 3;
		f.add(inputfield, c);
		
		f.setBackground(Color.lightGray);
		f.setForeground(Color.black);
		inputfield.setBackground(Color.white);
		inputfield.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				text = inputfield.getText().toString().trim();
				//send(text);
				inputfield.setText("");
			}
		});
		outputarea.setBackground(Color.white);
		
		f.pack();
		f.setVisible(true);
		
		
		//new IRC_Client().connectionStart();
		new IRC_Client();
	}
	
	public static void connectionStart() {
		inputfield.setEnabled(true);
		try {
			socket = new Socket(HOST, PORT);
			in = new DataInputStream(socket.getInputStream());
			out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
		} catch (IOException e) {
			System.out.println("Verbindung zum Server fehlgeschlagen!");
			try {
				socket.close();
			} catch (IOException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			System.exit(1);
		}
		
		//try {
			//out.write("1029, 113 : USERID : UNIX : debian \r\n".getBytes());
		    //out.flush();
		    //out.write("PASS xxxx".getBytes());
		    //out.flush();
		    /*String write_username = "USER " + USERNAME + " localhost purzel.name purzel";
		    out.write(write_username.getBytes("UTF8"));
		    out.flush();
		    String write_nick = "NICK " + USERNAME;
		    out.write(write_nick.getBytes("UTF8"));
		    out.flush();*/
		    /*out.writeBytes("USER " + USERNAME + "localhost purzel.name christian");
		    out.flush();
		    out.writeBytes("NICK " + USERNAME);
		    out.flush();
			out.writeBytes("JOIN cynamite");
			out.flush();*/
		    //out.write("SERVER 127.0.0.1 5 :Experimental server".getBytes());
		    //out.flush();
		    //out.write("PRIVMSG NickServ :IDENTIFY xxxx".getBytes());
		    //out.flush();
		    //out.write("JOIN cynamite".getBytes());
		    //out.flush();
		    //pong(outputarea);
		//} catch (IOException e) {
			//e.printStackTrace();
		//}
		IRC_Thread t = new IRC_Thread();
        new Thread(t).start();
		outputarea.append("Verbindung zum Server aufgenommen...\r\n");
	}
	
	public static void send(String s) {
		out.println(s);
		out.flush();
	}
	
	/*public static void pong(JTextArea output) {
		LineNumberReader lnr = new LineNumberReader(new StringReader(output.getText()));
		String line;
		try {
			while((line = lnr.readLine()) != null) {
				System.out.println(lnr.getLineNumber() + " > " + line);
				ping: if(line.indexOf("PING :") != -1) {
					String[] ping = line.split(":");
					String[] pong = {"PONG :" + ping[1].trim()};
					System.err.println(pong[0]);
					IRC_Client.send(pong[0]);
					break ping;
				}
				if(line.indexOf("Register first") != -1 || line.indexOf("No ident response") != -1) {
					IRC_Client.send("USER " + USERNAME + " localhost purzel.name christian");
					IRC_Client.send("NICK " + USERNAME);
					IRC_Client.send("PRIVMSG NickServ :IDENTIFY a88kV3Wtp4");
				}
				if(line.indexOf("Closing Link") != -1) {
					System.err.println("Verbindung zum Server wurde unerwartet geschlossen!");
				    JOptionPane.showMessageDialog(f, "Die Verbindung zum Server wurde unerwartet geschlossen.", "Fehler!", JOptionPane.ERROR_MESSAGE);
					//thread = null;
				    try {
						socket.close();
						inputfield.setEnabled(false);
					} catch(SocketException e) {
						System.err.println("Fehler beim Schließen vom Socket!");
					}
				}
				if(line.indexOf("ERROR :Your host is trying to (re)connect too fast -- throttled") != -1) {
					JOptionPane.showMessageDialog(f, "Der Client hat sich mehrmals zu schnell angemeldet - bitte warten und dann noch einmal versuchen!", "Fehler!", JOptionPane.ERROR_MESSAGE);
					//thread = null;
				    try {
						socket.close();
						inputfield.setEnabled(false);
					} catch(SocketException e) {
						System.err.println("Fehler beim Schließen vom Socket!");
					}
				}
			}
		} catch(IOException e) {
			e.printStackTrace();
		}
	}*/
	
	public static void setUsername(String s) {
		send("USER " + s + " localhost purzel.name christian");
	}
	
	public static void setNickname(String s) {
		send("NICK " + s);
	}
	
	public static void doJoin(String s) {
		send("JOIN " + s);
	}
	
	public static void doQuit() {
		send("QUIT");
	}
}

Thread
Java:
package name.purzel;

import java.io.IOException;
import java.net.SocketException;

import javax.swing.JOptionPane;

public class IRC_Thread implements Runnable {
	Thread thread;
	
	public IRC_Thread() {
		
	}
	
	@SuppressWarnings("deprecation")
	public void run() {
		//IRC_Client irc = new IRC_Client();
		String line;
		 
        try {
            while(true) {
                try {
                	line = IRC_Client.in.readLine();
                	Thread.sleep(100);
                	if(line != null || line.length() > 0) {
                		//IRC_Client.send(line);
                		IRC_Client.outputarea.append(line + "\n");
                		System.err.println(line);
                		if(line.indexOf("ERROR :Your host is trying to (re)connect too fast -- throttled") != -1) {
        					JOptionPane.showMessageDialog(IRC_Client.f, "Der Client hat sich mehrmals zu schnell angemeldet - bitte warten und dann noch einmal versuchen!", "Fehler!", JOptionPane.ERROR_MESSAGE);
        					//thread = null;
        				    try {
        						IRC_Client.socket.close();
        						IRC_Client.inputfield.setEnabled(false);
        					} catch(SocketException e) {
        						System.err.println("Fehler beim Schließen vom Socket!");
        					}
        				}
                		if(line.indexOf("Excess Flood") != -1) {
        					JOptionPane.showMessageDialog(IRC_Client.f, "Es wurden zu viele Daten gesendet - Rausschmiss aus dem Chat!", "Fehler!", JOptionPane.ERROR_MESSAGE);
        				    try {
        						IRC_Client.socket.close();
        						IRC_Client.inputfield.setEnabled(false);
        					} catch(SocketException e) {
        						System.err.println("Fehler beim Schließen vom Socket!");
        					}
        				}
                		ping: if(line.indexOf("PING :") != -1) {
        					String[] ping = line.split(":");
        					String[] pong = {"PONG :" + ping[1].trim()};
        					System.err.println(pong[0]);
        					IRC_Client.send(pong[0]);
        					IRC_Client.outputarea.append(pong[0] + "\n");
        					//break ping;
        				}
        				if(IRC_Client.text != null || !IRC_Client.text.equals("") || !IRC_Client.text.isEmpty()) {
        					//System.out.print(IRC_Client.text);
        					user: if(IRC_Client.text.indexOf("/user ") != -1) {
        						String[] input = IRC_Client.text.split(" ");
        						String[] username = {input[1].trim()};
        						IRC_Client.setUsername(username[0]);
        						//System.out.print("USERNAME: " + username[0]);
        						//break user;
        					}
        					nick: if(IRC_Client.text.indexOf("/nick ") != -1) {
        						String[] input = IRC_Client.text.split(" ");
        						String[] nickname = {input[1].trim()};
        						IRC_Client.setNickname(nickname[0]);
        						//System.out.print("NICKNAME: " + nickname[0]);
        						//break nick;
        					}
        					join: if(IRC_Client.text.indexOf("/join ") != -1) {
        						String[] input = IRC_Client.text.split(" ");
        						String[] channel = {input[1].trim()};
        						IRC_Client.doJoin(channel[0]);
        						//System.out.print("JOIN CHANNEL: " + channel[0]);
        						//break join;
        					}
        					quit: if(IRC_Client.text.indexOf("/quit") != -1) {
        						IRC_Client.doQuit();
        						//break quit;
        					}
        				}
                    }
                } catch(NullPointerException npe) {
                	//System.err.println("KEINE DATEN! - NullPointerException!!");
                } catch(InterruptedException ie) {
                	
                }
                
            }
        } catch (IOException e) {
            IRC_Client.send("Verbindung zum Server abgebrochen");
            IRC_Client.inputfield.setEnabled(false);
        }
	}
}

€dit: habe den Störenfried gefunden, mal sehen ob ich ihn killen :pfeif: kann.

€dit 2: Die if-Abfrage "nick" spuckt alle paar s den Befehl aus. Daher kommt das excess flood! Wenn ich allerdings eine variable z.B. int nick = 0 setze und nach dem aufruf von setNickname eine 1 mache, kommt das nicht mehr, allerdings springt er mir nie mehr in das join rein, obwohl true ist. Hat jemand einen Plan wo mein Fehler liegt?

€dit 3: Jetzt gehts doch, man muss nur etwas warten (ca. 1 - 2 min). Habe zusätzlich noch einen dynamischen Connect/Disconnect-Button eingebaut.

LG

Purzel
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
T String von Client zu Server kommt nicht an Netzwerkprogrammierung 92
M Socket Server antwortet dem Client nicht Netzwerkprogrammierung 6
C Mini Client-Server-Anwendung funktioniert nicht Netzwerkprogrammierung 8
V TCP Client funktioniert auf Emulator aber nicht auf Smartphone Netzwerkprogrammierung 5
D Socket UDP Client reagiert nicht auf spontane Meldungen Netzwerkprogrammierung 5
S Socket (client) verbindet nicht Netzwerkprogrammierung 6
J Erster Server-Client läuft auf lokalem Rechner problemlos. Zwei Rechner über das Internet nicht Netzwerkprogrammierung 8
G FTP FTP-Client funktioniert nicht bei Modem-Verbindungen Netzwerkprogrammierung 8
T Server und Client verbinden nicht Netzwerkprogrammierung 6
L Socket Client empfängt nicht Netzwerkprogrammierung 6
das-mo Client/Server sendet nicht Netzwerkprogrammierung 7
R Client funktioniert nicht Netzwerkprogrammierung 2
H Socket Client server,verbindung läst sich nicht abbauen&code optimierung Netzwerkprogrammierung 3
P Warum lässt sich mein Server und mein Client einfach nicht schließen?!?! Netzwerkprogrammierung 16
H Client Connectet nicht (Neuling!) Netzwerkprogrammierung 4
M lesen vom Client geht nicht Netzwerkprogrammierung 10
N Client bekommt close vom Server nicht mit Netzwerkprogrammierung 3
L Wieso klappt das nicht? (Client in Java) Netzwerkprogrammierung 15
T RMI - Client Zugriff auf Server funktioniert nicht Netzwerkprogrammierung 5
R Client nimmt den Inputstream nicht an Netzwerkprogrammierung 5
K Server Client läuft in Windows allerdings nicht in Linux Netzwerkprogrammierung 9
G HTTP Client :: Komme nicht über den Proxy Netzwerkprogrammierung 7
S Server - Telnet funktioniert, Server - Client nicht Netzwerkprogrammierung 3
I Performanteste Kommunikationsmethode zwischen Client u. Server Netzwerkprogrammierung 4
L Socket Automatische Zuweisung von Server und Client Rolle Netzwerkprogrammierung 12
ExceptionOfExpectation Server/Client-Kommunikation Netzwerkprogrammierung 34
M Server-Client-System für Browsergame Netzwerkprogrammierung 5
B Axis2 Webservice mit Client Zertifikat Authentifizierung Netzwerkprogrammierung 3
Yonnig Threads mit Client/Server und GUI (laufend bis button-click) Netzwerkprogrammierung 9
T Jetty mit Client-Zertifikat nur bei spezifischer URL Netzwerkprogrammierung 1
J Einlesen von Servernachrichten von TCP-Client Netzwerkprogrammierung 17
J Client-Server und SOAP Netzwerkprogrammierung 23
L30nS RMI Aufruf einer Client-Methode von einem RMI-Server Netzwerkprogrammierung 3
D WebSocket Server mit HTML Client und Java Server Netzwerkprogrammierung 5
D Server - Client Informationsaustausch, Möglichkeiten Netzwerkprogrammierung 3
H Socket Chat entwickeln mit Java Server Client Netzwerkprogrammierung 4
X Kann ich einen Client/Server verbindung hinkriegen die mir alle paar Sekunden die aktuellen Daten per Realtime zuschickt ? Netzwerkprogrammierung 9
T Client zu Client Kommunikation Netzwerkprogrammierung 2
D Slf4j - Logging - Client-Server Architektur Netzwerkprogrammierung 3
J client server mit nur einem PC Netzwerkprogrammierung 33
M Socket Nachricht von TCP-Client an Server schicken Netzwerkprogrammierung 12
M Socket Verbindung Matlab(Server) Java(Client) Netzwerkprogrammierung 1
R Socket FATAL EXCEPTION MAIN bei Socket based client/server app Netzwerkprogrammierung 2
G Server-Client IO Problem Netzwerkprogrammierung 6
ruutaiokwu ständig "sender address rejected: improper use of smtp" bei smtp-client Netzwerkprogrammierung 4
J HTTP [Java 9] Neuer HTTP Client - Tutorial Netzwerkprogrammierung 3
A Chatserver/-client - Code stoppt bei readUTF() Netzwerkprogrammierung 7
I Socket Das erste Server-Client Programm Netzwerkprogrammierung 16
L Zugriffprobleme Client - Webservice AspenTechnology Netzwerkprogrammierung 0
A Client Client Übertragung Netzwerkprogrammierung 12
K Socket Netty Client wirft Fehler! Netzwerkprogrammierung 3
I Client/Server Kommunikation bei einem Spiel Netzwerkprogrammierung 4
E Objekte versenden, Client-Server Netzwerkprogrammierung 25
U Client Soap Verbindung wieder schließen Netzwerkprogrammierung 0
U Socket Client mit hash authentifizieren Netzwerkprogrammierung 3
F HTTP HTTP Rest Client mit TLS1.2 und selbst signiertem Zertifikat Netzwerkprogrammierung 2
P Server als Client nutzen Netzwerkprogrammierung 8
D Socket Run Args Client/Server Socket Netzwerkprogrammierung 1
Cromewell Socket Multithreaded Server und Client Netzwerkprogrammierung 1
Y Client/Server/DB communication Netzwerkprogrammierung 3
JavaWolf165 Socket mit .writeUtf etwas vom Client zum Server schicken Netzwerkprogrammierung 13
J Client - Serversocket Netzwerkprogrammierung 1
P RMI Client Server Programm über Internet Netzwerkprogrammierung 2
brainless Client Server Kommunikation verschlüsseln Netzwerkprogrammierung 13
gamebreiti Socket Server / Client Anwendung Manipulation von Objekten durch Server Netzwerkprogrammierung 9
T Socket Server/Client Kommunikation Netzwerkprogrammierung 8
N Fragen zu Sockets Client Netzwerkprogrammierung 3
F Extasys TCp Client extends Funktion Netzwerkprogrammierung 0
F Server Client Anwendung mit UDP Netzwerkprogrammierung 2
O Client zwischen XML und JSON auswählen lassen Netzwerkprogrammierung 2
A RMI Wo treten Exceptions bei RMI Aufrufen auf? Auf Client oder auf Server? Netzwerkprogrammierung 3
A ByteBuffer - Client/Server Netzwerkprogrammierung 9
A Socket Wie ein einfacher Multithreads Service mit Telnet als Client mit Observable/Observer gelöst.... Netzwerkprogrammierung 0
K C# Server - Android Client Netzwerkprogrammierung 0
T Application Client NullPointerExc Netzwerkprogrammierung 7
H Machbarkeitsfrage: TCP/IP Client (z.B. Netty) für Java Web Applcation Netzwerkprogrammierung 1
P MIME-TYPE Erklaerung, Kommunikation zwischen Client und Server Netzwerkprogrammierung 3
H HTTP REST Jersey - PUT-Beispiel von Client senden Netzwerkprogrammierung 0
J Sichere Kommunikation bei Server Client Netzwerkprogrammierung 3
T Frage zu Client-Server Applikation Netzwerkprogrammierung 2
H Socket Client/Server Socket Programmieren Netzwerkprogrammierung 1
M Theoretische Frage zu Server - Client Netzwerkprogrammierung 2
P HTTP Server / Client Netzwerkprogrammierung 1
N FTP FTP Client invalid IPv6 address (Apache Commons Net API) Netzwerkprogrammierung 6
F TCP Client, verbindung aufrecht halten Netzwerkprogrammierung 0
X RMI: Woher kennt der Client das Schnittstellen-Interface? Netzwerkprogrammierung 2
E Thematik Client server Netzwerkprogrammierung 2
D UDP Client empfängt nichts Netzwerkprogrammierung 2
D Client/Server per Crossover Lan Kabel Netzwerkprogrammierung 1
S Client Server Connection Netzwerkprogrammierung 4
V erste Client - Server Anwendung, paar Fragen wie Socketverbindung checken usw. Netzwerkprogrammierung 4
S Client Anwendung mit zentraler SQL-Datenbank Netzwerkprogrammierung 3
N Client Identifikation eines Servers Netzwerkprogrammierung 1
S Sichere Server/Client Architektur Netzwerkprogrammierung 1
D Chat Server/mehre Client Netzwerkprogrammierung 9
I Server+Client Netzwerkprogrammierung 3
N Client am Server abmelden Netzwerkprogrammierung 0
F Server/Client Probleme Netzwerkprogrammierung 3
D SSH Client Netzwerkprogrammierung 7
U Socket Instant Messanger (Server Linux, Client Windows) Netzwerkprogrammierung 1

Ähnliche Java Themen

Neue Themen


Oben