# Java Chat über UDP



## Tobe96 (9. Sep 2009)

Hallo,
ich bin dabei einen Chat in Java zu bauen (p2p, bei dem das Programm gleichzeitig als Server zum Empfangen und Client zum Senden von Nachrichten agiert), bei dem die Daten über UDP übertragen werden. Eigentlich funktioniert der Chat (auf String-Ebene), ein Problem tritt nur beim Verschlüsseln auf, da er nicht das gleiche empfängt, was gesendet wird (auf byte-Ebene). Im Nachfolgenden kommt der wichtige Teils (Kommunikation funktioniert) meines Code bei dem ich das gesendete byte-Array bwz. empfangene byte-Array mittels toString() "ausgebe". Da der hash-Wert auf beiden Seiten unterschiedlich ist, gehe ich davon aus, das irgendetwas verändert wird. Ist das so, und wenn ja, wie kann ich das Problem lösen?

Client:

```
String message = "hierIstDieNachricht";
				System.out.println("gesendet: "+message.toString());
				
				//create package
				byte[] raw = message.getBytes(); 
				DatagramPacket packet = new DatagramPacket(raw, raw.length, inetAddress, port); 
		 
				//create socket and send package
				DatagramSocket dSocket;
				dSocket = new DatagramSocket();

				dSocket.send(packet);]
```

Server:

```
while(true) 
		{  
			//wait for query
			DatagramPacket packet = new DatagramPacket(new byte[1024], 1024); 
			socket.receive(packet); 
	 
			// read and output data
			InetAddress address = packet.getAddress(); 
			int         port    = packet.getPort(); 
			int         len     = packet.getLength(); 
			byte[]      data    = packet.getData();

		    
			Key key1 = new SecretKeySpec( "qwertzuiopasdfgh".getBytes(), "Blowfish" );
			System.out.println("erhalten: "+data.toString());

}
```


----------



## tuxedo (10. Sep 2009)

Ohne deinen Code im Detail angeschaut zu haben:

Dir ist aber schon bewusst dass du dich nicth auf Reihenfolge und "überhaupt ankommen" der Datenpakete verlassen kannst? Zusätzlich können Pakete fragmentiert werden.

Was du benötigst ist ein recht sicheres Protokoll dass mit diesen Eventualitäten umgehen kann. Hast du sowas nicht, werden dir immer wieder solche Phänomene begegnen. Einfach nen String schicken und hoffen dass das so passt ist nicht mit UDP ...

- Alex


----------



## Tobe96 (10. Sep 2009)

Die Aufgabenstellung lautet leider Datenübertragung mittels UDP und Verschlüsselung mittels Blowfish. Ich habs jetzt geschafft, dass auf beiden Seiten die gleichen Datan auf byte-Ebene herauskommen. Das Problem war, dass der Buffer mit 1024 an den übrigen Stellen leer war. Beim entschlüsseln mittels Blowfish bekomme ich nun aber auf der anderen Seite den Fehler: 

```
Exception in thread "main" javax.crypto.BadPaddingException: Given final block not properly padded 
        at com.sun.crypto.provider.SunJCE_h.b(DashoA12275) 
        at com.sun.crypto.provider.SunJCE_h.b(DashoA12275) 
        at com.sun.crypto.provider.BlowfishCipher.engineDoFinal(DashoA12275) 
        at javax.crypto.Cipher.doFinal(DashoA12275) 
        at P2PChat.ChatServer.<init>(ChatServer.java:91) 
        at P2PChat.ChatServer.main(ChatServer.java:26)
```


----------



## tuxedo (10. Sep 2009)

Ja, das ist nochmal ein anderes Problem 

Zur UDp-Problematik: Ich sags mal so: Im lokalen Netzwerk ist die Change dass es zur fragmentierung oder veränderten Paketreihenfolge kommt extrem gering. Übers Internet, wohlmöglich noch Kontinentübergreifend wo viele Router etc. dazwischen sitzen sieht's dann aber schon anders aus. Sollte man sich im Hinterkopf behalten ..

- Alex


----------



## Tobe96 (10. Sep 2009)

Ich starte das Programm 2 mal auf dem gleichen Computer mit jeweils den entgegengesetzten Port. Darum sollte die Wahrscheinlichkeit ja noch geringer sein, dass die Pakete "falsch" ankommen. Den Padding Fehler habe ich aber trotzdem. Meinst du es liegt dann wirklich noch an den Paketen und der Code würde funktionieren, wenn ich UDP durch TCP ersetzen würde?


----------



## HoaX (10. Sep 2009)

Du sagst ja dass das Array nicht ganz gefüllt ist. Wenn du entschlüsselst darfst du auch nur soviele bytes zum Entschlüsseln reingeben wie du auch bekommen hast, nicht noch mehr. Darum der Padding-Fehler.


----------



## tuxedo (10. Sep 2009)

Ergo: Protokol aufsetzen und die Paketgröße mitsenden. Meinetwegen die ersten 2 byte des Pakets als short-Value nehmen und damit angeben dieviele bytes folgen.

- Alex


----------



## Tobe96 (10. Sep 2009)

jetzt funktioniert es!
Das Problem waren nur die nicht befüllten letzten Bytes des Arrays. Das Verschlüsselungsproblem lag nur noch daran, dass ich durch meine Auskommentierungen nicht mehr durchgestiegen bin.


----------

