Socket UDP Chat Verbindungsproblem im WWW (Server sendet ins leere)

  • Themenstarter Themenstarter Athikka2
  • Beginndatum Beginndatum
A

Athikka2

Gast
Hallo zusammen!

Ich baue gerade einen VoIP chat, der über UDP geht nach dem einfachen Client Server modell:

Ein Server mit fixer IP, der die Nachrichten bzw. bytes dann an den jeweilig anderen Client weiterleitet.
und die Clients die sich mit dem Server im Internet verbinden können (selber jedoch keine fixe IP haben)

nun habe ich ein Problem, und zwar dass es im lokalen Netzwerk geht (Client1 sendet paket an Server, dieser leitet es an Client2 weiter->erfolg), also die IP adressen klar sind.

jedoch kommt nichts mehr an sobald ich dasselbe im internet mache (Client1 sendet paket erfolgreich an Server, dieser leitet es weiter an Client2 - es kommt jedoch nie etwas an) - ich denke hier dass der Server es an die (bei der verbindung) von Client2 übergebene IP sendet, die jedoch bereits irgendein anderer rechner fix da draußen besetzt hat.

Das komische ist, dass per TCP alles reibungslos geht...


kann mir wer helfen?
muss ich hier tunneln? oder wie kann der Server die erhaltene nachricht richtig weiterleiten??

bitte um Hilfe!


Vielen Dank schon im Vorraus!

lg Niko
 
Hallo

ja klar, ich versuchs in einer Kurzversion - es liegt schließlich an der übertragung:

am server läuft folgendes:

verbindungen annehmen und speichern:
Java:
while (listen) {
	try {
		Socket s = null;
		s = ss.accept(); // blockiere, bis Client-Request kommt
									
		if(ss.isClosed()) return null;
						
		UserSocket us = new UserSocket(s);  //darin wird INetAdress und Socket der verbindung gespeichert (zum weiterleiten)
		

		connections.add(us);
					
		
	} catch (SocketException e) {
		System.out.print("Socket geschlossen");
	} catch (IOException e) {
		e.printStackTrace();
	}		
}


das weiterleiten geht dann so (im eigenen thread der "horcht" sobald was ankommt natürlich):


SERVER EMPFÄNGT PAKET, SENDET JEDOHC NICHT / KORREKT!

Java:
public void run(){
			int datalen = 1201; (=die genaue größe eines im netzwerk gesendeten packages)
//die packages müssen alle dieselbe größe haben sonst kann er nicht empfangen wenn kleiner oder grˆfler! (fixe grˆfle wichtig!)
//die größe MUSS genau 1201 sein sonst wird nicht übertragen! komisch, aber ok!
			
			byte[] data = new byte[datalen];
			System.out.println("           ----------- OPEN ------------");

			while(redo && udpListener != null){
				
				DatagramPacket packet = new DatagramPacket(data,data.length);
				try {
//					System.out.println("           ----------- RECIEVE ------------");

					udp.receive(packet);
				} catch (IOException e) {
					e.printStackTrace();
				}
//				System.out.println("           ----------- RECIEVED READY: ------------");

				System.out.println("Datalength: " + packet.getLength());
				
			
				if(packet.getData().length >= 0){
					
					//paketinfos (sprache) aus dem übertragenen byte array herausholen
					UDPPackage pg = getUDPPackageFromByteArray(packet.getData());
					
					//an konferenz=anderer user weiterleiten zur weiteren verarbeitung:
					getConferenceByID(pg.conferenceID).VOIP_processUDPPackage(pg); (EMPFANG OK!, SENDEN SCHLÄGT FEHL!)

				}
			}

			
			udp.close();
			
			
		}

und VOIP_processUDPPackage(pg) versendet das erhaltene paket (HIER IST DER FEHLER - es kommt nie etwas an!


Java:
		public void VOIP_processUDPPackage(UDPPackage pg) {
		
			try {
				DatagramSocket toSocket = new DatagramSocket();
				
				//ANMERKUNG: nicht an sich selbst senden!
				
				for(UserSocket s : activeCall){
					if(!s.username.equals(pg.from.trim())){ //nicht an sich selbst senden!
						byte[] arr = null;
						try {
							arr = toBytes(pg); //mache byte array aus klasse!
						} catch (IOException e1) {
							e1.printStackTrace();
						}
						DatagramPacket dp = new DatagramPacket(arr,arr.length,s.udpAdress, SEND_UDP_Port);

						//SEND_UDP_Port = der "horch" port des empfängerclients)
						//s = socket das bei der verbindung (per tcp übergeben wurde)
						//s.udpAdress = 	beim erstellen des UserSockets(Socket s): 
						//			dort wird:	this.udpAdress = s.getLocalAddress(); //ist das hier der fehler??
						//lokal geht es ja im netzwerk, vl weil dort die IPS fix sind? welche adresse muss ich nehmen?



						try {
							toSocket.send(dp); //SENDE! ES KOMMT NUR NICHTS AN...
						} catch (IOException e) {
							e.printStackTrace();
						}
					}
				}

				
			} catch (SocketException e) {
				e.printStackTrace();
			}
			
			
		}


Vielen Dank!
 
hallo

jetzt bin ich endlich angemeldet (hatte pw vergessen) 🙂

ich denke dass ich hier Hole-Punching anwenden muss oder?

also weil die IP die der client dem server per TCP übergibt gilt ja nicht da es eine lokale adresse ist (192.168....)

wie komme ich nun an die richtige IP des clienten damit ich ihn von außen(WWW) erreichen kann?
 
nimm dafür dyndns.org oder einen anderen Anbieter ... Alternativ auch ein eigener Root-Server ... dyndns läßt nur 5 Accounts zu
 
Hallo

Danke für die Antwort,

ich habe ja einen Computer mit fixer IP im WWW (zu dem sich die clients verbindet und wo die nachrichten immer weitergereicht werden)

nur ich brauche eben die IP meiner clients.. wie komme ich dazu?
 
Ja Danke, aber was ich brauche ist UDP

per Socket (TCP) läuft alles reibungslos (senden von Client1, weiterleiten bei Server, empfangen bei Client2)...

irgendwie kommt UDP einfach nicht an! komisch...
also DatagramSocket
 
muss es unbedingt UDP sein? ... DatagramSocket sollte eine ähnliche Funktion haben wie Socket

wenn Du über Hole-Punching nachdenkst, solltest Du lieber darüber nachdenken den Port einfach freizugeben ... wenn aber Kunden das machen müssen das nutze liebere einen Root-Server - Kunden wollen nur benutzen (nicht mal installieren)
 
hallo

ja muss leider UDP sein da es VOIP ist... sonst könnte ich gleich alles über TCP machen...

es ist auch für kunden, also muss ich das in die hände nehmen...
 
oder, was brauche ich für die verbindung damit UDP korrekt sendet?

TCP habe ich ja auch stehen und der liefert mir ja die InetAdress zurück

brauche ich jetzt

getInetAddress oder getLocalAddress oder getRemoteSocketAddress oder getLocalSocketAddress?

hat da wer erfahrung? welche ist die richtige IP zum kommunizieren?
 

Neue Themen


Zurück
Oben