# Java.nio Server, Java.io Client



## HawkofHell (11. Dez 2007)

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)'

in ein .io Programm umzuschreiben, Ideen? Oo


----------



## tuxedo (12. Dez 2007)

Ü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.?

- Alex


----------



## HawkofHell (20. Dez 2007)

Also...


```
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.


----------



## anfänger15 (30. Dez 2007)

Ich würde dafür einen InputStream nehmen und dort mit read(byte[] b) die bytes lesen. ByteBuffer ist ja sowiso wieder java.nio


----------

