# Server und Client verbinden nicht



## tsag (19. Jun 2012)

Hallo,

ich versuche gerade, mein Programm Netzwerkfähig zu machen. Leider ist das nicht so einfach, wie ich dachte. Ich habe mir als Vorlage den Code aus Java ist auch eine insel genommen, genau genommen diese Seite: Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 18.8 Client-Server-Kommunikation

Ich habe zuerst MulServer und MulClient, so wie sie da aufgeführt sind, ausgeführt und es hat alles funktioniert. Da ich aber eine Netzwerkverbindung in meinem bestehenden Programm haben möchte (welches schon eine main-klasse besitzt), habe ich den MulServer modifiziert so modifiziert:


```
import java.io.*; 
import java.math.BigInteger;
import java.net.*; 
import java.util.Scanner;
 
public class MulServer extends Thread
{ 
  private static void handleConnection( Socket client ) throws IOException 
  { 
    Scanner     in  = new Scanner( client.getInputStream() ); 
    PrintWriter out = new PrintWriter( client.getOutputStream(), true ); 
 
    String factor1 = in.nextLine(); 
    String factor2 = in.nextLine(); 
 
    out.println( new BigInteger(factor1).multiply( new BigInteger(factor2) ) ); 
  } 
  public void run() 
  { 
    ServerSocket server = null;
	try {
		server = new ServerSocket( 3141 );
	} catch (IOException e1) {
		// TODO Auto-generated catch block
		e1.printStackTrace();
	} 
 
    while ( true ) 
    { 
      Socket client = null; 
 
      try 
      { 
        client = server.accept(); 
        handleConnection ( client ); 
      } 
      catch ( IOException e ) { 
        e.printStackTrace(); 
      } 
      finally { 
        if ( client != null ) 
          try { client.close(); } catch ( IOException e ) { } 
      } 
    } 
  } 
}
```

und habe ihn (zum Test) direkt an den Anfang meiner Mainklasse gepackt mit


```
public static void main(String[] args) {
		
		MulServer server = new MulServer();
		server.start();
		
....
	}
```

Dann habe ich versucht, mit den Clienten zu verbinden, aber es hat nicht funktioniert. Ich habe auch schon einige andere Dinge ausprobiert, aber es hat nichts funktioniert. Eigentlich wollte ich den Server ins actionPerformed eines JButtons packen, aber das hat genausowenig funktioniert wie mit der Mainklasse. Könnt ihr mir sagen was ich falsch mache?


----------



## SlaterB (19. Jun 2012)

du hast vergessen jeglichen Fehler genau zu beschreiben, 
wenn ich deine Klasse mit

```
public class Test {

	public static void main(String[] args) throws Exception {
		MulServer server = new MulServer();
		server.start();

		Thread.sleep(1000);
		Socket s = new Socket("localhost", 3141);
		Scanner in = new Scanner(s.getInputStream());
		PrintWriter out = new PrintWriter(s.getOutputStream(), true);
		out.println("13");
		out.println("14");
		String erg = in.nextLine();
		System.out.println("erg: " + erg);
	}
}
```
laufen lasse, erscheint das gewünschte Ergebnis, alles geht bestens,
auch der MulClient aus dem Buch geht

> Dann habe ich versucht, mit den Clienten zu verbinden, aber es hat nicht funktioniert. 

hmm, mit Exception?


----------



## tsag (19. Jun 2012)

Also wenn ich mein Programm mit dem Server in der Mainklasse starte bekomm ich keinen Fehler.
Wenn ich allerdings den MulClient starte, bekomme ich nach kurzer Zeit folgenden Fehler:

java.net.ConnectException: Connection timed out: connect
	at java.net.DualStackPlainSocketImpl.connect0(Native Method)
	at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
	at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
	at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
	at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
	at java.net.PlainSocketImpl.connect(Unknown Source)
	at java.net.SocksSocketImpl.connect(Unknown Source)
	at java.net.Socket.connect(Unknown Source)
	at java.net.Socket.connect(Unknown Source)
	at java.net.Socket.<init>(Unknown Source)
	at java.net.Socket.<init>(Unknown Source)
	at MulClient.main(MulClient.java:13)

Da MulClient aber mit dem original MulServer funktioniert, muss der Fehler ja beim meinem editieren MulServer liegen.


----------



## SlaterB (19. Jun 2012)

du schriebst zu Beginn, dass du
> ....
in deiner main hast, wenn du die streichst, geht es dann?
bzw. funktioniert meine main als Komplettdurchgang?

falls ja, was genau hast du alles unter
> ....
?
wird dort auch mit dem Server verbunden? wenn eine Connection offen ist ohne gleich durchgearbeitet zu werden,
und keine andere akzeptiert werden, dann wäre mir so eine Fehlermeldung denkbar, 
auch wenn ich sie selber gerade mit 3 Min. Wartezeit nicht reproduzieren konnte

generell könnte man den Server so umbauen, dann nach accept() ein Thread für die Bearbeitung eines Clients gestartet wird,
damit könnte der ServerSocket unmittelbar wieder mit accept() belauscht werden


----------



## tsag (19. Jun 2012)

Ich habe es jetzt nochmal mit deiner Methode getestet. Damit funktioniert es. Ich versuche allerdings auch, von meinem notebook einer Verbindung zum PC aufzubauen, indem ich anstatt der adresse localhost "192.168.2.2" anwende. Das hat mit dem original MulServer/MulClient auch funktioniert. Muss man bei so einer LAN-Verbindung noch etwas beachten?


----------



## SlaterB (19. Jun 2012)

zu beachten ist vieles, wovon ich das meiste nicht benennen kann,
wenn es aber schon mal lief, dann klingt das ja erfreulich,
versuche dorthin zurück zu gelangen,
und lasse dann den Server in seinem korrekten Zustand, baue höchstens Ausgaben ein, etwa 'Server gestartet'

starte ihn über eine andere main  mit einer anderen Thread-Klasse, die in ihrer run-Methode  MulServer.main(null); aufruft,
dann auch Fehler?

gibts irgendwelche Firewall-Einstellungen für das eine Programm, für das andere aber nicht?


----------



## tsag (20. Jun 2012)

Danke für die Hilfe, es hat jetzt funktioniert. Die Windows Firewall hat die Verbindung blockiert, nachdem ich sie deaktiviert habe, hat es funktioniert. Aber schon komisch, dass eine Datei einfach so blockiert wird und ne andere nicht.


----------

