JChat

Developer_Y

Gesperrt
Hi,
ich bin am Programmieren eines Spiels,
und ich habe schon versucht, einen Chat für
mein Spiel zu programmieren,
ich hab im Internet schon viel gefunden, was mich trotzdem net weiterbrachte
lief aber nur leider als Applet bei mir auf Eclipse, so mit ner batch datei
nicht, also kann mir irgendjemand einen Chat schreiben
der auf JFrame Basis läuft?

Wer mir den Chat programmiert, kommt oben im Abspann vor,
ich weiß nähmlich gar nicht mehr weiter...
:rolleyes:
PS:
diese Irc chats laufen doch auf "Kanälen" glaub ich.
Es soll einfach nur ein JTextField oben sein, indem alle nachrichten auftauchen
dann ein JTextFíeld unten in das man einfüllen muss, und mit enter bestätigt
mehr net
den Channel soll man net ändern können, aber im Code festlegen können, danke
schon mal im Voraus, Developer_XY
 
danke,
das hab ich noch nicht gefunden

ja danke erstmal für deine schnelle antwort, aber könnte mir hier noch einer helfen?
Also
in diesem Tutorial, habe ich mal die COdes ausprobiert, es ist nur ein fehler im Code ich weiß nicht wie ich ihn beheben soll, kann mir einer helfen ? bitte
PHP:
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;

	public class Client extends Panel implements Runnable
	{
		// Components for the visual display of the chat windowsprivate 
		TextField tf = new TextField();
		private TextArea ta = new TextArea();
		// The socket connecting us to the serverprivate 
		Socket socket;
		// The streams we communicate to the server; these come
		// from the socketprivate 
		DataOutputStream dout;
		private DataInputStream din;
		// Constructorpublic 
		Client( String host, int port ) {
			// Set up the screen
			setLayout( new BorderLayout() );
			add( "North", tf );
			add( "Center", ta );
			// We want to receive messages when someone types a line
			// and its return, using an anonymous class as
			// a callback
			tf.addActionListener( new ActionListener() 
			{
				
			}
			public void actionPerformed( ActionEvent e ) 
			{
				processMessage( e.getActionCommand() );
			// Connect to the server
			try 
			{
				// Initiate the 
				socket = new Socket( "", 12 );
				// We got a connection! Tell the world
				System.out.println( "connected to "+socket );
				// Let's grab the streams and create DataInput/Output streams
				// from them
				din = new DataInputStream( socket.getInputStream() );
				dout = new DataOutputStream( socket.getOutputStream() );}
				// Start a background thread for receiving messagesnew 
				
			catch( IOException ie ) 
			{ System.out.println( ie ); }
			}
	// Gets called when the user types something
	private void processMessage( String message )
	{try
	{
		// Send it to the server
		dout.writeUTF( message );
		// Clear out text input field
		tf.setText( "" );} 
	catch( IOException ie ) 
	{ System.out.println( ie ); }}
	// Background thread runs this: show messages from other window
	public void run()
	{
		try {// Receive messages one-by-one, forever
			while (true) {
// Get the next
				String message = din.readUTF();
				// Print it to our text 
				ta.append( message+"\n" );}}
		catch( IOException ie ) { System.out.println( ie ); }
		}
			}
 
Hi,
Beim Überfliegen des Codes sind mir typische Fehler aufgefallen, die nur passieren können wenn man Code kopiert. :).
Zum Beipiel ist das "public" vom Konstruktor in den Kommentar darüber gerutscht, wie alle anderen Modifzierer auch.
Oder ab der Zeile "tf.addActionListener( new ActionListener()" geht die Fomatierung und vor allem die Zeichensetzung den Bach runter! Vergleiche doch mal mit dem Tutorial wo welche Klammern gesetzt werden. Also wird daraus:
Java:
 tf.addActionListener( new ActionListener() 
  {
                
  }
  public void actionPerformed( ActionEvent e ) 
  {
  processMessage( e.getActionCommand() );
das hier
Java:
tf.addActionListener( new ActionListener(){
   public void actionPerformed( ActionEvent e ) {
     processMessage( e.getActionCommand() ); 
   }
});
Und beim nächsten mal Bitte die Fehlermeldung posten!
Ciao
DosCoder

PS: Wir sind hier im Java-Forum, bitte verwende java-Tags statt php-Tags.
 
Zuletzt bearbeitet:
ich bins nochmal, also im Code wird verlangt dass man die Host Adresse angibt,
natürlich muss man irgendwie die Host adresse von sich selbst angeben, bei nem Applet versuch konnte man schreiben, this.getHost
aber ich hab jetzt das Problem, dass es ein JFrame ist, kannst du mir da bitte helfen?
Damit das funktioniert?
Btite
Java:
import java.io.*;
import java.net.*;

	public class ServerThread extends Thread
{
		// The Server that spawned usprivate 
		Server server;
		// The Socket connected to our clientprivate 
		Socket socket;
		// Constructor.
		public ServerThread( Server server, Socket socket ) 
		{// Save the parameters
			this.server = server;
			this.socket = socket;
			// Start up the threadstart();
			}
		// This runs in a separate thread when start() is called in the// constructor.
		public void run()
		{
			try 
			{
				// Create a DataInputStream for communication; the client
				// is using a DataOutputStream to write to us
				DataInputStream din = new DataInputStream( socket.getInputStream() );
				// Over and over, forever ...
				while (true) 
				{
					// ... read the next message ...
					String message = din.readUTF();
					// ... tell the world ...
					System.out.println( "Sending "+message );
					// ... and have the server send it to all 
					server.sendToAll( message );
					}
				} catch( EOFException ie ) 
				{
					// This doesn't need an error message
					} catch( IOException ie ) {
						// This does; tell the world!
						ie.printStackTrace();} finally {
							// The connection is closed for one reason or another,
							// so have the server dealing with it
							server.removeConnection( socket );}
						}
		
				}
Java:
import java.io.*;
import java.net.*;
import java.util.*;
	
	public class Server
{
		// The ServerSocket we'll use for accepting new connectionsprivate 
		ServerSocket ss;
		// A mapping from sockets to DataOutputStreams. This will
		// help us avoid having to create a DataOutputStream each time
		// we want to write to a stream.
		private Hashtable outputStreams = new Hashtable();
		// Constructor and while-accept loop all in one.
		public Server( int port ) throws IOException 
		{
			// All we have to do is listen
			listen( port );
		}
		private void listen( int port ) throws IOException
		{
			// Create the 
			ss = new ServerSocket( port );
			// Tell the world we're ready to go
			System.out.println( "Listening on "+ss );
			// Keep accepting connections forever
			while (true)
			{
				// Grab the next incoming 
				Socket s = ss.accept();
				// Tell the world we've got it
				System.out.println( "Connection from "+s );
				// Create a DataOutputStream for writing data to the
				// other side
				DataOutputStream dout = new DataOutputStream( s.getOutputStream() );
				// Save this stream so we don't need to make it again
				outputStreams.put( s, dout );
				// Create a new thread for this connection, and then forget
				// about it
				new ServerThread( this, s );
				}
			}
		// Get an enumeration of all the OutputStreams, one for each client
		// connected to usEnumeration 
		Enumeration getOutputStreams() 
		{
			return outputStreams.elements();
			}
		// Send a message to all clients (utility routine)
		void sendToAll( String message )
		{
			// We synchronize on this because another thread might be
			// calling removeConnection() and this would screw us up
			// as we tried to walk through the listsynchronized( outputStreams ) {
			// For each client ...
			for (Enumeration e = getOutputStreams(); e.hasMoreElements(); )
			{
				// ... get the output stream ...
				DataOutputStream dout = (DataOutputStream)e.nextElement();
				// ... and send the message
				try {dout.writeUTF( message );} 
				catch( IOException ie ) { System.out.println( ie ); }}}
		// Remove a socket, and it's corresponding output stream, from our
		// list. This is usually called by a connection thread that has
		// discovered that the connectin to the client is dead.
		void removeConnection( Socket s ) 
		{
			// Synchronize so we don't mess up sendToAll() while it walks
			// down the list of all output streamsa
			synchronized( outputStreams ) {
				// Tell the world
				System.out.println( "Removing connection to "+s );
				// Remove it from our hashtable/list
				outputStreams.remove( s );
				// Make sure it's closed
				try {s.close();} 
				catch( IOException ie ) {System.out.println( "Error closing "+s );
				ie.printStackTrace();}}}
		// Main routine//Usage: java Server <port>
		static public void main( String args[] ) throws Exception 
		{// Get the port # from the command line
			int port = Integer.parseInt( args[0] );
			// Create a Server object, which will automatically begin// accepting 
			new Server( port );}
							
		}
In der folgenden Klasse ist die Main, da müsstest du mir helfen, wenn du willst, bitte
Java:
import java.awt.BorderLayout;
import java.awt.TextArea;
import java.awt.TextField;
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;
import javax.swing.JFrame;
 
public class Client extends JFrame implements Runnable {
    // Components for the visual display of the chat windowsprivate
    TextField tf = new TextField();
    private final TextArea ta = new TextArea();
    // The socket connecting us to the serverprivate
    Socket socket;
    // The streams we communicate to the server; these come
    // from the socketprivate
    DataOutputStream dout;
    protected DataInputStream din;
 
    // Constructorpublic
    public Client(final String host, final int port) {
        // Set up the screen
        setLayout(new BorderLayout());
        setVisible(true);
        setSize(200,200);
        add("North", this.tf);
        add("Center", this.ta);
        // We want to receive messages when someone types a line
        // and its return, using an anonymous class as
        // a callback
        this.tf.addActionListener(new ActionListener() {
 
            public void actionPerformed(final ActionEvent e) {
                processMessage(e.getActionCommand());
                // Connect to the server
                try {
                    // Initiate the
                    Client.this.socket = new Socket("", 12);
                    // We got a connection! Tell the world
                    System.out.println("connected to " + Client.this.socket);
                    // Let's grab the streams and create DataInput/Output
                    // streams
                    // from them
                    Client.this.din = new DataInputStream(Client.this.socket.getInputStream());
                    Client.this.dout = new DataOutputStream(Client.this.socket.getOutputStream());
                }
                // Start a background thread for receiving messagesnew
 
                catch (final IOException ie) {
                    System.out.println(ie);
                }
            }
 
        });
    }
 
    // Gets called when the user types something
    protected void processMessage(final String message) {
        try {
            // Send it to the server
            this.dout.writeUTF(message);
            // Clear out text input field
            this.tf.setText("");
        } catch (final IOException ie) {
            System.out.println(ie);
        }
    }
 
    // Background thread runs this: show messages from other window
    public void run() {
        try {// Receive messages one-by-one, forever
            while (true) {
                // Get the next
                final String message = this.din.readUTF();
                // Print it to our text
                this.ta.append(message + "\n");
            }
        } catch (final IOException ie) {
            System.out.println(ie);
        }
    }
    public static void main(String[]args)
    {
    	new Client("s",2);//<--Hier weiß ich nicht weiter, bitte, helf mir
    }
}
 
Hi,
Die gefragte Hostadresse ist nicht die IP-Adresse des Clienten, sondern die IP-Adresse des Computers auf dem dein Server läuft.
Was du machen willst (zum Testen) ist, den Server und den Klient (2 verschiedene Programme) auf der selben Maschine laufen zu lassen. Die IP "127.0.0.1" verweist immer auf den eigenen PC(=localhost).

Wenn dein Chat/Spiel fertig ist, dann hast du 2 Möglichkeiten, den Server laufen zu lassen:
1. Den Server auf beliebigem PC laufen lassen(z.B.: deinem Eigenen). Diese Variante hat aber Nachteile: Du musst deinen Mitspielern immer deine IP sagen, die sich ja regelmäßig ändert. Deine Freunde geben die dann in Eingabefeld ein, bevor Verbinung zum Server aufgenommen wird. Außerdem wir dein privater Pc nicht rund um die Uhr laufen, dass heißt, der Chat ist nur zu bestimmten Zeiten erreichbar.
2. Du suchst dir nen Webserver, der Servlets ausführt. Dieser läuft dann rund um die Uhr und ist immer erreichbar. Außerdem hast du einen Domainnamen als Host, die IP-Adresse brauchst du nicht, da der Domainname immer gleich ist. Der Nachteil: Es kostet Geld.

Wenn du noch weitere Fragen hast, nur zu.

Ciao
DosCoder

//Edit:
Desweiteren ist mir aufgefallen, dass in deinem Client immer noch ein fataler Fehler ist!
Oben habe ich dir doch den korrekten Code hingeschrieben! Das "ConnectionToTheServer"-Zeugs kommt DANACH und wird nicht irgendwie in actionPerformed reingebastelt (Siehe Tutorial, Client.java). Aber jetzt kann ich dich mal testen: Was passiert bei dem jetzigen Code?
 
Zuletzt bearbeitet:
was ich will ist dass, jeder in den Chat kommen soll, und der Chat selbst auf dem Port festgelegt ist,

Also ich weiß nicht, irgendwie muss es doch möglich sein, einen Chat zu schreiben,
du hattest gesagt der braucht einen Host, gehts nicht das jeder sein eigener Host ist,
und das Treffen in der Port adresse stattfindet?

Das wäre viel besser

ich habs auch schon ausprobiert,
diesen Port"127.0.0.1" anzugeben.
doch immer wenn ich beim "client" einen Text Eingebe und Bestätige kommt folgende FehlerMeldung
PHP:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at Profi_Chat.Client.processMessage(Client.java:65)
	at Profi_Chat.Client$1.actionPerformed(Client.java:38)
	at java.awt.TextField.processActionEvent(Unknown Source)
	at java.awt.TextField.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)

Ich denke mitlerweile hast du vielleicht auch den code, nur mal so,
ich hab die Zeilen nicht verändern, wie sie in meinem ersten Anfangs
Post schon gesendet wurde,

also was mache ich falsch, prinzipielle mach ich alles so wie du gesagt hast,
PS:
Wie macht man Java Code Tags hier in diesem Forum?

Code:
import java.awt.BorderLayout;
import java.awt.TextArea;
import java.awt.TextField;
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;
import javax.swing.JFrame;
 
public class Client extends JFrame implements Runnable {
    // Components for the visual display of the chat windowsprivate
    TextField tf = new TextField();
    private final TextArea ta = new TextArea();
    // The socket connecting us to the serverprivate
    Socket socket;
    // The streams we communicate to the server; these come
    // from the socketprivate
    DataOutputStream dout;
    protected DataInputStream din;
 
    // Constructorpublic
    public Client(final String host, final int port) {
        // Set up the screen
        setLayout(new BorderLayout());
        setVisible(true);
        setSize(200,200);
        add("North", this.tf);
        add("Center", this.ta);
        // We want to receive messages when someone types a line
        // and its return, using an anonymous class as
        // a callback
        this.tf.addActionListener(new ActionListener() {
 
            public void actionPerformed(final ActionEvent e) {
                processMessage(e.getActionCommand());
                // Connect to the server
                try {
                    // Initiate the
                    Client.this.socket = new Socket("", 12);
                    // We got a connection! Tell the world
                    System.out.println("connected to " + Client.this.socket);
                    // Let's grab the streams and create DataInput/Output
                    // streams
                    // from them
                    Client.this.din = new DataInputStream(Client.this.socket.getInputStream());
                    Client.this.dout = new DataOutputStream(Client.this.socket.getOutputStream());
                }
                // Start a background thread for receiving messagesnew
 
                catch (final IOException ie) {
                    System.out.println(ie);
                }
            }
 
        });
    }
 
    // Gets called when the user types something
    protected void processMessage(final String message) {
        try {
            // Send it to the server
            this.dout.writeUTF(message);
            // Clear out text input field
            this.tf.setText("");
        } catch (final IOException ie) {
            System.out.println(ie);
        }
    }
 
    // Background thread runs this: show messages from other window
    public void run() {
        try {// Receive messages one-by-one, forever
            while (true) {
                // Get the next
                final String message = this.din.readUTF();
                // Print it to our text
                this.ta.append(message + "\n");
            }
        } catch (final IOException ie) {
            System.out.println(ie);
        }
    }
    public static void main(String[]args)
    {
    	new Client("127.0.0.1",2);
    }
}

Ich hab nicht ganz verstanden was du mit fatalem Fehler meinst,
könntest du mir in deinem nächsten Post als letztes bitte den richtigen Code
senden
 
Hi,
deine NullpointerException kommt genau von diesem fatalen Error. Da dein Code zum Verbinden mit dem Server in der Methode actionPerformed() steht, wird er erst ausgeführt, wenn auf den Button "Senden" gedrückt wurde. Da aber die Methode processManage vor dem Serverzeugs aufgerufen wird, wird versucht, in einen OutputStream zu schreiben, der noch gar nicht initilaisiert wurde! Gehe deinen Code doch mal mit dem Debugger durch, ich nehme an, Eclipse besitzt so was(ich bin Netbeaner). Im Tutorial steht der richtige Client-Code.

Falls du es noch nicht verstanden hast: Server.java und Client.java sind 2 verschiedene Programme, die im reelen Leben auf verschiedenen Maschinen laufen.

Und nun zu den Hosts und Ports, ich versuche nochmal, es dir zu erkären.
Jeder PC hat eine IP. Wenn ein PC mit einem anderen Kontakt aufnehmen will. braucht er dessen ID. Dein Klient will sich mit dem PC verbinden, auf dem dein Server läuft, folglich braucht er dessen
ID. Der Server braucht zum Verbinden nicht die IP-Adresse des Klienten, warum später. Der Port ist nichts anderes, als die "Hausnummer auf dem PC, auf dem dein Server läuft.
Vergleich:
Du bist das Server-Programm, und wohnst in einem Haus in der Straße "192.89.0.1" mit der Hausnummer 4966. Wenn dir dein Freund(=Klient) jetzt einen Brief schreiben will, dann muss er deine Straße und deine Hausnummer wissen. Willst du IHM danach einen Brief schreiben, hast du ja seine Daten, da sie als Absender auf dem Brief stehen. Wenn du mehrere Freunde hast , können sie dir alle mit dir Verbindung aufnehmen. Schreibt jetzt einer eine Nachricht(=Brief), dann leitest du ihn einfach an alle Freunde weiter, die mit dir Verbindung aufgenommen haben.

Laufen/Läuft jetzt (ein Teil) dein/e/r Klienten auf dem selben PC wie das Server-Programm, müssen sie als als Adresse des Servers "127.0.0.1" angeben, der Port bleibt gleich.

Den Port deines Servers kannst du frei wählen, allerdings solltest du von den Portnummern bis 1023 Abstand nehmen, auf diesen laufen nämlich bekannte Dienste wie HTTP(Port 80), POP3 oder SMTP. Diese Dienste nennt man Well-Known-Services.
Ab 1023 bis 65535 sollten alle Ports frei sein, allerdings kann es immer passieren, dass ein anderer Hobbyprogrammierer zufällig denselben Port wie du benutzt.

Folgender Absatz ist keinesfalls als persölicher Angriff zu werten:
In dem Verlauf unseres "Gepräches" habe ich festgestellt, dass du mit GUI-Code wohl noch nicht so vertraut bist, insbesondere actionListener & Co. Hättest du gewusst, was der Code genau macht, hättest du von Anfang an die Klammern richtig gesetzt, anstatt sie irgendwie zu setzen, sodass kein Compilierfehler mehr aufaucht.
Was ich damit sagen möchte ist: Wenn du dich mit diesen anoymen Klassen noch nicht auskennst, ist es dann klug, sich mit einem Chat zu versuchen? Das musst du entscheiden, ich werde dir gerne weiterhelfen. Es geht hier einzig alleine um dich.

Ciao
DosCoder
 
Man danke, dass du s mir mit dem Beispiel der Hausnummer erklärt hast, das habe ich wirklich nicht gewusst.

Auch dass Client und das andere 2 verschiedene Klassen sind habe ich noch nicht gewusst, also erstmal danke dazu.

Also nein, ich bin nicht vertraut mit dem umgang von anonymen Klassen, ich danke dir für deine Hilfe, wirklich, ohne dich hätte ich das nie kapiert.

Eine ganz entscheidende Frage habe ich da aber noch, bitte, ist die Klasse Server
auch eine Art Chat die über die Eingabeaufforderung läuft?

also nur mal , die Server Klasse hat eine main(),
in der, der Server gestartet wird,
dann kommt folgendes System.out.println""
PHP:
Listening on ServerSocket[addr=0.0.0.0/0.0.0.0,port=0,localport=2]
Und dann kann man Dinge eingeben
ich glaube aber, dass das funktioniert, aber auf meinem Rechner,
weil da ist keine addr= und kein port=
nur der local port
wie könnte ich z.B. mit einem Anderen Chatten auf meinem Rechner, mit meiner "ID".
Wie könnte ich dem meine geben?
 
Hi,
Ich würde eher sagen, die Klasse Chat verwaltet die Klienten, man kann ja im Server-Programm selbst nichts eingeben. Das Serverprogramm läuft als Konsole wartet einfach auf Anfragen von Klienten.
Außerdem:
Auch dass Client und das andere 2 verschiedene Klassen sind habe ich noch nicht gewusst, also erstmal danke dazu.
Das Client und Server verschiedene Klassen sind, müsstest du gewusst haben, du hast mir ja im 6.Post die Klassen getrennt voneinander gepostet. Ich glaube, für dich war neu, dass die Server und Client 2 verschiedene Programme sind.

Antwort zu deinem neuem Beitrag
(Local)Port 2 ist schlecht, da, wie in meinem letzten Post gesagt, man nur Ports über 1023 verwenden sollte. Also bitte ändere den Port.
Nun zu deiner IP-Frage. Genau das ist das Problem bei diesem Chat, aber ich habe dir ja in Post 7 schon die Möglichkeiten genannt.
Ciao
DosCoder

PS: Kieg ich noch ein Renomme?
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück