Socket OutputStream

bizkit

Mitglied
Hallo,
ich habe folgendes Problem:
Der Client verbindet sich mit dem Server
und sendet den String “uebermittleKilometerstand”. Daraufhin antwortet der Server mit dem
Kilometerstand, dass er sich aus der Klasse (Bordelektronik) holt.

Ich kriege den Server, den Outputstream nicht hin, kann mir jemand paar Tipps geben?


hier ist mein Quellcode von dem Server und der Klasse Bordeelektronik
SERVER:
Java:
public class Server {
	
	  public static void main(String args[]) 
	  {
	    
	    try {
	    	
	      System.out.println("Warte auf Verbindung auf Port 7013..2."); 

	      ServerSocket echod = new ServerSocket(7013);
	      System.out.println("Vor accept()");
	      Socket socket = echod.accept();
	     
	      System.out.println("Verbindung hergestellt");
	      InputStream in = socket.getInputStream();
	
	    
	     ObjectOutputStream  output = new ObjectOutputStream ();
	     output = Bordelektronik.getKilometerstand();
	      echod.close(); 
	    
	    } catch (IOException e) {
	      System.err.println(e.toString());
	      System.exit(1);
	    }
	  }
	}

Bordelektronik:

Java:
public class Bordelektronik {
private static int kilometerstand = (int) (Math.random() * (20000 - 10000) + 10000);
/**
* Liefert einen zufälligen Kilometerstand.
* Example:
* <code>
* int k = Bordelektronik.getKilometerstand();
* </code>
*/
public static int getKilometerstand() {
int zuwachs = (int) (Math.random() * (1000 - 20) + 20);
kilometerstand += zuwachs;
return kilometerstand;
}

}
 
N

nillehammer

Gast
Java:
         ObjectOutputStream  output = new ObjectOutputStream ();
         output = Bordelektronik.getKilometerstand();
Diese Zeilen machen keinen Sinn. In der ersten initialisierst Du irgend einen Stream ohne Bezug zu dem Socket. Die zweite dürfte nicht kompilieren, hier versuchst Du einer Variablen vom Typ ObjectOutputStream einen int zuzuweisen.

Richtig ist vielmehr, in den OutputStream des Sockets zu schreiben. Das geht ungefähr so:
Java:
// OutputStream des sockets holen
final OutputStream sockOut = socket.getOutputStream();
// Wir packen den in einen DataOutputStream, weil der ein paar komfortablere write-Methoden hat
final DataOutputStream dataOut = new DataOutputStream(sockOut);
// und hier geht der Kilometerstand auf die Reise
dataOut.writeInt(Bordelektronik.getKilometerstand());
// Schreiben evtl. gepufferter Daten erzwingen
dataOut.flush();
// dataOut weiterverwenden oder closen (macht aber auch das Socket zu).
 
Zuletzt bearbeitet von einem Moderator:

bizkit

Mitglied
danke dir, es funktioniert.

Nun muss der Server das Ergebnis (Kilometer) als String Objekt an den Client senden.
Was genau muss ich an meinem Quellcode verändern

SERVER:
Java:
import java.net.*;
import java.io.*;
import java.util.*;

public class Server {
	
	  public static void main(String args[]) 
	  {
	    int zaehler = 0;
	    try {  	
	    	System.out.println("Warte auf Verbindung auf Port 7013..2."); 

	    	ServerSocket echod = new ServerSocket(7013);
	    	System.out.println("Vor accept()");
	    	while (true)
	    	{
	    	  Socket socket = echod.accept();
	    	  (new ClientThread(++zaehler, socket)).start();
	      
	    	  System.out.println("Verbindung hergestellt");
	    	  OutputStream sockOut = socket.getOutputStream();
	    	  DataOutputStream dataOut = new DataOutputStream(sockOut);
	    	  int k = Bordelektronik.getKilometerstand();
	  
	    	  dataOut.writeInt(k);
	    	  System.out.println(k);
	    	  dataOut.flush();      
	    	}
	    	} catch (IOException e) {
	    		System.err.println(e.toString());
	    		System.exit(1);
	    	}
	  }
}
//___________________________________________________________   
class ClientThread extends Thread
{
  private int    nummer;
  private Socket socket;
 
  public ClientThread(int nummer, Socket socket)
  {
    this.nummer   = nummer;
    this.socket = socket;
  }
  
  public void run()
  {
	  String msg = "Serververbindung: "+nummer;
	  System.out.println(msg + " hergestellt");
	  
	  try
	  {
		OutputStream sockOut = socket.getOutputStream();
	    DataOutputStream dataOut = new DataOutputStream(sockOut);
	    int k = Bordelektronik.getKilometerstand();
	 
	    dataOut.writeInt(k);
	    System.out.println(k);
	    dataOut.flush();      
	  }
	  catch (IOException e) {
	      System.err.println(e.toString());
	      System.exit(1);
	  }
	  }
	  
  }

CLIENT:
Java:
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.*;
import java.util.*;
import java.io.*;
 
public class Client
{
  public static void main(String args[])
  {
  System.out.println("HALLO");
   if (args.length != 1) {
   System.err.println("Usage: java Listing 7013 <host>");
   System.exit(1);
   }
    try 
    {
      Socket sock = new Socket(args[0], 7013); 
      InputStream in = sock.getInputStream();
      DataInputStream dis = new DataInputStream(in);
      
      int km = dis.readInt();
      System.out.println(km);
      
      in.close();
      sock.close();
    } catch (IOException e) {
      System.err.println(e.toString());
      System.exit(1);
    }
  }
}
 
S

SlaterB

Gast
du läßt den Server doch schon einen int senden, gar zweimal, was natürlich schlecht ist,
lasse nur ClientThread arbeiten, Zeile 20-27 im Server sind fragwürdig,

wenn jedenfalls schon int gesendet wird, was spricht gegen String oder anderes?
 
N

nillehammer

Gast
Nun muss der Server das Ergebnis (Kilometer) als String Objekt an den Client senden.
Was genau muss ich an meinem Quellcode verändern
Der DataOutputStream hat noch weitere writeXXX-Methoden. Auch für chars und für String. Schau Dir am besten mal die API-Doku an: DataOutputStream (Java Platform SE 7 )
Klicke Dich auch mal zum OutputStream und von dort in die Subklassen. Das verschafft Dir eine Übersicht, was für Streams es so gibt, wie man sie initialisiert und was die so können.
 
S

SlaterB

Gast
'Integer in den String Object umwandeln' kann man fast 1:1 in Suchmaschinen eintippen, um soetwas zu erfahren
(falls im Lehrbuch beim ersten notwendigen Lesen übersehen/ vergessen und auch jetzt nicht wiederzufinden)

falls der Server aber schon einen String zum Sende hat, kann, wie nillehammer bekräftigt und ich es gemeint hatte,
auch direkt ein String übertragen werden, schaue dir alle verfügbaren Methoden von DataOutputStream an
 

bizkit

Mitglied
Ich habe jetzt Integer in String-Objekt umgewandelt.
Aber jetzt funktioniert die write-Methode nicht. Ich kann nur zwischen wirteByte,writeChar... etc wählen, aber kein String.
Gibt es noch irgendwelche Möglichkeiten einen String zu "schreiben" ?


Java:
 OutputStream sockOut = socket.getOutputStream();
              DataOutputStream dataOut = new DataOutputStream(sockOut);
              int kmInt = Bordelektronik.getKilometerstand();
           
             // String kmString = String.valueOf(kmInt);
              String kmString = Integer.toString(kmInt);
              dataOut.write(kmString);
              // dataOut.write(k);
              System.out.println(kmString);
              dataOut.flush();
 
N

nillehammer

Gast
Um die Suche etwas zu vereinfachen, im
Code:
DataOutputStream
gibt es drei writeXXX-Methoden, die einen String als Parameter erwarten. Lies Dir die Beschreibung dieser Methoden durch und such Dir die aus, die am besten für Deinen Anwendungsfall passt.
 

bizkit

Mitglied
Ich habe die Methode .writeBytes() ausgewählt, es funktioniert soweit alles.
Nun habe ich das nächste Problem,

Der Client sollte es z.B. mit System.out.println("Das Auto ist "+x+" Kilometer gefahren") augeben,
aber ich kann nur mit : System.out.write(b, 0, x); ausgeben.

Kann ich einer Variablen den eingelesene Wert übergeben und dann als System.out.println... ausgeben?
Hat jemand eine Lösung, wie ich das Problem beheben kann?

CLIENT:
Java:
try {
      Socket sock = new Socket(args[0], 7013); 
      InputStream in = sock.getInputStream();
     // DataInputStream dis = new DataInputStream(in);
      
      int x;
      byte b [] = new byte[100];
      while((x=in.read(b)) !=-1)
      {
    	  System.out.write(b, 0, x);
      }      
      in.close();
      sock.close();
    } catch (IOException e) {
      System.err.println(e.toString());
      System.exit(1);


SERVER:
Java:
 try
	  {
	   OutputStream sockOut = socket.getOutputStream();
	   DataOutputStream dataOut = new DataOutputStream(sockOut);
	    int kmInt = Bordelektronik.getKilometerstand();
	 
	    String kmString = Integer.toString(kmInt);
	 
	   dataOut.writeBytes(kmString);
	   System.out.println(kmString);
	   dataOut.flush();      
	  }
	  catch (IOException e) {
	      System.err.println(e.toString());
	      System.exit(1);
 
Zuletzt bearbeitet:
S

SlaterB

Gast
> Ich habe die Methode .writeBytes() ausgewählt, es funktioniert soweit alles.
[..]
> Hat jemand eine Lösung, wie ich das Problem beheben kann?

na weit bist du damit ja nicht gekommen, verwende eine der anderen beiden,
und auf Client-Seite wiederum DataInputStream, wie schon auskommentiert dasteht,
und die symmetrisch passende Methode zum write,

dann hast du einen String fertig übertragen, wieder als String vorliegen, z.B. für dein println
 

bizkit

Mitglied
Ich habe bei Sever: writeUTF(x)
und bie dem Client: x.readUTF() ausgewählt

wie es aussieht, ist es am funktionieren.
War es "richtig" von mir, oder gibt es da noch bessere Methoden (Es gibt nur noch Char..) ?
 
S

SlaterB

Gast
meine Wahl wäre auf writeChars() gefallen, writeUTF() sieht mir bisschen suspekt aus, mag vielleicht für irgendwas gut sein,
aber wenn ich nicht genau weiß wofür, einen Fehlerfall vorher produzieren und dann vermeiden kann, dann verzichte ich lieber auf solche Sonderlocken

mehr oder weniger ist das aus der API ersichtlich und du hast deine Wahl eben so getroffen,
ob es besser oder schlechter ist, kann ich gar nicht sagen,
hilft diese zusätzliche Meinung?
 
N

nillehammer

Gast
Da Du in diesem Fall die String-Repräsentation eines Integers übertragen hast (keine Sonderzeichen), ist UTF nicht unbedingt nötig, einfache chars hätten's auch getan. Aber schaden tut es jedenfalls nicht.
 

bizkit

Mitglied
Ich wollte erst WriteChars() wählen, aber ich weiss nicht wie ich mit dem Client einlesen soll.
Da es die methode readChars() nicht gibt, nur die readChar().

Ich habe versucht die Char`s jeweils einzeln einzulesen, jedoch weiss ich wieder nicht, wie ich einen String "gefahrene Km" dranhängen kann.
Und wenn ich die Char`s augelesen habe, wird immer eine Leerzeichen zwischen den Char`s gemacht.

Wenn du mir sagen kannst, wie ich das Problem beheben kann ,wäre ich dir sehr dankbar (was ich jetzt schon bin)

Java:
    int x = dis.read();
    while ( x != -1)
      {  char c = (char) x;
         System.out.print(c);
         x = dis.read();
    }
 
S

SlaterB

Gast
um ein Zeichen zu lesen, nimm readChar(), sammle diese in einen String/ StringBuilder,
von da an dann wieder volle Kontrolle,

das mit fehlenden readChars() ist natürlich ein gewisser Hammer,
der Vorschlag in der API, auf BufferedReader zu wechseln ist auch nicht schön, wenn man DataInputStream für anderes nutzen will,
dann lieber die UTF-Variante


freilich ist für mich DataStream insgesamt wieder zweite Wahl,
BufferedReader/ BufferedWriter nur für Strings sind mir die gebräuchlichere Variante, dazu findest du auch viele Beispiele,
wenn du nur String übertragen willst kannst du dahin wechseln, da gibts auch nicht mehr so viele Methoden zur Auswahl ;)

wichtig ist dass der dann zeilen-dominiert ist, nicht die Zeilenumbrüche vergessen
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Input/Output Socket I/O - outputStream.write(-1) Java Basics - Anfänger-Themen 2
izoards Socket Kommunikation Java Basics - Anfänger-Themen 16
Nina Pohl Ein Vorgang bezog sich auf ein Objekt, das kein Socket ist Java Basics - Anfänger-Themen 6
G Socket Verbindung aufbauen Java Basics - Anfänger-Themen 11
S Bilder über Socket Senden Java Basics - Anfänger-Themen 1
S Asynchrone Socket-Abfragen Java Basics - Anfänger-Themen 5
Meeresgott OOP Socket Verbindung richtig Kapseln Java Basics - Anfänger-Themen 0
O Socket by reference übergeben Java Basics - Anfänger-Themen 0
J Socket schließen - Ist eine SocketException unumgänglich? Java Basics - Anfänger-Themen 4
D Socket ---> Server Socket worauf muss ich achten? Java Basics - Anfänger-Themen 2
N Socket-Programmierung Java Basics - Anfänger-Themen 4
M wait/notify bei Socket Java Basics - Anfänger-Themen 4
B Socket Kommunikation in beide Richtungen Java Basics - Anfänger-Themen 12
B Socket, args Java Basics - Anfänger-Themen 22
L Socket in JTextArea Java Basics - Anfänger-Themen 9
T Input/Output Zwei InputStreams von einem Socket Java Basics - Anfänger-Themen 2
B Socket Problem Java Basics - Anfänger-Themen 3
T socket.close aber verbindung besteht noch Java Basics - Anfänger-Themen 4
F Buffered Image über Socket versenden Java Basics - Anfänger-Themen 6
E Socket InputStream "terminiert" nicht Java Basics - Anfänger-Themen 4
B Threads Interrupt während Socket.read()? Java Basics - Anfänger-Themen 3
M Versand von Nachrichten via Socket (Delay) Java Basics - Anfänger-Themen 21
F socket-problem Java Basics - Anfänger-Themen 6
E Input/Output Socket bekommt keine Verbindung bei funktionierendem Fremdziel Java Basics - Anfänger-Themen 2
E Socket (Client) dauerhaft aktiv? Java Basics - Anfänger-Themen 9
D Java - Socket - Datenübertragung Java Basics - Anfänger-Themen 18
E Input/Output einfachen Socket für XML-Anfragen bauen Java Basics - Anfänger-Themen 13
R Cannot find a free socket for the debugger Java Basics - Anfänger-Themen 6
F Socket Kommunikation Java Basics - Anfänger-Themen 4
M "Connection reset" gbxRemote Socket Java Basics - Anfänger-Themen 9
N Files mit Byte an Socket versenden Java Basics - Anfänger-Themen 2
L FTP per Socket Java Basics - Anfänger-Themen 2
M Audio Stream läuft auf :connection abort: socket write error Java Basics - Anfänger-Themen 2
J Socket - BufferedReader lese Problem Java Basics - Anfänger-Themen 2
M Socket Server Java Basics - Anfänger-Themen 9
N Socket Problem? Java Basics - Anfänger-Themen 9
G Socket erstellen dauert sehr lange. Java Basics - Anfänger-Themen 4
H Java Socket Java Basics - Anfänger-Themen 14
A XML Daten über Socket Java Basics - Anfänger-Themen 3
I Allgemeine fragen zu Socket server Java Basics - Anfänger-Themen 6
C Socket Programmierung Java Java Basics - Anfänger-Themen 4
F Socket Instanz auf Klasse welche von Socket erbt zuweisen Java Basics - Anfänger-Themen 3
ven000m Wieso antwortet mein Server nicht mehr (Socket Anwendung) Java Basics - Anfänger-Themen 2
J Daten von einem (char*)Socket einlesen. Java Basics - Anfänger-Themen 3
S Java Socket Java Basics - Anfänger-Themen 3
K Frage zu SdtOut streams bzw. Socket Programmierung Java Basics - Anfänger-Themen 3
M HTTP-Anfragen und Socket Java Basics - Anfänger-Themen 2
A von Socket-Stream lesen Java Basics - Anfänger-Themen 4
M Ändern einer Socket-Eigenscheft aus einem modalen Dialog? Java Basics - Anfänger-Themen 6
K Warum wird hier nur etwas in eine txt Datei geschrieben und nicht in alle drei (InputStream/OutputStream/Reader/Writer) Java Basics - Anfänger-Themen 1
berserkerdq2 Wo ist der SInn, dass man den Stream, den ich zum Schreiben nutze, outputstream nenne? Java Basics - Anfänger-Themen 5
berserkerdq2 inputstream und bufferedwirter /outputstream und bufferedwriter Java Basics - Anfänger-Themen 9
J Nachricht an OutputStream Java Basics - Anfänger-Themen 2
I Probleme mit OutputStream - Datei lässt sich nicht öffnen Java Basics - Anfänger-Themen 4
B InputStream / OutputStream / PipedOutputStream und managedExecutorService Java Basics - Anfänger-Themen 3
B java.io.OutputStream zu java.io.InputStream konvertieren Java Basics - Anfänger-Themen 18
B Input/Output OutputStream im Paramaeter Java Basics - Anfänger-Themen 2
B OutputStream in FileInputStream? Java Basics - Anfänger-Themen 9
T ObjectInput/OutputStream Fragen zur Funktionsweise Java Basics - Anfänger-Themen 3
B Konvertieren: Outputstream zu Inputstream Java Basics - Anfänger-Themen 13
M ArrayList durch OutputStream in Datei Java Basics - Anfänger-Themen 9
S Objekte mit Outputstream in Safefile Java Basics - Anfänger-Themen 4
B Input/Output InputStream (JSch) in OutputStream (Blob) überführen Java Basics - Anfänger-Themen 8
B [Erledigt] Fehlverhalten mit File, FileInput/OutputStream und FileChannel Java Basics - Anfänger-Themen 4
Forlan OutputStream Initialisieren Java Basics - Anfänger-Themen 4
F DataIn/Outputstream Java Basics - Anfänger-Themen 4
lars-sh HttpURLConnection und OutputStream Java Basics - Anfänger-Themen 4
A String in OutputStream schreiben Java Basics - Anfänger-Themen 5
D An Datei "anhängen" mit OutputStream Java Basics - Anfänger-Themen 9
S Outputstream & String? Java Basics - Anfänger-Themen 4
reibi OutputStream nach ByteOutputStream konvertieren Java Basics - Anfänger-Themen 21
P OutputStream Java Basics - Anfänger-Themen 7
H OutputStream Java Basics - Anfänger-Themen 8
M ProcessBuilder und OutputStream Java Basics - Anfänger-Themen 2
M OutputStream funktioniert nur in Endlosschleife ? Java Basics - Anfänger-Themen 4
R OutputStream direkt in StringBuffer schreiben lassen Java Basics - Anfänger-Themen 2
G ClassLoader und OutPutStream Java Basics - Anfänger-Themen 3
G Standard OutputStream out wiederherstellen Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben