Socket Zwei Computer im gleichen Netwerk ohne Portforwarding ?

L

LineTwo

Gast
Hallo liebe Java Community,
ich will für ein Spiel eine Verbindung zwischen zwei Computern im selben Netzwerk herstellen möglichst ohne Portforwarding .

Ich habe sehr lange darüber rechachiert aber nichts ansprechendes gefunden also habe ich es zuerst mit einem ganz normalen Socket probiert . Ich habe in einem anderen Forum gelesen das wenn sich die Computer im selben Netwerk befinden , kein Ports "geöffnet" werden müssen .
Zuerst hab ich mir die Frage gestellt welche Ip ich benutzen soll aber weder mit der Ip "localhost" , Die Ip meines Routers oder die Ip meines Computers hat es funktioniert (siehe Bild 3). Also habe ich ein paar Ports im meinem Router geöffnet und es hat immernoch nicht funktioniert . Nach weiterer Recherche habe ich herrausgefunden das scheinbar die Firewall meines Routers den Port blockt (Übrigens meine Mac Os x Firewall war ausgeschaltet .).
Unter dem Netzwerkdienstprogramm von Mac Os gibt es die Option Portscanning , die nach offenen Ports einer Ip sucht (siehe Bild 2). Dieses Tool hat mir zwar ein paar Ports ausgespuckt aber immer wenn ich diese für meinen Socket benutzt habe dann kam diese Fehlermeldung: java.net.ConnectException: Connection refused . ( Was nach meiner Recherche mehreres bedeuten kann)

Als letztes habe ich das Tool ngrok ausprobiert (siehe Bild 1), welches via von einer von ngrok zuverfügungestellten Subdomain , eine Port Weiterleitung oder so ähnlich herstellt . Angeblich kann man mitdiesem Tool auf das Portforwarding verzichten . ENDLICH ! Erster Erfolg , der Client und der Server verbinden sich . Zumindest sah das so aus :( . Der Client hat sich zwar mit dem Server verbunden aber der Server scheinbar nicht . Ich weiß das klingt komisch aber während der Client mir "Connected" anzeigte , regte sich der Server nicht . Auf der Gui des Clients wurden auch nur Sachen angezeigt die der Client selber ausrechnet . Probiert man das selbe jedoch auf dem selben Laptop , funktioniert es EINWANDFREI !!!

Meine letzte Überlegung war das Problem mit Universall Plug and Play [UPnP] zu lösen .
Ein Tutorial dazu habe ich nicht gefunden , weshalb ich mich mit einigen Api´s auseinander gesetzt habe , welche jedoch für einen "Netzwerk Anfänger" wie mich viel zu Komplex .

Jetzt zu meinen Fragen :

1.Habe ich vielleicht doch eine falsche Ip Adresse benutzt und wenn ja wie finde ich herraus welche Adresse ich benutzen soll .

2. Gibt es eine Möglichkeit einen Server zu erstellen der nur im selben Lan Netzwerk funktioniert ? (Ich stelle mir das so wie bei Minecraft vor , wo man die Möglichkeit hat Welten im Lan zu öffnen (ohne Portforwarding))

3.Warum blockt die Firewall meines Routers den Port ? (Es gibt leider keine Möglichkeit diese auszuschalten )

4. Habe ich irgendetwas nicht bedacht ? Ich kenne mich übrigens sehr wenig mit dem Thema. aus .

Hier ist mein Server Klasse :
Java:
    public class Server implements ActionListener, Runnable {

        private  String HOST = "ZENSIERT";
        private   int PORT = ZENSIERT;
        private final JFrame f = new JFrame();
        private final JTextField tf = new JTextField(25);
        private final JTextArea ta = new JTextArea(15, 25);
        private final JButton send = new JButton("Send");
        private volatile PrintWriter out;
        private Scanner in;
        private Thread thread;
        private Kind kind;
        private int count;

        public static enum Kind {

            Client(100, "Trying"), Server(500, "Awaiting");
            private int offset;
            private String activity;

            private Kind(int offset, String activity) {
                this.offset = offset;
                this.activity = activity;
            }
        }

        public Server(Kind kind) {

            this.kind = kind;
            f.setTitle("Echo " + kind);
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.getRootPane().setDefaultButton(send);
            f.add(tf, BorderLayout.NORTH);
            f.add(new JScrollPane(ta), BorderLayout.CENTER);
            f.add(send, BorderLayout.SOUTH);
            f.setLocation(kind.offset, 300);
            f.pack();
            send.addActionListener(this);
            send.setEnabled(true);
            ta.setLineWrap(true);
            ta.setWrapStyleWord(true);
            DefaultCaret caret = (DefaultCaret) ta.getCaret();
            caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
            display("Enter Server Adress");

        }

        public void start() {
            f.setVisible(true);
            //thread.start();
        }

        //@Override
        public void actionPerformed(ActionEvent ae) {

            String s = tf.getText();
            String Port = "ZENSIERT";
            String Host = "ZENSIERT"
            if (s.contains(":")){
               String[] parts = s.split(":");
                Host = parts[0];
                Port = parts[1];
            }
            if (count == 0){
                if (kind == Kind.Server){
                   HOST = Host;
                   PORT = PORT;
                    thread = new Thread(this, kind.toString());
                    thread.start();
                    display("Server started on :" + Host + "|" + Port);


                    }else{
                    HOST = Host;
                    PORT = PORT;
                    thread = new Thread(this, kind.toString());
                    thread.start();
                }

                }
            else {

            if (out != null) {
                out.println(s);
            }
            display(s);
            tf.setText("");

        } }

        //@Override
        public void run() {
            try {
                Socket socket;
                if (kind == Kind.Client) {
                    socket = new Socket(HOST, PORT);
                } else {
                    ServerSocket ss = new ServerSocket(PORT);
                    socket = ss.accept();
                }
                BufferedReader in =
                        new BufferedReader(new InputStreamReader(socket.getInputStream()));

                out = new PrintWriter(socket.getOutputStream(), true);
                display("Connected");
                if (kind == Kind.Server){
                   MultiplayerIngame.setupHostMatch();
                    System.out.println("Setting Up Host");
                }else{
                    MultiplayerIngame.setupGuestMatch();
                }


                while (true) {
                   // display(in.nextLine());

                    PackgageReseveEvent.PackageReseveEvent(in.readLine());
                }

            } catch (Exception e) {
                display(e.getMessage());
                e.printStackTrace(System.err);
            }
        }

        private void display(final String s) {
            EventQueue.invokeLater(new Runnable() {
                //@Override
                public void run() {
                    ta.append(s + "\u23CE\n");
                }
            });
        }

        public static Server server;

        public static void createServer(Kind kind) {
            EventQueue.invokeLater(new Runnable() {
                //@Override
                public void run() {
                    server = new Server(kind);
                    server.start();
                    // new Server(Kind.Client).start();
                }
            });
        }

        public static void sendClientPackage(String Package) {

            if (server.out != null) {
                server.out.println(Package);
            }
            if (Package.startsWith("Info:")) {
                server.display(Package);
                server.tf.setText("");
            }



        }



    }
Screenshots :

Wqi01b8.png

Bild 1
pY1hBJK.png

Bild 2
Nk7MxjB.png

Bild 3
 
Zuletzt bearbeitet von einem Moderator:

mrBrown

Super-Moderator
Mitarbeiter
1.Habe ich vielleicht doch eine falsche Ip Adresse benutzt und wenn ja wie finde ich herraus welche Adresse ich benutzen soll .
Vielleicht.
Die des Rechners, mit dem du dich verbinden willst (weshalb localhost schon mal raus fällt, das ist immer der Rechner selbst)

2. Gibt es eine Möglichkeit einen Server zu erstellen der nur im selben Lan Netzwerk funktioniert ? (Ich stelle mir das so wie bei Minecraft vor , wo man die Möglichkeit hat Welten im Lan zu öffnen (ohne Portforwarding))
Jeder Server funktioniert auch im Lan, das ist für den Server egal.

3.Warum blockt die Firewall meines Routers den Port ? (Es gibt leider keine Möglichkeit diese auszuschalten )
Sollte sie im lokalen Netz nicht tun. Tut sie generell, damit von außen niemand in dein lokales Netz kommt.
Kann man aber üblicherweise abstellen.


4. Habe ich irgendetwas nicht bedacht ? Ich kenne mich übrigens sehr wenig mit dem Thema. aus .
In deinem Code fehlen in jedem Fall Zeichen...
 
L

LineTwo

Gast
Vielleicht.
Die des Rechners, mit dem du dich verbinden willst (weshalb localhost schon mal raus fällt, das ist immer der Rechner selbst)
Hab ich auch schon gemacht . Kein Erfolg . Connection Refused .
Vielleicht.
Sollte sie im lokalen Netz nicht tun. Tut sie generell, damit von außen niemand in dein lokales Netz kommt.
Kann man aber üblicherweise abstellen.
Nein bei Telekom Speedports leider nicht . Wenn sie von generell Ports blockt damit niemand von außen reinkommt , wie funktionieren dann Programme die nicht über das selbe Netz kommuniezieren . Ist Portforwarding nicht genau dafür da ?
 

mrBrown

Super-Moderator
Mitarbeiter
Hab ich auch schon gemacht . Kein Erfolg . Connection Refused .
Der Server läuft?
Der Port passte?
Auf dem Rechner läuft keine Firewall oä?


Nein bei Telekom Speedports leider nicht . Wenn sie von generell Ports blockt damit niemand von außen reinkommt , wie funktionieren dann Programme die nicht über das selbe Netz kommuniezieren . Ist Portforwarding nicht genau dafür da ?

Bei fast allen Speedport lässt sich Portforwarding einrichten (was im wesentlichen einem Ausstellen der Firewall für einzelne Ports gleich kommt) und die Firewall auch ganz deaktivieren.
 
L

LineTwo

Gast
Bei fast allen Speedport lässt sich Portforwarding einrichten (was im wesentlichen einem Ausstellen der Firewall für einzelne Ports gleich kommt) und die Firewall auch ganz deaktivieren.
Ich habe den Port eigentlich freigegeben .
6OwLG0S.png

Wenn ich aber über einen Open Port Checker Tool nachschaue ist der Port entweder geschlossen oder gefiltert .
2FvAgOX.png

Mein Speedport router zeigt mir folgendes an :
gjo8LF6.png
 

Meniskusschaden

Top Contributor
Wenn sich die IP-Adressen der beiden Rechner im selben Subnetz befinden, sollte die Router-Funktionalität des Speedport (und damit auch seine Firewall und Port-Weiterleitung) eigentlich komplett außen vor sein. Passen Subnetzmasken und IP-Adressen der beiden Rechner denn zusammen und sind die Firewalls beider Rechner ausgeschaltet?
 

mrBrown

Super-Moderator
Mitarbeiter
Wie bereits erwähnt sind die Firewalls beider Computer deaktiviert . Die Ip Adressen befinden sich ebenfalls in der gleichen Teilnetzmaske . Ausserdem wurde der Port ja von einem aussentsehenden Tool als geschlossen eingestuft (https://www.yougetsignal.com/tools/open-ports/).
Das externe Tool prüft den Zugriff aus dem externen Netz, für den lokalen Zugriff ist das irrelevant.


Ist denn der Server über localhost erreichbar? (also, Client und Server auf dem gleichen Rechner starten)
 

Meniskusschaden

Top Contributor
Nach dem ich im Feld UDP auch den Port eingetragen hab , hats funktioniert !
Falls du damit die Port-Forwarding Konfiguration am Speedport meinst, ist das in doppelter Hinsicht seltsam. Zum Einen wird das für die Kommunikation im eigenen Subnetz überhaupt nicht gebraucht (es sei denn, man hat die Rechner fehlerhaft konfiguriert, so dass doch geroutet werden muss). Oder stehen die Rechner nicht im "richtigen" LAN, sondern in einem Gastnetz o.ä.?
Zum Anderen nutzt dein Programm doch Server und SocketServer. Meines Wissens nutzen die nicht UDP, sondern TCP.
Falls sich das reproduzieren lässt, ist vermutlich irgend etwas in deinem Netzwerk vermurkst.
 

Ähnliche Java Themen

Neue Themen


Oben