# Warum kann ich kein Socket aufbauen?



## publicmain (23. Sep 2013)

Hallo,

ich möchte gerne lernen, wie man Java im Internet benutzt. Dazu mache ich gerade das Tutorial von Galileo Computing.

Leider funktioniert das, was dort aufgelistet ist, oft nicht und ich habe keine Ahnung wieso.

Z.B. hänge ich gerade hier:
Galileo Computing :: Java ist auch eine Insel – 21.6 Mit dem Socket zum Server

Warum kann ich kein Socket aufbauen, wenn ich das Beispiel des Tutorials programmiere?

Vielen Dank für jede Hilfe!


----------



## ARadauer (23. Sep 2013)

publicmain hat gesagt.:


> Leider funktioniert das, was dort aufgelistet ist, oft nicht und ich habe keine Ahnung wieso.


"Funktioniert nicht" ist keine Fehlerbeschreibung... woher sollen wir wissen was du falsch machst. zeig code, fehlermeldung, usw...


----------



## publicmain (25. Sep 2013)

Stimmt. Entschuldige, "es funktioniert nicht" ist wirklich ein blöder Einwurf.

Ich habe gerade das hier programmiert:
Galileo Computing :: Java ist auch eine Insel – 21.7 Client-Server-Kommunikation

Eine Fehlermeldung kann ich leider nicht liefern, weil es keine gibt.
Es funktioniert einfach nicht.

Ich möchte einen Server und einen Client machen. Der Client soll dem Server 2 Zahlen in Strings senden, dieser multipliziert beide Zahlen und sendet sie dem Client zurück. Der Client gibt das Ergebnis dann über die Konsole aus. Ich habe also 2 Anwendungen gestartet. Aber auf der Konsole des Clients taucht einfach nichts auf. Ich weiß auch nicht wo ich einen Fehler suchen soll. Ich bin in dieser Hinsicht leider sehr unerfahren.

Würde mich über Hilfen echt freuen!

Danke!


----------



## ARadauer (25. Sep 2013)

Tja blöd. . . Mein tipp: du machst was falsch oder das Problem ist eine Firewall. ..
Zeig deinen code!


----------



## publicmain (25. Sep 2013)

Also zuerst starte ich den Server:


```
import java.io.IOException;
import java.io.PrintWriter;
import java.math.BigInteger;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;




public class Galileo21_7MulServer {
	
	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 static void main (String[] args) throws IOException {
		ServerSocket server = new ServerSocket( 3143 );
		server.setSoTimeout(60000);
		while (true) {
			Socket client = null;
			try {
				client = server.accept();
				handleConnection (client);
			}
			catch ( IOException e ) {
				System.out.println( "IOException: " + e );
			}
			finally {
				if ( client != null )
					try { client.close(); } catch ( IOException e) { } 
			}
		}
	}

}
```


Und danach starte ich den Client:


```
import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;




public class MulClient {
	
	public static void main (String[] args) {
		
		Socket server = null;
		
		try {
			server = new Socket ("localhost", 3143);
			Scanner in = new Scanner ( server.getInputStream() );
			PrintWriter out = new PrintWriter ( server.getOutputStream() );
			
			out.println ("2");
			out.println ("4");
			System.out.println(in.nextLine()); 

			server = new Socket ("localhost", 3143);
			in = new Scanner ( server.getInputStream() );
			out = new PrintWriter ( server.getOutputStream() );
			
			out.println ("23895737895");
			out.println ("434589358935857");
			System.out.println("23895737895 x 434589358935857 = " + in.nextLine()); 
		}
		catch (UnknownHostException e) {
			e.printStackTrace();
		}
		catch (IOException e) {
			e.printStackTrace();
		}
		finally {
			if ( server != null )
				try { server.close(); } catch ( IOException e ) { }
		}
	}

}
```

Also ganz das Beispiel aus dem OpenBook.

Warum bekomme ich keine Antwort?


----------



## HBerger (26. Sep 2013)

Kannst Du debuggen ? Da solltest doch sehen was er so macht  
Zu Java kann ich nicht viel sagen, kann sein das da der eine oder andere Fehler noch drinn ist.  

DIe Frage ist, der java.util.scanner blockiert der, bis der Daten bekommt ? 


> Advances this scanner past the current line and returns the input that was skipped. This method returns the rest of the current line, excluding any line separator at the end. The position is set to the beginning of the next line.
> 
> Since this method continues to search through the input looking for a line separator, it may buffer all of the input searching for the line to skip if no line separators are present.


klingt zumindest nicht danach ... 

So hasst du das problem: 
- Der server baut listner socket und lauscht
- Der client verbindet sich 
- der server reagiert auf den connect, erstellt den neuen client socket und bestaetigt die verbindung ... 
bis dahin laeuft noch alles chronologisch, aber nu
- der client sendet die werte
- der server liest sofort auf dem socket 

da iss die reihenfolge unbestimmt .... d.h. der Server liest vielleicht aus dem socket, wenn noch keine daten angekommen sind.
wirft der Server eine NoSuchElementException ? 

Normal wartet man bis daten an nem Socket ankommen, und arbeitet die in ner Schleife ab ... 
und baut ne Abbruch Mechanik rein. 
Auf TCP Ebene wirst immer nen Protokoll, so simpel es auch sein mag, bauen muessen, solange du ne communication bauen willst, und nicht nur irgendwas belauschen willst. 

Ciao ...


----------



## publicmain (26. Sep 2013)

Hallo HBerger, danke für deine Antwort!

Ich weiß leider nicht, was genau ich debuggen soll.

Aber mal eine Gegenfrage. Das Beispiel ist aus dem OpenBook von Galileo. Warum sollten die Beispiele veröffentlichen, die nicht funktionieren?

Wie man Protokolle bastelt weiß ich leider auch nicht. Im OpenBook steht, dass die Kommunikation bereits von Java gemanaget wird.

Ich bin weiterhin für jede Hilfe dankbar!





Die Funktion 
	
	
	
	





```
handleConnection(Socket)
```
 wird noch aufgerufen. Aber bei 
	
	
	
	





```
String factor1 = in.nextLine();
```
 bleibt das Programm stehen. 




An der Firewall liegt es übrigens nicht. Ich habe sie gerade ausgeschaltet und das Ergebnis war gleich.


----------



## Xeonkryptos (26. Sep 2013)

publicmain hat gesagt.:


> Die Funktion
> 
> 
> 
> ...




Die readXXX()-Methoden der Scanner-Klasse blockieren, bis du eine Eingabe getätigt hast! Gibst du denn etwas in der Konsole ein? Am besten ein 
	
	
	
	





```
System.out.print("Eingabe: ");
```
 davor hängen! Dann siehst du, wann du etwas eingeben musst! Vorher wird der Code nicht weiter ausgeführt!


----------



## publicmain (26. Sep 2013)

Ich gebe über dem Client folgenden String ein (s.o.):


```
PrintWriter out = new PrintWriter ( server.getOutputStream() );
out.println ("2");
out.println ("4");
```


----------



## HBerger (26. Sep 2013)

ok, wenn er beim lesen blockiert, sollt es wiederum funktionieren .... 



> An der Firewall liegt es übrigens nicht. Ich habe sie gerade ausgeschaltet und das Ergebnis war gleich.


wenn die firewall das problem waer, wuerde der tcp connect nicht zustande kommen ... das wuerdest du anders merken (Ecxeption)   



> bleibt das Programm stehen.


Also debuggst du schon :bae:

Kannst du am client auch debuggen ? 
laeuft der auch ueber das: 

```
out.println ("23895737895");
out.println ("434589358935857");
```
drüber ? 

notfalls nach dem 2. println mal nen flush machen(keine ahnung wie das in Java geht ^^) 
Sollte aber eigentlich nicht das problem sein ... der Socket puffert deine ausgabe zwar, und die menge langt sicher nicht um nen packet sofort abzuschicken. Aber normal sollte er nach zig millisekunden auch von allein abschicken, egal wie gross das packet ist.   



> Aber mal eine Gegenfrage. Das Beispiel ist aus dem OpenBook von Galileo. Warum sollten die Beispiele veröffentlichen, die nicht funktionieren?


Ich komm aus der C/C++ Ecke und da gibt es Literatur ... :shock:
Da iss sofort verbrennen das beste was man machen kann ... also nicht den Autor ... :bloed:

Bei Galileo iss so ne Sache. gibt paar wenige gute Buecher. richtig falsch sind da auch eher wenige, aber einige sind einfach nurn Abdruck von anderer Dokumentation, mit bissi Prosa zwischendrin. 

Ciao ...


----------



## publicmain (26. Sep 2013)

Nein, ich debugge nicht. Das Debuggen dauert immer so lange und ich verstehe fast nichts. Ich gebe nach jedem Befehl eine Zahl in der Konsole auf, so dass ich weiß, bis wohin das Programm läuft.


Also der Client führt 
	
	
	
	





```
out.println ("4");
```
 aus und bleibt dann vor 
	
	
	
	





```
System.out.println(in.nextLine());
```
 stehen.

Der Server führt 
	
	
	
	





```
PrintWriter out = new PrintWriter ( client.getOutputStream(), true );
```
 aus und bleibt vor 
	
	
	
	





```
String factor1 = in.nextLine();
```
 stehen.

Eigentlich sollte der Server an dieser Stelle die 4 einlesen.


----------



## publicmain (26. Sep 2013)

Endlich funktioniert es.

Du hattest recht. Ein einfaches 
	
	
	
	





```
out.flush();
```
 hat gefehlt, damit die Daten gesendet werden. Echt komisch, dass das OpenBook nicht darauf aufmerksam gemacht hat.

Vielen Dank an alle Antworter!


----------



## publicmain (26. Sep 2013)

Eine Frage habe ich noch!

Wenn ich anstatt localhost meine IP eingebe, dann bekomme ich wieder keine Antwort.


```
server = new Socket ("localhost", 3141);
```


```
server = new Socket (meineip, 3141);
```

Woran liegt das?


----------

