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 :
Screenshots :
Bild 1
Bild 2
Bild 3
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
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("");
}
}
}

Bild 1

Bild 2

Bild 3
Zuletzt bearbeitet von einem Moderator: