Socket UDP Hole punching

notepass

Mitglied
Hallo Leute,
ich wollte einmal mit Netzwerkprogrammierung anfangen und dachte mir ich versuche mich mal an einem kleinen Chat. Damit das ganze auch Netzwerkübergreifend funktioniert, wollte ich UDP Hole punching nutzen... Dafür habe ich hier Source-Code gefunden. Im internen netzwerk funktioniert das auch so weit alles perfekt, jedoch wenn ich von einem Netzwerk durch eine Firewall in ein anderes durch eine Firewall geschütztes Netzwerk kommunizieren will, versagt die Anwendung. Laut Wireshark kommen die Pakete nicht im Zielnetz an... Auch das öffnen eines Ports in einem der Zielnetze hilft nicht. Als ziel-Adresse nutze ich die externe IP (über myip.is) ermittelt. Hat hier vll. noch jemand eine Idee was man machen kann?

Das Programm besteht (wie im original auch) aus drei teilen:

1.) UDPTestView [Startet den Sender und den Empfänger]
Java:
package de.notepass.chat.network;

import java.io.*;
import java.net.DatagramSocket;
import java.util.Properties;

public class UDPTestView {
    public static void main(String [] args) {
        new UDPTestView();
    }

    public UDPTestView() {
        try {
            File propFile = new File("ip.conf");
            Properties prop = new Properties();
            String ip;
            if (!propFile.exists()) {
                prop.setProperty("ip","127.0.0.1");
                prop.store(new FileOutputStream(propFile),"");
                ip = "127.0.0.1";
            } else {
                prop.load(new FileInputStream(propFile));
                ip = prop.getProperty("ip");
            }
            //ta_result.setText("");
            DatagramSocket socket = new DatagramSocket(9876);
            final UDPReceive rec = new UDPReceive(socket,this);
            final UDPSend send = new UDPSend(socket,this,ip);

            Thread t1 = new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        send.run();
                    } catch (IOException e) {
                        e.printStackTrace();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
            t1.start();



            Thread t2 = new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        rec.run();
                    } catch (IOException e) {
                        e.printStackTrace();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
            t2.start();


        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}


2.) UDPSend (Sender, um einen Text zum Empfänger zu senden)
Java:
package de.notepass.chat.network;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketAddress;

public class UDPSend {
    String ip;
    //DatagramSocket socket;
    UDPTestView view;
    DatagramSocket clientSocket;


    public UDPSend(DatagramSocket socket,UDPTestView view,String ip) {
        this.ip = ip;
        this.clientSocket = socket;
        this.view = view;
    }

    public void run() throws IOException, InterruptedException {
        String text="Sehr komisch";
        while (true) {
            SocketAddress addr = new InetSocketAddress( this.ip,  9876 );
            byte[] sendData = new byte[1024];
            sendData = text.getBytes();
            DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, addr);
            //System.out.println(text+" -> "+this.ip);
            clientSocket.send(sendPacket);
            //Thread.sleep(2000);
        }
    }
}


3.) UDPReceive (Empfängt die vom Sender gesendeten Daten)
Java:
package de.notepass.chat.network;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class UDPReceive {
    DatagramSocket serverSocket;
    UDPTestView view;

    public UDPReceive(DatagramSocket socket, UDPTestView view)
    {
        this.serverSocket = socket;
        this.view = view;
    }
    public void run() throws IOException, InterruptedException {
        byte[] receiveData = new byte[1024];
        while (true)
        {
            DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
            serverSocket.receive(receivePacket);
            String sentence = new String( receivePacket.getData());
            //view.addMessage(sentence);
            if (sentence != null) {
                if (!sentence.equals("")) {
                    System.out.println(receivePacket.getAddress().toString().substring(1)+" -> "+sentence);
                }
            }
            //Thread.sleep(312);
        }
    }
}


Zudem wird auch eine Properties-Datei beim starten angelegt, in welche man die Ziel-Adresse für den sender eintragen kann


Ich wäre für jede Hilfe dankbar und suche auch selbst weiter nach Lösungen...

MFG,
note
 

Ähnliche Java Themen


Oben