Socket Programmierung

thomasbe

Mitglied
Hallo,

ich bin gerade dabei einen Chat Client zu programmieren und habe Probleme mit den Sockets.

Irgendwo ist ein Fehler drin aber ich finde ihn nicht.

Hier ist meine Server Klasse:
Code:
public class ChatServer extends JFrame 
{		
	public static void main (String[] args)
	{
		try
		{
			ServerSocket server = new ServerSocket(80);
			
			JFrame Fenster = new JFrame();
			Fenster.setVisible(true);
			Fenster.setSize(50, 50);
			Fenster.setDefaultCloseOperation(EXIT_ON_CLOSE);
			
			while(true)
			{
				Socket client = server.accept();
				
				InputStream inputStream = client.getInputStream();
				InputStreamReader inputStreamReader = new InputStreamReader(inputStream); 
				BufferedReader input = new BufferedReader(inputStreamReader); 

				OutputStream outputStream = client.getOutputStream();
				OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); 
				BufferedWriter output = new BufferedWriter(outputStreamWriter); 
								
				String sInput = input.readLine();
	    		output.write(sInput);
				
				output.flush();
				output.close();
			}
		}
		catch(Exception e)
		{
			System.out.println(e.getMessage());
		}
	}
	
}


und hier die funktion in der ich die nachrichten verschicke:

Code:
public void SendMessage(String sMessage, TextArea txaMessageBoxShow)
        {
        	try
        	{
	        	Socket client = new Socket("IP", 80);
	        	
	    		OutputStream outputStream = client.getOutputStream();
				OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); 
				BufferedWriter output = new BufferedWriter(outputStreamWriter); 
	    		
	    		txaMessageBoxShow.append(sMessage + "\n");
	    		output.write(sMessage);
	    		
	    		output.flush();    		
	    		client.close();
	    		output.close();
        	}
        	catch(Exception e)
        	{
        		System.out.println(e.getMessage());
        	}
        }


und in dieser klasse hole ich die nachrichten:

Code:
public class ReadMessages implements Runnable 
{ 
	TextArea txaMessageBoxShow = new TextArea();
	
	ReadMessages(TextArea txaMessageBoxShow)
	{
		this.txaMessageBoxShow = txaMessageBoxShow;
	}
	
	public void run() 
	{ 
		try
    	{
        	while(true)
        	{
        		Socket client = new Socket("IP", 80);
    			
        		InputStream inputStream = client.getInputStream();
				InputStreamReader inputStreamReader = new InputStreamReader(inputStream); 
				BufferedReader input = new BufferedReader(inputStreamReader); 
				
    			String sInput = input.readLine();
    			
    			txaMessageBoxShow.append(sInput);
        	}
    	}
    	catch(Exception e)
    	{
    		System.out.println(e.getMessage());
    	}
	} 
}

Hoffentlich könnt ihr mir helfen.
Danke schonmal
 
Wäre einfacher wenn du das komplette Projekt posten würdest, oder wenn du wenigstens den Fehler sagen würdest.
Aber auf einem Blicke würde ich das sagen:
Socket client = new Socket("IP", 80);

Und bitte nicht 80, auf einem Port kann nur ein Programm listenen, und 80 ist schon für HTTP vergeben. Nimm am besten 6667 oder irgend eine Zufallszahl zwischen 0 und 65535
 
Ich glaube mit Singlethread-Anwendung kommst Du da nicht weit.
Ich hatte vor längerer Zeit mal ein Beispiel, was ich dann aufgebohrt hatte. Soweit ich mich erinnere gab es da mehere Threads, die benötigt wurden.
Es wr wirklich nicht ganz tirvial. Bei native Socektanwendungen kommt noch hinzu dass man Probleme bekommen wird sobald man mit dem Programm dann über Internet arbeiten möchte, da man auf Situationen wie Benutzer hinter Firewall und Router etc. entsprechende extra Lösungen braucht. die Technologie JXTA schlägt da in diese Kerbe.
 
Vielen Dank für den Tipp. Also ich benutze jetzt extra Threads zum Nachrichten lesen und antworten. Funktioniert aber leider immer noch nicht ganz rund. Ich muss immer die Connection schließen das mein Client Nachrichten verschicken kann. Wenn ich aber geschloßen habe dann kann mein Server die Nachricht nicht verschicken. Uff :confused:
 
Ich weiß zwar nicht was du mittlerweile so hast, aber ich benutze immer die beiden Methoden:

Java:
public void send(String string)
{
	try
	{
		PrintWriter printWriter;
		printWriter = new PrintWriter(
			new OutputStreamWriter(
				socket.getOutputStream()));
		printWriter.print(string);
		printWriter.flush();
	}
	catch(Exception e)
	{
		e.printStackTrace();
	}
}
public String read()
{
	try
	{
		BufferedReader bufferedReader = null;
		bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));

		char[] buffer = new char[200];
		int anzahlZeichen = 0;
		anzahlZeichen = bufferedReader.read(buffer, 0, 200);
		String nachricht = new String(buffer, 0, anzahlZeichen);
        return(nachricht);
	}
	catch(Exception e)
	{
		e.printStackTrace();
	}
	return(null);
}

Versuche es mal damit.
Einfach in einer Endlosschleife in der run() des Threads read(), und dann je nach empfangene Informationen was zurücksenden.

Der Socket muss in der Variable socket vom Typ Socket als Klassenvariable gespeichert werden.
send(String) sendet zum Clienten/Server (je nach Seite eben) Daten.
read() wartet auf eingehende Daten und gibt sie es als String zurück. Denke daran immer eine Empfangsbestätigung zu senden.

Also wenn jetzt die Daten "www", "tutorials" und "de" gesendet werden sollen:

send("www");
read();
send("tutorials");
read();
send("de");
read();

Und auf der anderen Seite:

read();
send("OK");
read();
send("OK");
read();
send("OK");

Was genau du auf der Gegenseite sendest ist egal. Das letzt read/send ist je nach Servercode optimal. Es ist nur wichtig dass der Absender erfährt dass der gegenüber die Daten gelesen hat. Sonst kann es passieren dass sich die Daten "stauen" und der Gegenüber mit einen read() 2 verschiedene Datensätze als einen String zurückgibt, was logischerweiße den Betrieb stört oder sogar zu einer Exception führt. Kommt halt auf deinen Server/Client an.
 
Zurück