# Buchstaben übergeben



## Paddel (30. Sep 2008)

```
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;


public class Client {
	public static void main(String[] args) {
		Socket server = null;
		try {
			server = new Socket("*******",1234);
			InputStream in = server.getInputStream();
			OutputStream out = server.getOutputStream();
			
			out.write(5);
			out.write(5);
			System.out.println(in.read());
		} catch (Exception e) {
			// TODO: handle exception
		}finally{
		      if ( server != null ) 
		    	  
		    	  
		          try { server.close(); } catch ( IOException e ) { } 
		}
		
	}
		
}
```
würd ma gerne wissen wie ich über die Streams auch Strings oder zumindest chars verschicken kann. Gruss


----------



## Murray (30. Sep 2008)

```
out.write( meinString.getBytes());
```
Oder besser, weil man die Kontrolle über die umsetzung von Unicode nach ASCII behält:

```
out.write( meinString.getBytes( "UTF-8"));
```


----------



## tuxedo (30. Sep 2008)

Das Stichwort heisst "DataOutputStream". Damit kannst du nahezu alles durch einen Stream schicken: primitive Datentypen, Strings und Objekte.

Alternativ steht es dir natürlich frei die Strings in bytes (gleiches gilt für alles andere) zu zerlegen und diese zu schicken.

- Alex


----------



## Paddel (30. Sep 2008)

danke =)


----------



## Paddel (30. Sep 2008)

irgendwie geht e simmer noch nicht. Der Sendende:

```
BufferedWriter out = new BufferedWriter( new OutputStreamWriter(client.getOutputStream()));
			out.write("lala");
```

Empfänger:

```
server = new Socket("********",1237);
			BufferedReader in = new BufferedReader( new InputStreamReader(server.getInputStream()) );
```

Connection funktioniert aber die Buchstaben auszugeben klappt ein..Meldung:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at Client$1.actionPerformed(Client.java:54)


----------



## Paddel (30. Sep 2008)

irgendwie geht e simmer noch nicht. Der Sendende:

```
BufferedWriter out = new BufferedWriter( new OutputStreamWriter(client.getOutputStream()));
			out.write("lala");
```

Empfänger:

```
server = new Socket("********",1237);
			BufferedReader in = new BufferedReader( new InputStreamReader(server.getInputStream()) );
```

Connection funktioniert aber die Buchstaben auszugeben klappt ein..Meldung:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at Client$1.actionPerformed(Client.java:54)


----------



## SlaterB (30. Sep 2008)

eine NullPointerException hat meist Hand und Fuss, ist keine Magie im Hintergrund,

finde heraus, was Zeile 54 in Client.java ist, und auf welches null-Objekt dort zugegriffen wird,

falls es so eine verschachtelte Zeile wie 
> BufferedReader in = new BufferedReader( new InputStreamReader(server.getInputStream()) );
ist, dann splitte die entweder in mehrere Zeilen, oder prüfe mit if,

z.B.

if (server == null) {
System.out.println("daher kommt also gleich die Exception, server ist null");
}

falls server oder server.getInputStream() null sein sollte,
habe ich zumindest allerdings keine Erklärung


----------



## Paddel (30. Sep 2008)

hab schon alles probiert. Die Zeile 54 is die Zeile mit in.readLine() wo er versucht die Zeile zu lesen. Kennst du nicht evtl ein Beipsiel wo das richtig gemacht ist. Ich sitz hier jetzt seit Stunden dran und hab echt kA wieso mir das einfach nicht gelingt bzw. was daran falsch ist. Mit einem Buffered Reader kann ich doch Strings versenden. Es klappt aber immer nur mit Zahlen.


```
DataOutputStream	out = new DataOutputStream(server.getOutputStream());
      String str = "LALALA";
      out.writeUTF(str);
```

	  DataInputStream in = new DataInputStream(client.getInputStream()) ;



```
System.out.println("Jetzt solte es kommen");
    	String to = in.readUTF();
```

So hab nochmal alles neu geschrieben... oben die wichtigsten Zeilen. Er bleibt bei "Jetzt solte es kommen" hängen. Vorher übergebe ich eine int und das geht. DAs komplette Prog nocheinmal hier:


```
import java.io.*; 
import java.net.*; 
 
public class Server 
{ 
  private static void handleConnection( Socket client ) throws IOException 
  { 
	  DataInputStream in = new DataInputStream(client.getInputStream()) ;
    OutputStream out = client.getOutputStream(); 
 
    int factor1 = in.read(); 
    System.out.println("Factor 1:" + factor1);

    System.out.println("Jetzt solte es kommen");
    	String to = in.readUTF();
    	System.out.println("vorbei");
    	System.out.println(to);
    out.write( 5 * 6 ); 
  } 
 
  public static void main( String[] args ) throws IOException 
  { 
    ServerSocket server = new ServerSocket( 3141 ); 
 
    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 ) { } 
      } 
    } 
  } 
}
```


```
import java.net.*; 
import java.io.*; 
 
class Client 
{ 
  public static void main( String[] args ) 
  { 
    Socket server = null; 
 
    try 
    { 
      server = new Socket( "localhost", 3141 ); 
      InputStream  in  = server.getInputStream(); 
      DataOutputStream	out = new DataOutputStream(server.getOutputStream());
      String str = "LALALA";
      out.writeUTF(str);
//      out.write( la ); 
      int result = in.read(); 
      System.out.println( result ); 
    } 
    catch ( UnknownHostException e ) { 
      e.printStackTrace(); 
    } 
    catch ( IOException e ) { 
      e.printStackTrace(); 
    } 
    finally 
    { 
      if ( server != null ) 
 
 
        try { server.close(); } catch ( IOException e ) { } 
    } 
  } 
}
```


----------



## SlaterB (1. Okt 2008)

in diesem Programm hier ist doch keine NullPointerException,
also ist das schon geklärt?

was writeUTF und readUTF so genau machen weiß ich nicht, habe ich noch nie irgendwo gesehen, ist das wirklich als Anfänger nötig?
dass dein Programm hängen bleibt liegt aber anscheinend daran, dass du in Zeile 13
> int factor1 = in.read(); 
das erste Byte von dem UTF-String wegliest, danach ist wohl alles irgendwie kaputt,

wenn du den Aufruf weglässt, funktioniert
>  String to = in.readUTF(); 
wieder

--------

mit
in.read();

liest du übrigens immer nur ein byte, einen Wert bis maximal 128,
wenn du einen Java-int lesen willst (4 Bytes), dann brauchst du einen DateInputStream (readInt()),

vielleicht muss man auch writeInt() statt write() verwenden

ein Lehrbuch kann ich gerade nicht nennen, in
http://www.galileocomputing.de/openbook/javainsel7/
habe ich im Dateikapitel auf die Schnelle wenig zu DateInputStream gesehen, trotzdem natürlich nicht schlecht zu lesen,
sonst vielleicht auch bei google nach socket + DateInputStream suchen


----------



## Murray (1. Okt 2008)

1. Wenn Du Data*putStreams verwendest, solltest Du nicht die "low-level-Methoden" read und write verwenden; besser auch ints mit den dafür vorgesehenen Methoden readInt / writeInt behandeln.
2. Wenn das Programm davon ausgeht, dass das, was auf einen Stream geschrieben wird, sofort auf der anderen Seite ankommt, dann solltest Du nach dem Schreiben flush() aufrufen; ansonsten kann (und wird) es passieren, dass das System darauf wartet, dass noch mehr Daten kommen , weil es sich ja noch nicht lohnt, wegen der paar Bytes bereits ein ganzes Paket auf die Reise zu schicken
3. Die empfangende Seite muss genau das lesen, was der Sender schreibt - und natürlich in der gleichen Reihenfolge. Bei Dir liest der Server einen int, dann einen String, und dann schreibt er einen int. Der Client schreibt einen String und liest dann einen int. Das passt nicht zusammen.


----------



## Paddel (1. Okt 2008)

besten dank für die Ratschläge... vorallem das mit dem flush war mit neu. Zumindest geht es  jetzt damit =) Für alle die das selbe Problem haben sollten empfehle ich http://www.lukas.dierks.greselius.net/tutorials/chat/chat230406.pdf .


----------



## Gast (11. Jan 2009)

hi
ich bekomme die server und client klassen von da oben nicht ans laufen, muss ich eine dritte klasse erstellen, die erst den server erstellt (vielleicht als thread) und dann den client?

ich weiss nicht wie ich server und client "verbinde".


----------



## Gast (11. Jan 2009)

hat sich erledigt!


----------

