# Java, c-Structs über Tcp



## focus (9. Jan 2006)

Hi,
erstmal um Luft zu machen: 
Ich komme aus der c/c++ Welt und ich glaube ich habe noch nie etwas umständlicheres gesehen als JAVA ....(AARRRGGG!)

So ;-) 
Leider muss ich ein Applet schreiben, das mit einem embedded Server kommuniziert. Das Ganze natürlich mit einem eigenen Protokoll.

Mein erstes Problem war/ist dass es keine Strukturen gibt, sondern man sich jedesmal eine Klasse dazu basteln muss.

```
struct TProtokoll{
    int a;
    int b;
};
```

Wenn ich das richtig verstanden habe, muss ich in Java eine Klasse aussen rum schreiben, also so:

```
class TProtokoll{
    public int a;
    public int b;
    
    public byte[] getBytes(){
        byte res[];
        byte ba[];
        byte bb[];
        
        //Hier verändert sich meines Erachtens die Größe!
        ba = Integer.toString(a).getBytes();
        bb = Integer.toString(b).getBytes();
        
        //nur in etwa!!! 
        res = ba + bb;

        retur(res);        
    }
}
```

Das Ganze soll dann später über TCP gesendet werden, es ist also nicht egal, wie lang der Block ist, den ich Sende, da er ja auf der anderen Seite wieder interpretiert werden soll (Typecast mit einer c-Struktur).

Meine Fragen:
-Wie realisiert man soetwas am einfachsten, so dass die ursprünglichen Grössen, der Strukturvariablen erhalten bleiben?
-Wie bekomme ich am elegantesten die Daten aus der dem Objekt der Klasse TProtokoll wieder raus?
-Wie erstellt man einen TCP Socket (UDP ist kein Problem!)?

Freundlichen Gruss
Euer frustrierter c-Programmierer
Michael


----------



## Bleiglanz (9. Jan 2006)

bb = Integer.toString(b).getBytes(); 

macht aus der zahl b=42

zuerst den String "42"

und liefert dann den (ISO-8851-1, plattformabhängigen) ASCII Code dieses Strings als byte-Array

wenn du das nicht willst, warum schreibst du es dann hin?

zu deinem Problem: schreib halt einfach die bytes so wie sie sind in einen OutputStream, Java verändert daran nichts


----------



## focus (9. Jan 2006)

Hi, Danke für die rasche Antwort,


			
				Bleiglanz hat gesagt.:
			
		

> wenn du das nicht willst, warum schreibst du es dann hin?



Weil ich nicht weiss, wie ich sonst die Daten in den Puffer bekomme =)



			
				Bleiglanz hat gesagt.:
			
		

> schreib halt einfach die bytes so wie sie sind in einen OutputStream, Java verändert daran nichts



Das Protokoll ansich soll nicht senden, sondern eine externe Routine. Die Daten müssen also zunächst in einen Puffer, der dann gesendet wird. Leider habe ich nicht die geringste Ahnung, wie ich das machen soll!

Freundlichen gruss
Michael


----------



## Bleiglanz (9. Jan 2006)

was ist "der Puffer", wie sieht der aus?

zum Lesen und Schreiben in Sockets gibts genügend Zeugs

http://javaalmanac.com/egs/java.net/pkg.html

und arbeite nur mit Bytes, wenn du Strings ins Spiel bringst gibt das in Verbindung mit C/C++ einen Kladderadatsch


----------



## focus (9. Jan 2006)

Bleiglanz hat gesagt.:
			
		

> was ist "der Puffer", wie sieht der aus?
> und arbeite nur mit Bytes, wenn du Strings ins Spiel bringst gibt das in Verbindung mit C/C++ einen Kladderadatsch



Ein ganz normaler Byte Puffer.
Das mit den Strings stimmt, da bin ich schon seit längerem von abgekommen..


Der Sendeteil sieht etwa so aus, er initialisiert Daten, die von dem embedded System abgefragt werden:

```
sock = new DatagramSocket( port );

sndPacket = new DatagramPacket(data1, data1.length, addr, port);
TProtokoll initProtocol = new TProtokoll();
for(int i=0; i<iComponentCount; i++){
	initProtocol.cInitStr = slaves.get( i ).GetInitStr();
                //....und Andere
	data1 = initProtocol.getBytes();
	status.appendText("\n\nSending packet containing: " + data1 + "\n");
            	sndPacket.setData(data1, data1.length);
            	sock.send(sndPacket);				
}
```


----------



## Beni (9. Jan 2006)

Eine Implementation eines Byte-Puffers.

Da kannst du ein byte nach dem anderen reinschreiben (oder mit einem DataOutputStream drumrum, auch gleich ganze int's oder doubles's, ...)


----------

