# Encodings/Decodings



## Guest (13. Mai 2007)

Hallo!

Ich habe jetzt schon 2 Tage lang nach einer Lösung für folgendes Problem gesucht:

Ich habe einen Client der sich mit einem Server verbindet. Soweit so gut.
Ich möchte nun das der Client an den Server eine Zeile mit dem String: "Encoding:"+args[1] schickt damit er server weiss welches Encoding der Client verwendet den Client rufe ich auf mit java Client localhost UTF-8.
Der erste String der den Charset übergibt soll mit ASCII codiert sein,damit  der Server das lesen kann und dann überprüft ob er das Encoding kennt und gegebenenfalls für die weiteren eingehenden Daten vom Client dieses Encoding verwendet oder die Verbindung beendet, wenn er das Encoding nicht kennt. 

Brauch man für die Lösung dieses Problems zwangsläufig Encoder und Decoder oder kann man einfach am anfang StreamWriter/Reader mit ASCII erzeugen und diese dann nach übermittlung des ersten Datenstroms in StreamReader/Writer mit dem entsprechenden Encoding umwandeln? -> habe dafür keine Funktion gefunden. 
Leider sind alle Bsp für Encoder / Decoder die ich gefunden habe für FileInput/Output Streams sollte irgendjmd. mal irgendwo ein gutes Tutorial zu Encodern/Decodern haben wäre ich sehr dankbar wenn er mir den Link schicken sollte. 
Ich habe bischer über googel kein Tutorial gefunden das für mich verständlich gewesen wäre.

Alternativ müsst ich wohl jeweils beim Client einen Encoder für ASCII und beim Server einen Decoder für ASCII schreiben und dann gegebenendalls beim Client einen Encoder mit dem zu verwendenden Encoding und beim Client dann einen Decoder mit dem zu verwenden Encoding.

Ich wäre euch dankbar wenn ihr die ihr euch damit ja schon länger beschäftigt mir evtl ein zwei Tipps dazu geben könntet.

Ich poste nochmal meinen aktuellen Client: 





```
/* EchoClient.java */

import java.net.*;
import java.io.*;

public class ClientServer
{
  public static void main(String[] args)
  {
    if (args.length != 1) {
      System.err.println("Usage: java EchoClient <host>");
      System.exit(1);
    }
    try {
      Socket sock = new Socket(args[0], 4444);
      //Erzeugt ein Socket-Verbindung mit dem host mit dem die Anwendung aufgerufen wird auf Port 4444
      InputStream in = sock.getInputStream();
      OutputStream out = sock.getOutputStream();
      //Timeout setzen
      sock.setSoTimeout(300); 
      //Ausgabethread erzeugen
      OutputThread th = new OutputThread(in);
      th.start();
      //Schleife für Benutzereingaben
      BufferedReader conin = new BufferedReader(
                             new InputStreamReader(System.in));
      String line = "";
      while (true) { 
        //Eingabezeile lesen
        line = conin.readLine();
        if (line.equalsIgnoreCase("Exit")) {
          break;
        }
        //Eingabezeile an ECHO-Server schicken
        out.write(line.getBytes());
        out.write('\r');
        out.write('\n');
        //Ausgabe abwarten
        th.yield(); 
      }
      //Programm beenden
      System.out.println("terminating output thread...");
      th.requestStop();
      th.yield();
      try {
        Thread.sleep(1000);
      } catch (InterruptedException e) {
      }
      in.close(); 
      out.close();
      sock.close();
    } catch (IOException e) {
      System.err.println(e.toString());
      System.exit(1);
    }
  }
}

class OutputThread
extends Thread
{
  InputStream in;
  boolean     stoprequested;

  public OutputThread(InputStream in)
  {
    super();
    this.in = in;
    stoprequested = false;
  }

  public synchronized void requestStop()
  {
    stoprequested = true;
  }

  public void run()
  {
    int len;
    byte[] b = new byte[100];
    try {
      while (!stoprequested) { 
        try {
          if ((len = in.read(b)) == -1) { 
            break;
          }
          System.out.write(b, 0, len);
        } catch (InterruptedIOException e) { 
          //nochmal versuchen
        }
      }
    } catch (IOException e) {
      System.err.println("OutputThread: " + e.toString());
    }
  }
}
```

und für den Server:

```
import java.net.*;
import java.io.*;
import java.io.IOException;
import java.util.zip.*;
import java.lang.String;
/**
* Ein Server der im Standardbetrieb eine Verbindung mit einer Client Software über den   * Port 4444 herstellt und die Ankommenden Datenströme als Char ausgibt und an die        * Anwendung zurückschickt. Wird der Server im -debug Modus betrieben werden die           * Datenströme in byte Form ausgegeben.
* 
* @
* @Version 1.0
*/
public class SimpleEchoServer
{
  public static void main(String[] args)
  {
/**
*Hauptprogramm.
*@param args Kommandozeilenparameter "" oder "-debug"
*@exception Exception tritt ein wenn der Input- oder Outputstream fehlerhaft ist.
*/
    try {
      String blub = "-debug";
	// ? Geht irgendwie nich -> wenn java SimpleEchoServer -debug
      if(args.length > 0 ){

	      if(blub.equals(args[0]))
		{
        	System.out.println("Warte auf Verbindung auf Port 4444...");
	        ServerSocket echo = new ServerSocket(4444);
	        // erstellt ein ServerSocket für den Port 4444
	        Socket socket = echo.accept();
                // die Methode accept() wartet auf eine Eingehende Verbindung auf dem Port von echod
                System.out.println("Verbindung hergestellt");
                
		InputStream in = socket.getInputStream();
		InputStreamReader test = new InputStreamReader(in);
		
                OutputStream out = socket.getOutputStream();
                int c;
      
	        out.write(("Verbindung zum Server hergestellt ! \n\r Alle folgenden Eingaben werden vom Server zum Client geschickt! \n\r").getBytes());
     		out.write(test.getEncoding().getBytes());
		


		while ((c = in.read()) != -1) {
			out.write((byte)c);
        		System.out.print(c);
 			     }
      System.out.println("Verbindung beenden");
      socket.close();
      echo.close();
	}
	} else {
      System.out.println("Warte auf Verbindung auf Port 4444...");
      ServerSocket echo = new ServerSocket(4444);
      // erstellt ein ServerSocket für den Port 4444
      Socket socket = echo.accept();
      // die Methode accept() wartet auf eine Eingehende Verbindung auf dem Port von echod
      System.out.println("Verbindung hergestellt");
      InputStream in = socket.getInputStream();
      OutputStream out = socket.getOutputStream();
      int c;
      
	out.write(("Verbindung zum Server hergestellt ! \n\r Alle folgenden Eingaben werden vom Server zum Client geschickt! \n\r").getBytes());
      while ((c = in.read()) != -1) {
        out.write((char)c);
        System.out.print((char)c);
      }
      System.out.println("Verbindung beenden");
      socket.close();
      echo.close();
	}
    }
      catch (IOException e) {
      System.err.println(e.toString());
      System.exit(1);
    } 
  }
}
```


----------



## guradon (13. Mai 2007)

oh hätte nicht gedacht das ich als Gast posten kann tut mir leid für die Formatierung ;/ -> dachte wäre eingeloggt

Habs hier nochmal formatiert:
Hallo!

Ich habe jetzt schon 2 Tage lang nach einer Lösung für folgendes Problem gesucht:

Ich habe einen Client der sich mit einem Server verbindet. Soweit so gut.
Ich möchte nun das der Client an den Server eine Zeile mit dem
 String: "Encoding:"+args[1] schickt damit er server weiss, 
welches Encoding der Client verwendet den Client rufe ich auf mit java Client localhost UTF-8(beliebiges Encoding einsetzbar).
Der erste String, der den Charset übergibt, soll mit ASCII codiert sein,damit der Server das lesen kann und dann überprüft, 
ob er das Encoding kennt und gegebenenfalls für die weiteren eingehenden Daten vom Client dieses Encoding verwendet 
oder die Verbindung beendet, wenn er das Encoding nicht kennt.

Brauch man für die Lösung dieses Problems zwangsläufig Encoder und Decoder 
oder kann man einfach am anfang StreamWriter/Reader mit ASCII erzeugen 
und diese dann nach übermittlung des ersten Datenstroms in StreamReader/Writer mit dem entsprechenden Encoding umwandeln?
 -> habe dafür keine Funktion gefunden.
Leider sind alle Bsp für Encoder / Decoder die ich gefunden habe für FileInput/Output Streams. 
Sollte irgendjmd. mal irgendwo ein gutes Tutorial zu Encodern/Decodern haben,
 wäre ich sehr dankbar wenn er mir den Link schicken sollte.
Ich habe bischer über googel kein Tutorial gefunden das für mich verständlich gewesen wäre.

Alternativ müsst ich wohl jeweils beim Client einen Encoder für ASCII 
und beim Server einen Decoder für ASCII schreiben und dann gegebenendalls
 beim Client einen Encoder mit dem zu verwendenden Encoding und
 beim Client dann einen Decoder mit dem zu verwenden Encoding.

Ich wäre euch dankbar wenn ihr die ihr euch damit ja schon länger beschäftigt mir evtl ein zwei Tipps dazu geben könntet.


Kann das ganze leider nich editieren, also vielen Dank erstmal das ihr euch mein Zeug durchgelesen habt!


----------



## kleiner_held (13. Mai 2007)

Man kann das Encoding eines InputStreamReader's nicht ändern. Ich würde es einfach so machen:
1. InputStream vom Socket nehmen
2. InputStream byteweise einlesen und die bytes als chars einem StringBuffer hinzufuegen. Stoppen wenn man ein \n bekommt.
3. Aus dem StringBuffer das Encoding extrahieren und jetzt erst den InputStreamReader mit dem entsprechenden Encoding aufbauen.


----------

