Warum kann ich kein Socket aufbauen?

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!
 
Zuletzt bearbeitet:
Also zuerst starte ich den Server:

Java:
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:

Java:
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? 🙁
 
Zuletzt bearbeitet:
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 ...
 
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
Java:
handleConnection(Socket)
wird noch aufgerufen. Aber bei
Java:
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.
 
Zuletzt bearbeitet:
Die Funktion
Java:
handleConnection(Socket)
wird noch aufgerufen. Aber bei
Java:
String factor1 = in.nextLine();
bleibt das Programm stehen. 🙁


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
Java:
System.out.print("Eingabe: ");
davor hängen! Dann siehst du, wann du etwas eingeben musst! Vorher wird der Code nicht weiter ausgeführt!
 
Zuletzt bearbeitet:
Ich gebe über dem Client folgenden String ein (s.o.):

Java:
PrintWriter out = new PrintWriter ( server.getOutputStream() );
out.println ("2");
out.println ("4");
 
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:
Java:
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 ...
 
Zuletzt bearbeitet:
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
Java:
out.println ("4");
aus und bleibt dann vor
Java:
System.out.println(in.nextLine());
stehen.

Der Server führt
Java:
PrintWriter out = new PrintWriter ( client.getOutputStream(), true );
aus und bleibt vor
Java:
String factor1 = in.nextLine();
stehen.

Eigentlich sollte der Server an dieser Stelle die 4 einlesen.
 
Zuletzt bearbeitet:
Endlich funktioniert es.

Du hattest recht. Ein einfaches
Java:
out.flush();
hat gefehlt, damit die Daten gesendet werden. Echt komisch, dass das OpenBook nicht darauf aufmerksam gemacht hat.

Vielen Dank an alle Antworter!
 
Eine Frage habe ich noch!

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

Java:
server = new Socket ("localhost", 3141);
Java:
server = new Socket (meineip, 3141);

Woran liegt das?
 

Zurück
Oben