G
Guest
Gast
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:
und für den Server:
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:
Code:
/* 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:
Code:
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);
}
}
}