Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Wie kann ein Client in java.io.* aussehen, der Daten von einem java.nio.* empfängt?
Ich habe momentan große Probleme das java.nio.* Konzept von
'Fülle einen 2 Byte großen ByteBuffer'
'Lese daraus die Länge der Daten'
'Lese den Rest (Fülle einen entsprechend großen ByteBuffer)'
Übertragen werden doch eh immer rohe Bytes. Müsste doch also möglich sein das gleiche in IO zu machen? Nur arbeitest du da eben mit einfach Input- und OutputStreams.
Versteh dein Problem also nicht so ganz. Vielleicht kannst du etwas ins Detail gehen und ein exaktes Problem schildern.?
public class Connection extends Thread {
public Socket socket; // @jve:decl-index=0:
public DataInputStream in;
public PrintStream out; // @jve:decl-index=0
public boolean doRun = true;
byte[] input = new byte[2];
ByteBuffer bInput = ByteBuffer.allocate(2);
ByteBuffer[] bbOutput = new ByteBuffer[] { ByteBuffer.allocate(2),ByteBuffer.allocate(1),ByteBuffer.allocate(400)};
ByteBuffer bbLength = ByteBuffer.allocate(1);
public Connection(int port, String hostname) throws IOException
{
// Erzeuge einen Socket und baue eine Verbindung
// zum angegebenen Host und der angegebenen Portnummer auf.
try
{
this.socket = new Socket(hostname, port);
in = new DataInputStream(socket.getInputStream());
out = new PrintStream(socket.getOutputStream());
} catch (IOException e)
{
System.err.println("Verbindung nicht möglich");
}
}
public void run()
{
while(doRun)
{
try
{
while (in.read (input)>0)
{
bInput.put(input);
bInput.flip();
short zeichen = 0;
try
{
zeichen = bInput.getShort();
}
catch(java.nio.BufferUnderflowException e) // Zeichen < 127
{
try
{
zeichen = (short)bInput.get();
}
catch(Exception ee) // Keine Zahl?!
{
zeichen = 0;
}
}
if(zeichen!=0)
{
try
{
byte[] flag = new byte[1];
byte[] content = new byte[zeichen-1];
ByteBuffer[] dataBufs = {ByteBuffer.allocate(1), ByteBuffer.allocate(zeichen-1)};
while(in.read (flag)>0)
{
}
while(in.read(content)>0)
{
}
dataBufs[0].put(flag);
dataBufs[0].flip();
//TODO Was mit machen
byte bBefehl = dataBufs[0].get();
String sParameter = EncodeDecode.Byte2ASCII(dataBufs[1]);
if(zeichen==-1 || zeichen == 0)
break;
}
catch(IllegalArgumentException e)
{
System.err.println(e.toString());
}
}
}
}
catch(IOException e)
{}
}
}
Wir haben ein Datenpäckchen vom Server mit
[LÄNGE][FLAG][CONTENT]
mit der Größe von jeweils 2 Byte - 1 Byte - Länge-1 Byte
Java.nio:
ByteBuffer mit der Größe 2 initialisieren, den befüllen, Länge 'errechnen', dann jeweils ByteBuffer bereitstellen, rest lesen.
Java.io:
Byte[2] befüllen, Short Content auslesen, restliche Byte-Arrays befüllen, in einen ByteBuffer stecken.
Aber:
Der Client liest so nichts, zumindest nicht das, was ich will. Die umwandlung von ByteBuffer später in ASCII schlägt fehl und eigentlich weiß ich auch nicht so ganz, ob das mit dem bytearray einlesen so überhaupt geht. Der .nio Server zeigt mir auch nicht an, dass ein Client angemeldet ist bzw. nur selten, warum auch immer.