Übertragung via Sockets

Status
Nicht offen für weitere Antworten.

Bohne

Aktives Mitglied
Ich arbeite mich gerade in das Thema Sockets ein und habe eine wohl triviale Frage, die ich leider nicht lösen kann: Es geht um eine Server-Client App, bei der der Client nacheinander zwei Zahlen an den Server schickt und dieser sie multipliziert und das Ergebnis zurückschickt. Code wie folgt:

Code:
import java.net.*;
import java.io.*;

public class Server
{
	public static void main( String args[] ) throws IOException
	  {
	    ServerSocket server = new ServerSocket( 3141 );

	    while ( true )
	    {
	      Socket client = server.accept();

	      InputStream  in  = client.getInputStream();
	      OutputStream out = client.getOutputStream();

	      int start = in.read();
	      int end = in.read();

	      int result = start * end;
	      System.out.println(result);
	      out.write(result);

	      client.close();
	    }
	  }
}

Code:
import java.net.*;
import java.io.*;

public class Client {
	public static void main( String args[] ) throws IOException {
		Socket server = new Socket ( "localhost", 3141 );
	
	    InputStream in = server.getInputStream();
	    OutputStream out = server.getOutputStream();
	
	    out.write( 99 );
	    out.write( 9 );
	
	    int result = in.read();
	    System.out.println( result );
	
	    server.close();
	}
}

Problem: Wenn ich das Ergebnis von 4*9 berechnen lasse funktioniert's, bei 99*9 jedoch nicht. Es scheint bei der Übertragung was nicht zu klappen, da der Server das richtige Ergebnis ausgibt. Auf der Client-Seite printet er jedoch 123 - da kann doch was nicht stimmen?!

Danke!
 
S

sebastian4gold

Gast
Lass mich raten: Java Insel-Buch?

Das Problem besteht darin, das nur Bytes übertragen werden, und so das Ergebis nicht größer als 127 sein darf. (Steht im Buch sogar unten drunter :_) )

Problemlösung:
Client: String ss = "" + 9 + "," + "99"; write(ss.toString().getBytes())
und Server:StringBuffer s = new StringBuffer(); s.append( read() );

Dann hast du auf dem Server einen String "9,99", kannst du wieder trennen (StringTokenizer Klasse), dann Ergebnis als String zurückschicken.

Gruß, hoffe geholfen zu haben,
Sebastian
 
G

Guest

Gast
Bohne hat gesagt.:
Problem: Wenn ich das Ergebnis von 4*9 berechnen lasse funktioniert's, bei 99*9 jedoch nicht. Es scheint bei der Übertragung was nicht zu klappen, da der Server das richtige Ergebnis ausgibt. Auf der Client-Seite printet er jedoch 123 - da kann doch was nicht stimmen?!

Danke!

Wieso nimmst du DataOutputStream bzw. DataInputStream nicht? Dann könntest Du Zahlen direkt schreiben und musst dich mit Bytes nicht herumschlagen?
 
B

Beni

Gast
read & write lesen/schreiben nur ein byte (von 4 beim int), blabla, Forensuche, API, blabla, Binäre Operationen, DataInput/OutputStream.
 

Bohne

Aktives Mitglied
Hab es jetzt mit DataInput-/Output- Streams versucht, und es funktioniert!

Code:
Socket client = server.accept();

InputStream  in  = client.getInputStream();
OutputStream out = client.getOutputStream();
	      
try {
	DataInputStream data = new DataInputStream(in);
	DataOutputStream result = new DataOutputStream(out);
	int start = data.readInt();
	int end = data.readInt();
	int ergebnis = start * end;
	result.writeInt(ergebnis);
} catch (IOException e) {
	System.err.println(e);
}
client.close();

Code:
Socket server = new Socket ("localhost", 3141 );
	
InputStream in = server.getInputStream();
OutputStream out = server.getOutputStream();
		
try {
	DataInputStream result = new DataInputStream(in);
	DataOutputStream data = new DataOutputStream(out);
	data.writeInt(99);
	data.writeInt(9);
	int ergebnis = result.readInt();
	System.out.println(ergebnis);
} catch (IOException e) {
	System.err.println(e);
}

server.close();

Allerdings versuche ich noch vergeblich einen BufferedInput-/Output-Stream einzubauen: Die Write-Funktion wird zwar ausgeführt (hab ich ausprobiert, indem ich danach was auf die Shell ausgeben lasse), allerdings liest der Server die Daten irgendwie nicht ein. Relevanter Code (hier für die Client-Klasse) wie folgt:

Code:
		InputStream in = server.getInputStream();
		OutputStream out = server.getOutputStream();
		
		BufferedInputStream bufin = new BufferedInputStream(in);
		BufferedOutputStream bufout = new BufferedOutputStream(out);
		
		try {
			DataInputStream result = new DataInputStream(bufin);
			DataOutputStream data = new DataOutputStream(bufout);
			data.writeInt(99);
			data.writeInt(9);
			int ergebnis = result.readInt();
		}
		[...]
 
B

Beni

Gast
Beim BufferedOutputStream musst du noch "flush()" aufrufen, damit du sicher sein kannst, dass auch alles im Buffer gesendet wird. Sonst wartet der Stream, ob nicht noch mehr kommt...
 

Bohne

Aktives Mitglied
Cool, funktioniert. Ich hatte das ja schon mal irgendwo gehört, allerdings hab ich's dann direkt auf bufout angewendet und es hat nicht funktioniert, sodass ich gedacht habe, ich hab mich getäuscht. Aber mit data.flush() klappt es prima, danke!
 

Bohne

Aktives Mitglied
Nachdem es mit Data-Streams funktioniert hat, habe ich es auch noch mit Object-Streams probiert, allerdings hängt das Programm wieder bei der ersten write-Funktion, obwohl ich flush() verwende. Am Code hat sich im Prinzip nichts großartig verändert:

Server:
Code:
InputStream  in  = client.getInputStream();
OutputStream out = client.getOutputStream();
  
ObjectInputStream data = new ObjectInputStream(in);
ObjectOutputStream result = new ObjectOutputStream(out);

Object o = data.readObject();

result.writeObject(o);
result.flush();


Client:
Code:
InputStream in = server.getInputStream();
OutputStream out = server.getOutputStream();
	
ObjectInputStream result = new ObjectInputStream(in);
ObjectOutputStream data = new ObjectOutputStream(out);
		
data.writeObject("test");
data.flush();

Object ret = result.readObject();
System.out.println(ret);
 

Bohne

Aktives Mitglied
Also es ist zum aus der Haut fahren :x Folgender Code funktioniert perfekt:

Server:
Code:
	public static void main(String[] args) throws IOException, ClassNotFoundException {
		ServerSocket server = new ServerSocket(3141);

		while (true) {
			Socket client = server.accept();

			ObjectInputStream in = new ObjectInputStream(client.getInputStream());
			ObjectOutputStream out = new ObjectOutputStream(client.getOutputStream());
						
			Object o = in.readObject();
			System.out.println(o.toString());
		
			out.writeObject(o);
			out.flush();
			
			out.close();
			in.close();			
			client.close();
		}
	}

Client:
Code:
	public static void main(String[] args) throws IOException, ClassNotFoundException {
		Socket server = new Socket ("localhost", 3141 );
	
		ObjectOutputStream out = new ObjectOutputStream(server.getOutputStream());
		ObjectInputStream in = new ObjectInputStream(server.getInputStream());

		out.writeObject(new Date());
		out.flush();
		Object o = in.readObject();
		
		System.out.println(o.toString());
			
		in.close();
		out.close();		
		server.close();
	}

Jetzt vertauscht aber mal die Zeilen 8/9 (Server) _oder_ 5/6 (Client), sodass das sowohl bei Server als auch Client die Input/Output-Streams in gleicher Reihenfolge angelegt werden (also erst in, dann out, oder erst out, dann in).

Was denkt ihr passiert? - Funktioniert das Programm dann noch?

Ich hab keine Ahnung, was passiert, jedenfalls hängt das Programm dann beim Anlegen des zweiten Streams (egal, ob jetzt in oder out an zweiter Stelle steht), alle Befehle danach werden nicht ausgeführt.

Mir ist dieses Verhalten äußerst schleierhaft und ich habe auch nirgends etwas dazu gefunden, aber vielleicht gibts hier ja ein paar Gurus, die mehr dazu wissen. Evtl ist es ja ein Bug in der jvm? Ich benutze 1.5.0_06 für Linux i386.
 
I

igor99

Gast
Ich kann dir nicht sicher sagen, woran es liegt. Ich habe kürzlich auch eine Socket-Applikation programmiert, wobei ich Objekte übertragen habe. Habe ähnliche Frage gestellt und den Tipp bekommen, dass

1. der Sender zuerst einen ObjectOutputStream und dann ObjectInputStream anlegen muss, wöhrend
2. der Empfänger die beiden Streams in umgekehrten Reihenfolge erzeuen muss (Input und erst dann Output).

Angeblich kann der Empfänger erst dann etwas lesen, wenn etwas geschreiben wurde. Aus diesem Grund muss man auf der Senderseite zuerst einen Output-Stream anlegen. Denn, nur so wird der Kreis (in einer Richtung) geschlossen.

Ich habe es so gemacht und es hat tatsächlich funktioniert. Zufall oder nicht, kann ich nicht sagen. Falls ich den Link zu diesem Thread finden sollte, werde ich es angeben.
 

Bohne

Aktives Mitglied
Hm, danke. Ich denk damit man die Sache checkt muss man wohl genau wissen, wie das in den jeweiligen Klassen gelöst ist. So quasi als Anwender bleibt einem davon ja (der Kapselung sei Dank!) einiges verborgen.

Das sollte man irgendwo mal festhalten, in der JavaInsel und dem Handbuch der Java-Programmierung hab ich leider den Vermerk nicht finden können.
 

Bohne

Aktives Mitglied
Ich hab mir das über Nacht nochmal durch den Kopf gehen lassen und jetzt ist es eigentlich völlig logisch:

Zu einer Verbindung gehören immer zwei - d.h. wenn der Client eine Ausgabe an den Server öffnet, muss der Server einen Kanal öffnen, in dem er die Daten einliest. Geschieht das nicht, wartet der jeweils andere Teilnehmer darauf, dass sein Anliegen akzeptiert wird, um sicherzustellen, dass die gesendeten Daten nicht einfach im Nirvana verschwinden.

Eigentlich glasklar, aber wenn man erstmal nur Code abtippt ohne sich Gedanken zu machen, dann kommt man wohl nur durch Ausprobieren drauf.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Bei FTP Übertragung wird Datei nicht komplett übertragen Netzwerkprogrammierung 2
G Echtzeit Audio Übertragung Netzwerkprogrammierung 2
M Socket Netzwerk Übertragung zwischen 4 Clients Netzwerkprogrammierung 2
A Client Client Übertragung Netzwerkprogrammierung 12
C Socket Datei Übertragung Netzwerkprogrammierung 5
J Socket UDP-Übertragung mit Flusskontrolle Netzwerkprogrammierung 8
T RMI Effizenteste Übertragung von Daten Netzwerkprogrammierung 6
B Variablen ausrichten für Übertragung Netzwerkprogrammierung 2
H Object Cast Problem nach Übertragung mit Log4j Netzwerkprogrammierung 5
C Problem mit Übertragung einer Klasse in RMI Netzwerkprogrammierung 10
J Problem bei Übertragung von Binärdateien Netzwerkprogrammierung 6
N HTML-Übertragung im lokalen Netzwerk mit Java - wie? Netzwerkprogrammierung 6
M Nur ASCII in URL, Umlautproblem bei Übertragung Netzwerkprogrammierung 10
Jannn Socket Sockets an ein anderes Gerät weiterreichen? Netzwerkprogrammierung 8
JaXnPriVate Java HTTPS Server (Secure Sockets) Netzwerkprogrammierung 15
B Socket Bilder verschicken via Sockets. Heap-Problem. Netzwerkprogrammierung 2
E Socket Parameter über Sockets übergeben und auslesen ! Netzwerkprogrammierung 5
D Socket Verwirrung bei Sockets Netzwerkprogrammierung 1
E Mehrere Sockets Netzwerkprogrammierung 2
N Fragen zu Sockets Client Netzwerkprogrammierung 3
A Sockets Serialisierung Netzwerkprogrammierung 1
K Threads closen und Sockets schliessen Netzwerkprogrammierung 5
H Sockets oder HTTP- Methoden? Netzwerkprogrammierung 3
T Socket Bidirektionale Verbindung mit Sockets Netzwerkprogrammierung 8
P Problem mit Datagram-Sockets Netzwerkprogrammierung 2
C Socket Datagram-Sockets mit integrierter Message Queue? Netzwerkprogrammierung 2
M Problem Client - Server Sockets: .ready() wird nie true! Netzwerkprogrammierung 6
F Technologiewahl: Swing/RMI/Sockets Netzwerkprogrammierung 13
B Sockets, Threads & Plugins Netzwerkprogrammierung 7
T Verbindungsversuche über TCP Sockets von mehreren Threads führt zu Serverabsturz Netzwerkprogrammierung 2
D Mehrere Clients über Java-Sockets Netzwerkprogrammierung 13
F FTP Client mit Sockets - wann sagt der Server nichts mehr? Netzwerkprogrammierung 7
U Socket Abhören eines Sockets/Ports in extra Thread Netzwerkprogrammierung 8
M Socket Sockets Grundlage Netzwerkprogrammierung 25
I Socket HTTP Nachrichten über Sockets verschicken Netzwerkprogrammierung 2
D Socket Raw Sockets mit java.net.*? Bsp ICMP Netzwerkprogrammierung 7
H Komprimierte Sockets Netzwerkprogrammierung 4
V Verbindung zweier Rechner über das Internet mit Sockets Netzwerkprogrammierung 8
L Sockets übergeben Netzwerkprogrammierung 4
G NIO Sockets Architektur Problem Netzwerkprogrammierung 2
S Problem bzgl. Sockets / Server-Client-Struktur Netzwerkprogrammierung 3
B Socket Was muss man bei Sockets beachten? Netzwerkprogrammierung 10
N Socket Sockets und Events Netzwerkprogrammierung 11
A Programm umschreiben von Pipes auf Sockets Netzwerkprogrammierung 12
B Paralleler Dateitransfer: Ein Client - Mehrere Sockets? Wie connecten? Netzwerkprogrammierung 16
D RMI oder Sockets Netzwerkprogrammierung 4
P Sockets +Port Forwarding = Chaos Netzwerkprogrammierung 4
clupus Exception beim Schließen eines Sockets Netzwerkprogrammierung 6
Q Thread und Sockets... Netzwerkprogrammierung 2
G Sockets und HTTP: Ende des Datenempfangs erkennen Netzwerkprogrammierung 3
J Array oder Object über Sockets Netzwerkprogrammierung 8
O Sockets -- Einsieg Netzwerkprogrammierung 3
S Sockets und gzip Netzwerkprogrammierung 8
B Nachricht über Sockets kommt nicht an Netzwerkprogrammierung 8
data89 Sockets: ein alter Hut - für Euch - für mich nicht! Netzwerkprogrammierung 10
S Wiedereinmal Sockets ;-) Netzwerkprogrammierung 15
J Ascii / Unicode bei Sockets? Netzwerkprogrammierung 2
G Datagram-Sockets für UDP-Kommunikation Netzwerkprogrammierung 2
K "Ende eines Sockets" Netzwerkprogrammierung 9
A Sockets Netzwerkprogrammierung 10
feuervogel Sockets - Lokalen Port aber nicht IP bestimmen Netzwerkprogrammierung 3
C Einfacher Filedownload mit Sockets geht nicht für pdffiles Netzwerkprogrammierung 16
E Sockets, readLine() Netzwerkprogrammierung 7
M Sockets und InputStream Netzwerkprogrammierung 8
G Verbindung über Sockets Netzwerkprogrammierung 2
S zip-files über sockets übertragen Netzwerkprogrammierung 11
G immer wieder gleiche Sockets Netzwerkprogrammierung 2
V Suche Alternative zu Sockets Netzwerkprogrammierung 3
E Problem bei Sockets/InputStream über externe Klasse Netzwerkprogrammierung 5
A Datenverlust (zuviele Daten!) über Sockets Netzwerkprogrammierung 4
AlClemento Sockets -> BufferedReader Problem Netzwerkprogrammierung 2
F Problem mit Threads und Sockets Netzwerkprogrammierung 3
C Dateien über Sockets versenden? Netzwerkprogrammierung 10
T Sockets Verständnisfrage: abwechelnd lesen-schreiben Netzwerkprogrammierung 4
S Habe ein Problem mit Sockets -> Client Server Netzwerkprogrammierung 2
G Strings über Sockets senden Netzwerkprogrammierung 5
P Probleme mit einem Array aus Sockets Netzwerkprogrammierung 2
Y buch: Netwerprogrammierung und Sockets Netzwerkprogrammierung 2
B Eigenes Protokoll über Sockets verschicken Netzwerkprogrammierung 4
P Welche Art von Sockets für ein Spiel? Netzwerkprogrammierung 3
C Sockets über Internet Netzwerkprogrammierung 10
K Applet - Servlet Kommunikation ohne Sockets Netzwerkprogrammierung 5
S Objekte zwischen Client und Server über Sockets senden Netzwerkprogrammierung 2
Z chat: wann http und wann sockets verwenden? Netzwerkprogrammierung 11
D Java Sockets Probs Netzwerkprogrammierung 4
N Verarbeitung nach Weiterleitung in Sockets Netzwerkprogrammierung 2
A Serialisierung über Sockets möglich? Netzwerkprogrammierung 3
M sockets (security) Netzwerkprogrammierung 2
C IRC CHAT auslesen -> Sockets/input und output Streams Netzwerkprogrammierung 9

Ähnliche Java Themen

Neue Themen


Oben