Problem mit Socket

timestamp

Mitglied Käsekuchen
Hi Forum

ich muss für ein Programm über udp eine socketconnection erstellen. Das Problem dabei ist, dass ich eine unknown host Exception erhalte.
Wenn ich das ohne udp:// mache, wird mir die Verbindung (vom Server) verweigert, der nur über udp:// erreichbar ist.
Java:
try{
  this.socket		= new Socket("udp://"+host, port);			
}
catch(Exception e){
  System.out.println("ErrorRcon: "+e.getMessage()+" "+e.getClass());
  //ErrorRcon: udp://IP-Adresse class java.net.UnknownHostException
}

Kann mir da jemand weiterhelfen?
 
Um über UDP kommunizieren zu können, benutzt man in Java die DatagrammSockets. Google wird dir dabei sicherlich helfen ^^
 
Ich kann auch nen Beispiel posten, wenn du willst, aber es gibt im Inet genug Tutorials, ich denke das sollte also kein Problem sein.
 
Hi

ein Beispiel wäre vielleicht gar nicht mal so schlecht. Ich habe es jetzt so versucht und nichts hat funktioniert, siehe Fehlermeldungen:
Java:
try{
  this.socket		= new DatagramSocket(port, InetAddress.getByName(host));
}
catch(Exception e){
  System.out.println("ErrorRcon: "+e.getMessage()+" "+e.getClass());
  //ErrorRcon: udp://IP-Adresse class java.net.UnknownHostException
}

try{
  this.socket		= new DatagramSocket(port, InetAddress.getByName(host));
}
catch(Exception e){
  System.out.println("ErrorRcon: "+e.getMessage()+" "+e.getClass());
  //ErrorRcon: Cannot assign requested address: Cannot bind class java.net.BindException
}


try{
  this.socket		= new DatagramSocket(port, InetAddress.getByAddress(new byte[]{(byte)1,(byte)2,(byte)3,(byte)4}));
}
catch(Exception e){
  System.out.println("ErrorRcon: "+e.getMessage()+" "+e.getClass());
  //ErrorRcon: Cannot assign requested address: Cannot bind class java.net.BindException
}

(Der Server ist definitiv online).
 
Ok, hab da mal was rausgekramt aus alten Tagen, läuft aber noch ^^
UDPTest.java
Java:
package tests.io.net.udp;


public class UDPTest {
	InputThread		inTh;
	OutputThread	outTh;

	public UDPTest() {
		inTh = new InputThread();
		outTh = new OutputThread();
	}

	public static void main(String[] args) {
		UDPTest udp = new UDPTest();
		udp.start();
	}

	public void start() {
		inTh.start();
		outTh.start();
	}
}
InputThread.java
Java:
package tests.io.net.udp;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class InputThread extends Thread {
	private DatagramPacket	dp	= null;
	private DatagramSocket	ds	= null;

	@Override
	public void run() {
		try {
			ds = new DatagramSocket(6666);
		} catch(SocketException e) {
			e.printStackTrace();
		}

		while(!isInterrupted()) {
			try {
				Thread.sleep(1000);

				byte[] data = new byte[1024];
				dp = new DatagramPacket(data, data.length);
				ds.receive(dp);
				data = dp.getData();
				for(int i = 0; i < data.length; i++) {
					if(data[i] != 0) {
						System.out.print((char)data[i]);
					}
				}
				System.out.println();
			} catch(InterruptedException e) {
				interrupt();
			} catch(java.io.IOException e) {
				e.printStackTrace();
			}
		}
	}
}
OutputThread.java
Java:
package tests.io.net.udp;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;

public class OutputThread extends Thread {
	private DatagramPacket	dp	= null;
	private DatagramSocket	ds	= null;
	private InetAddress		ia	= null;

	@Override
	public void run() {
		while(!isInterrupted()) {
			try {
				Thread.sleep(1000);

				ia = InetAddress.getLocalHost();
				ds = new DatagramSocket();
				byte[] data = ("Zufallszahl: " + Math.random()).getBytes();
				dp = new DatagramPacket(data, data.length, ia, 6666);

				ds.send(dp);
			} catch(InterruptedException e) {
				interrupt();
			} catch(UnknownHostException e) {
				e.printStackTrace();
			} catch(SocketException e) {
				e.printStackTrace();
			} catch(java.io.IOException e) {
				e.printStackTrace();
			}
		}
	}
}

Eigentlich nix dolles, es werden einfach nur Packete mit Zufallszahlen geschickt bzw. Text, in dem eine Zufallszahl drin ist und dann eben ausgegeben. War halt damals mein erstes Programm, das UDP-Packete verschicken konnte, einfach nur zum Testen halt (sieht man sicherlich am package ^^).

Ich glaube die Fehler kommen bei dir durch den Host-Parameter. Wenn ich das richtig verstanden habe, ist er nur für die lokale Bindung da, also an eine lokale IP (vielleicht um die Packete darüber zu schicken, ka). Jedenfalls brauchst du beim Empfangs-Socket nur den Port angeben und beim Sende-Socket halt gar nix, weil die Zielip wird im DatagramPacket angegeben, das versendet wird.
 
Zuletzt bearbeitet:
Hi

ich konnte mir aus deinem Code jetzt die entsprechenden Sachen zusammensuchen, um entsprechende Sachen an den Server zu schicken.
Ich hab jetzt etwa 2 Stunden daran getüftelt wie ich die Antwort des Servers erhalten kann nachdem ich Daten dort hingesendet hab. Das ursprüngliche Problem, was ich hatte, war, dass ich lediglich den Anfang des Outputs erhalten hatte. Ich konnte es lösen in dem ich mehr Bytes gesendet habe wodurch ich dann irgendwie auch mehr Bytes empfangen konnte. Es wäre super wenn mir das nochmal jemand erklären könnte. Hier mal der aktuelle Code:

Java:
try{
  this.socket		= new DatagramSocket(port);
  this.socket.setSoTimeout(2000);
  byte[] buffer 	= new byte[4096];
  byte[] input	= ("ÿÿÿÿrcon "+this.password+" status\n").getBytes();
  for( int i = 0; i < input.length; i++){
    buffer[i] = input[i];
  }
  dp = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(host), port);			
  this.socket.send(dp);
  this.socket.receive(dp);
  byte[] output = new byte[4096];	
  output = dp.getData(); 
  //Ausgabe
}

Achja, für Verbesserungsvorschläge bin ich natürlich auch offen, das sieht mir im Moment noch eher nach glücklichem Treffer aus als nach gut geschriebenem Code ;)


edit: Schade, leider lese ich doch nicht den ganze output aus sondern nur 1368 bytes. Warum stoppt die Ausgabe dann? Es müssten noch viel mehr Daten folgen. Geschätzt mehr als 3000bytes gesamt.
 
Zuletzt bearbeitet:
Eigentlich haben die Ouputbytes nix mit der Anzahl der Inputbytes zu tun, dein Server ist komisch o_O Und ich würde generell das Empfangen in einen separaten Thread auslagern (oder was heißt würde, ich mach es so), weil soweit ich weiß receive() blockiert, bis etwas ankommt, das heißt der restliche Code kann in der Zeit nicht ausgeführt werden und das Programm könnte sogar freezen (z.B. GUI).

Außerdem weiß ich nix über deinen Server, den du da ansprechen willst, daher kann ich dazu leider auch nix sagen. Aber eigentlich sollte es so funktionieren o_O

EDIT:
Was ist, wenn du das DatagramPacket neu instanzierst, also:
Java:
byte[] output = new byte[4096];
dp = new DatagramPacket(output, output.length);
socket.receive(dp);
output = dp.getData();
 
Zuletzt bearbeitet:
Hi

das mit dem neuen DatagramPacket war eine super Idee, das funktioniert :) Auch die Threadidee ist genial!
Ich habe aber immernoch ein Problem damit, alle Daten zu empfangen. Ein mehrfaches Ausführen der receive Methode ermöglicht mir schonmal im Prinzip alles zu empfangen. Allerdings etwas merkwürdig. Prinzipiell sieht ein Datensatz so aus:
Wenn ich jetzt zuviele IDs habe, muss ich also mehrmals die Methode ausführen. Das führt mich dann zu einem ähnlichen Ergebnis wie hier:
Abfrage 1:
1 - Information
2 - Information
3 - Information
4 - Information
...
13 - Information Anfang
Abfrage 2:
13 - Information Ende
14 - info
15 - info
16 - info
9 - info
10 - info
11 - info

Gibt es da einen besseren Weg für? Ich kann mir jetzt natürlich die Daten zusammentackern aber dass sieht mir irgendwie unschön aus.
 
Haben denn die Antworten etwas mit der Größe des output-Arrays zu tun? Also hast du schonmal versucht es noch größer zu machen? Vielleicht sind die Packete einfach größer. Eine andere Erklärung wäre, dass der Server nur eine bestimmte Packet-Größe verschicken kann und das deswegen splittet, dann musst du die Informationen eben zusammentackern.
 

Neue Beiträge

Zurück