DatagramPacket --- getData()

Jahava

Mitglied
Hallo,

habe folgendes mini Problem das ich irgendwie nicht durchblicke.

Mein server empfängt ein DatagramPacket dessen inhalt ich folgendermaßen auslese:
Code:
String sentence = new String(receivePacket.getData());
wobei mein receivepacket logischerweise meine Instanz von DatagramPacket ist.

wenn ich aber jetzt an mein Server z.B. die Nachricht "exit" schicke und folgendes mache
Code:
if(sentence == "exit") System.out.println(sentence);
gibt er mir die Nachricht nicht aus. Also sentence ist quasi nicht "exit" obwohl ich vom Client aus exit versende.

getData() ist ja ein Byte-Array aber das erledigt sich ja indem ich es in ein String Objekt einpacke, oder ?

Alles andere funktioniert 1A nur dieser vergleich funktioniert nicht. Warum ? Bitte um Hilfe !

Vielen Lieben Dank schon mal im voraus.
 

Clayn

Aktives Mitglied
Weil man Strings mit equals() und nicht mit "==" verlgeicht.

du musst also
Code:
sentence.equals("exit")
oder
Code:
sentence.equalsIgnoreCase("exit")
machen.

Der Vergleich mit "==" kann auch zum gewollten ergebnis führen aber man kann das schwer vorhersehen etc.
 
G

grundlagen?

Gast
String ist ein Objekt ... kein primitiver Datentyp ... und Objekte vergleicht man nun mal mit Object.equals(Object) ...

Deine Zeile muss also so lauten :

Java:
if(sentence.equals("exit)) { /*to-do*/ }

Das sind GRUNDLAGEN *die man können sollte bevor man mit sowas wie UDP-Datagrammen rumspielt*.Von dir ausgewählter Benutzername ist gesperrt
 

Jahava

Mitglied
nun folgendenes:
das mit equals habe ich auch schon probiert es geht aber auch nicht.
Also dara liegt es nicht

Code:
public static void main(String args[]) throws Exception {
		
		DatagramSocket serverSocket = new DatagramSocket(9876);
		
		byte[] receiveData = new byte[1024];
		DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
	
		boolean schleife = true;
		
		while(schleife) {
			
			System.out.println("Waiting for Packet");
			serverSocket.receive(receivePacket);
		
			String sentence = new String(receivePacket.getData());
			
			InetAddress IPAddress = receivePacket.getAddress();
			int port = receivePacket.getPort();
			
			if(sentence.equals("exit")) System.out.println("------>" + sentence);
			
			System.out.println("Inhalt des Packets: " + sentence + " Adresse: " + IPAddress + " Port: " + port);
		}
		
		serverSocket.close();
		
	}
 

Clayn

Aktives Mitglied
Dann ist sentence vllt nicht "exit"? Blah ich seh grad hast ja ne Ausgabe.
Was steht denn da bzw kommt als ausgabe von
Code:
System.out.println("Inhalt des Packets: " + sentence + " Adresse: " + IPAddress + " Port: " + port);
?
 

Jahava

Mitglied
Code:
public static void main(String args[]) throws Exception {
		
		DatagramSocket serverSocket = new DatagramSocket(9876);
		
		byte[] receiveData = new byte[1024];
		DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
	
		boolean schleife = true;
		
		while(schleife) {
			
			System.out.println("Waiting for Packet");
			serverSocket.receive(receivePacket);
		
			String sentence = new String(receivePacket.getData());
			
			InetAddress IPAddress = receivePacket.getAddress();
			int port = receivePacket.getPort();
			
			// TEST ----> Hier kommt als Ausgabe: exit
			System.out.println(sentence);
			
			// Das geht aber trotzdem nicht (komischerweise)
			if(sentence.equals("exit")) System.out.println("------>" + sentence);
			
			System.out.println("Inhalt des Packets: " + sentence + " Adresse: " + IPAddress + " Port: " + port);
		}
		
		serverSocket.close();
}

Und das ist die komplette Ausgabe:
Waiting for Packet
exit
Inhalt des Packets: exit Adresse: /127.0.0.1 Port: 62831
Waiting for Packet
 
Zuletzt bearbeitet:

Jahava

Mitglied
Keine Idee ?

Also die getDate() Methode liefert ja eigentlich ein byte[]
Die frage ist, wenn ich folgendes tue:
Java:
String sentence = new String(receivePacket.getData());
steht dann in sentence genau der gleich String drin wie der den ich beim absenden in ein byte[] umgewandelt habe
oder sind da irgendwelche anderen bestandteile auch dabei.
Dem Anschein nach steht eben nicht genau der selbe String drin sonst würde es ja gehen.
Aber wenn ich den Stirng direkt ausgebe erscheint auf der Konsole genau der Stirng Inhalt wie der den ich vom Client aus eingegeben habe.
Also irgendwie ergibt das kein Sinn das dann die if-überprüfung kein true liefert ??


Irgendwas mit Charset ?? (das ist so unverständlich das ich alles in Betracht ziehe gerade :))
 
Zuletzt bearbeitet:

Empire Phoenix

Top Contributor
Weil man Strings mit equals() und nicht mit "==" verlgeicht.

du musst also
Code:
sentence.equals("exit")
oder
Code:
sentence.equalsIgnoreCase("exit")
machen.

Der Vergleich mit "==" kann auch zum gewollten ergebnis führen aber man kann das schwer vorhersehen etc.

Eigentlcih sit das ziemlcih einfach:

Strings alnden in einem pool wenn sie konstant sind, sprich dein exit wird im pool landen.
Das gelesene exit ist aber dynamisch, und daher ein eigenes object. == vergleicht (in kurz und grob) die speicheradresse.

Wenn man also eine gleichheit und nicht eine identiät möchte equal benutzen. (also so gut wie immer)


versuch mal ein contains("exit")

evtl sit da noch nen leerzeichen oder nen zeilenumbruch drinnen?

Ich empfhele dir einfach nen ByteBuffer zu verwenden,
und dann hinterher das unterliegen array zu versenden:

Code:
byte[] bcache = new byte[NetWorkConfig.maxpacketsize];
DatagramPacket cache = new DatagramPacket(this.bcache, NetWorkConfig.maxpacketsize);
final ByteBuffer data = ByteBuffer.wrap(this.bcache);
data.limit(this.cache.getLength());



import java.io.IOException;
import java.nio.ByteBuffer;

public class StringSerialize {
	public static final void writeString(final ByteBuffer out,String source) throws IOException{
		if(source == null){
			source = "";
		}
	//	source = NetworkStringPool.Compress(source);
		int amount = source.length();
		out.putInt(amount);
		for(char c:source.toCharArray()){
			out.putChar(c);
		}
		
	}
	
	public static final String readString(final ByteBuffer readfrom) throws IOException{
		StringBuffer read = new StringBuffer();
		int amount = readfrom.getInt();
		while(amount > 0){
			amount--;
			read.append(readfrom.getChar());
		}
		return read.toString(); //NetworkStringPool.Decompress(read.toString());
	}
	
	public static final int getSize(final String source){
		return (source.length()*2) + 4;
	}
}
 

Jahava

Mitglied
Das mit contains funktioniert :)
vielen vielen Dank.
Auch wenn ich immer noch nicht verstehe warum das mit equals nicht ging.

Wenn ich bei der Ausgabe die beiden exit´s mit der Maus markiere, kann ich kein Leerzeichen feststellen. Also das kann es nicht sein. Ein Zeilenumbruch ist auch unwahrscheinlich denn die lagen alle immer schön untereinander (immer ...printLn).

Wenn ich beide in ein byte[] umwandele und Ausgebe kommen zwei verschiedene Ausgaben zu stande. Stellt sich die frage ob das normal ist das wenn ich zwei mal den selben String in ein byte[] umwandele, dass dann zwei verschiedene byte[] erzeugt werden.

Für ein wenig Hintergrundinformation wäre ich sehr Dankbar.
Ansonsten aber vielen Lieben Dank. Mein Problem ist erstmal gelöst.

MFG
 
G

Gast2

Gast
Es könnte wie bereits gesagt auch ein CR oder LF dranhängen, welches auch in den Debug Ansichten nicht angezeigt wird. Dazu müsstest du das byte[] inspecten und schauen ob da noch ein LF oder CR byte vorhanden ist.

Equals prüft auch Gleicheit, da zählen auch Zeilenumbrüche dazu welche du vielleicht so nicht siehst.
 

Jahava

Mitglied
Hmm ok, also das mit LF oder CR würde es auch aus meiner Sicht erklären.
dachte nur das ich das in der Console auch sehen müsste, aber wenn das Eclipse ignoriert scheint mir die Sache jetzt in sich stimmig zu sein :D
Also viele Dank für die freundliche Unterstützung und MFG
 

Ähnliche Java Themen


Oben