# Multithreaded Server: Connection reset



## Brainscanner (12. Nov 2006)

Hi,

ich versuche mich gerade an einem multithreaded Server mit Client. Die Klasse EmpfangsDame lauscht auf einem festen Port, nimmt Verbindungen an und reicht sie an die Arbeiterklasse durch, die als neuer Thread gestartet wird, so daß die EmpfangsDame wieder frei ist für neue Verbindungen.
Prinzipiell scheint zwar alles richtig zu sein, aber sobald ich versuche vom Server was an den Client zu schicken, krieg ich die Meldung connection reset. Wenn ich versuche was vom Client an den Server zu schicken, passiert gar nichts. Hier mal die Quellen:


```
import java.net.*;
import java.io.*;

public class EmpfangsDame
{	
	public static void main(String[] args)
	{
		try
		{
			ServerSocket s;
			Socket c;
			
			s = new ServerSocket(1234);
			System.out.println("Server gestartet...");
			//while(true)
			//{
				c = s.accept();
				Thread t = new Arbeiter(c);
				t.start();
			//}			
		}
		catch(Exception e)
		{ System.out.println(e); }
	}
}
```

Die while-Schleife der EmpfangsDame ist momentan auskommentiert. Wenn ich sie drin lasse, krieg ich keine Fehlermeldung, aber es kommen auch keine Daten durch. Es ist als ob der Server den Teil, wo er schließlich Daten empfängt, überspringt. Die Port- und Adressinformationen über den Client zeigt er mir in der Arbeiter Klasse schließlich auch noch an.


```
import java.net.*;
import java.io.*;

public class Arbeiter extends Thread
{
	public static Socket c;
	
	Arbeiter(Socket from)
	{
		this.c = from;
	}
	
	public void run()
	{
		try
		{
			System.out.println("Arbeiter: Client verbunden: " + c.getInetAddress() + " von Port " + c.getPort());
			
			BufferedReader networkIn;
			networkIn = new BufferedReader(new InputStreamReader(c.getInputStream()));
			String Anfrage = networkIn.readLine();
			System.out.println("Das hat der Client geschickt: " + Anfrage);
			c.close();
		}
		catch(Exception e)
		{ System.out.println(e); }
	}

}
```


```
import java.io.*;
import java.net.*;

public class Client
{
	public static Socket s;
	
	public static void main(String[] args)
	{
		PrintWriter networkOut;
		
		try
		{
			s = new Socket("127.0.0.1", 1234);
			System.out.println("Client: habe verbunden");
			
			
			networkOut = new PrintWriter(s.getOutputStream());
			networkOut.print("Hallo, ich bin's, der Client");
			networkOut.flush();
			System.out.println("Client: Habe Daten verschickt");
		}
		catch(Exception e)
		{
			System.out.println(e);
		}
	}
}
```


----------



## hansch (12. Nov 2006)

Da ich keine offensichtlichen Fehler gefunden habe auf di Schnelle, hab ich den Code probiert und er funktioniert auch einwandfrei...
Der Server empfängt die Nachricht 'Hallo, ich bin's, der Client'.. Wo du aber etwas vom Server zum Client schickst kann ich leider nicht finden.

Vielleicht ist dein Port 1234 belegt oder eine Firewall lässt dich nicht verbinden... Dann sollte aber überhaupt keine Verbindung zu Stande kommen und dein Client hängen, da du kein Timeout angegeben hast.


----------



## Brainscanner (12. Nov 2006)

Klasse! Schon wieder so ein Phantomfehler. Wenn's bei Dir funktioniert, bin ich noch einigermaßen zufrieden, weil's nicht auf meinem Rechner laufen muß.

Ich hatte ein ähnliches Problem, das ich nicht lösen konnte. Betriebssystem XP Pro SP2. KEINE Firewall drauf (und die von Windoof ist abgeschaltet), nur ein Virenscanner von Symantec (eine frühere Version davon hat früher schonmal nen C++ Compiler am Funktionieren gehindert).
Jedenfalls funktioniert es nicht, wenn ich versuche das http Protokoll nachzubauen. Ich kann das Kommando absenden, laut Wireshark ist es auch verschickt worden und gültig, aber ich kriege keine Antwort. SMTP z.B. kann ich aber benutzen.
Weil mich das damals verwirrt hat, hab ich das Programm in .net nachgebaut --> Genau die gleichen Symptome. Scheint also irgendwie mit meinem System zusammenzuhängen. Ich habs aber auch komplett innerhalb vom VMware ohne jegliche installiert Zusatzsoftware versucht, da ging's auch nicht. So als würde es die physische Hardware verhindern ;-)

Ohne Threads klappt die Kommunikation übrigens.... :-(

Das Senden vom Server zum Client hab ich nicht den Quelltext hier im Forum übernommen, damit das Programm übersichtlicher wird.

Na ja, wenn's bei Dir läuft, soll es gut sein. Vielen Dank fürs Ausprobieren !!


----------



## Brainscanner (12. Nov 2006)

Hey, die Lösung war diesmal gar nicht so kompliziert. Ich hab von anderer Seite her noch erfahren, daß es an der readline Methode vom Server liegt. Die scheint auf ein "\n" in der Nachricht gewartet zu haben. Wenn ich das einfüge, klappt's


----------



## Guest (12. Nov 2006)

Stimmt. readln() erwartet ein '\n'.. nur lustig, dass es trotzdem funktioniert hat  :roll: 
Aber wenn es jetzt läuft wie gewünscht ist ja gut.
lg


----------

