# ohne Port Freigabe.



## Titanpharao (4. Jun 2008)

Guten Abend,

sicher wurde die Frage schon oft im Forum gestellt, aber habe keine richtige Ideen nach was ich suchen kann.

Zwar habe ich die Frage, wie man sein Programm so gestalten kann, das man keine Port-Freigabe machen muss.
Ich stelle es mir blöd vor, wenn jeder der kurz den Server starten möchte erst die Ports freigeben muss. Bei UDP ist doch eigentlich jeder Server und Client, soweit ich das verstanden haben. Also müsten ach die Clienten Ports freigeben. 
Ich meine bei Online-Spielen muss ich auch nichts freigeben. Nur wenn ich richtiger Server sein möchte. Aber ich glaube, auch bei meinem Test Chat Programm, müssen beide die Ports freigeben.

Wenn ich jetzt über den Port 80 gehe, oder die, welche standard sind dann bekomme ich doch auch sicher viel müll für mein Programm oder?

Hoffe meine Frage wurde verstanden  :?


----------



## Kim Stebel (4. Jun 2008)

Ähhm ja vielleicht solltest du dir mal einen Artikel zum Thema NAT und Firewalls durchlesen. Ports müssen da jedenfalls immer freigegeben werden, wenn auf eine Verbindungsaufbau gewartet werden soll, aber nicht wenn der Rechner die Verbindung selbst herstellt.


----------



## tuxedo (5. Jun 2008)

Naja. Es gibt da noch den UPnP Trick. Azureus und Co. wenden den schon an. Sofern dein Router UPnP korrekt unterstützt, kann die Anwendung den "Serverport" mittels UPnP auch selbst freigeben. D.h. der User muss nix mehr konfigurieren. Die Anwendung macht das selbst.

Ich weiß nur nicht ob man den automatisch freizugebenden Port selbst definieren kann. 

Google doch mal nach "Java UPnP"

- Alex


----------



## Titanpharao (6. Jun 2008)

Nein, ich möchte einfach ein Spiel bauen, was auf Client-Server bassiert.
Also viele kleine Clienten und ein Server, der alles managed. Aber ich möchte einfach nicht, das die leute, welche den Clienten benutzen Ports freigeben müssen. Weil noch ist es so in meinem Programm, irgendwie...


----------



## tuxedo (6. Jun 2008)

Man, wer hat denn eigentlich diesen "Unsinn" verbreitet, dass man, wenn man vom CLient aus eine Verbindung zu einem Server aufbauen will, dafür irgendwelche Portforwarding-Strategien aufm dem Client fahren muss? In Game-Foren aller Art wird ständig solcher "Schwachsinn" verbreitet. Geht irgendwas nicht schiebt man's sofort auf "Du hast vergessen den Port freizugeben"... Keine Ahung haben woran's wirklich liegt (bei windows usern oft der fall), und dann einfach mal was ins blaue hinein "empfehlen" (kommt dem "geht nicht? starte mal windows neu." gleich).

Ich stelle mal die behauptung auf, dass weniger als 5% der Leute eine so restriktive Firewall haben, bzw einen so restriktiven Router haben, der ausgehende Verbindungen "per default" verbietet und man dies nachträglich einrichten muss. 

Vergiss den Mist mit "port freigeben" also gleich wieder. Ausgehende Verbindungen müssen (in der allerallerallermeisten Fällen) nicht  "geforwardet" werden. Oder hast du etwa ein Portforwarindg für Port 80 dieser Webseite einrichten müssen? Nein? Siehst du. Geht doch.

Was anderes ist es am Server. Dieser bietet einen "Dienst" auf einem dafür vorgesehenen Port an. Sitzt der Server hinter einem Router hat das eingehende Paket ja keinen Schimmer, welche der wohlmöglich privaten IP-Adressen hinter dem Router jetzt zum passenden Server führt. HIER braucht man dann das Port-Forwarding. Da steht dann im Router sinngemäß "Wenn eine Anfrage für Port XYZ eingeht, dann leite ich die Daten an Rechner ABC hinter mir weiter".

Weitere Infos liefert google unter dem Begriff "Portforwarding".

- Alex


----------



## DamienX (6. Jun 2008)

In Alexs Post war eigentlich schon alles drin was du wissen musst. 

Aber zu deiner Anmerkung zu UDP:

UDP ist ein Verbindungsloses Übertragungsprotokoll...
im großen und ganzen kannst du dir vorstellen dass du über einen Port einfach ohne
Rücksicht auf verluste Daten raushaust. Ob diese dann ankommen oder nicht
bzw. wie juckt UDP standardmäßig einfach nicht. 

Das was du vermutlich meinstest (Client und Server gleichzeitig) nennt sich Peer to Peer!
Das sind direktverbindungen zwischen 2 Peers (Systemen)!

Hoffe ich hab die da nicht falsch verstanden.

Grüße... der andere Alex  :wink:


----------



## Titanpharao (6. Jun 2008)

ich habe aber ein DSL-Modem, soweit ich weis, hat das keine interne Firewall. Denke eher, ich habe keinen richtigen Server geschrieben   

Bin ganz neu im Netzwerkprogrammieren  :### da hilft auch keine API  :wink: 

Vielleicht siehst du schon erste Anfänger Fehler. Wäre nett, wenn du mal drüberschauen könntest. Der Client ist in einer Oberfläche eingebuden.

Server

```
package chatclient;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.ArrayList;

public class Server {	
	DatagramSocket server;
	byte daten[]=new byte[1024];
	DatagramPacket packet=new DatagramPacket(daten,daten.length);;
	ArrayList<Chatter> chatter=new ArrayList<Chatter>();
	public Server() {
		try {
			server=new DatagramSocket(448);
			handlepacket();
		} catch (Exception e) {}
	}
	
	private void handlepacket(){
		boolean onlytext=false;
			while(true){
				try {	
				onlytext=false;
				packet.setData(new byte[1024]);
				server.receive(packet);//Server erhält ein Paket
				for(int i=0;i<chatter.size();++i){//Server schaut, ob der Benutzer in der Liste ist 
					if(chatter.get(i).getIp().equals(packet.getAddress())){
						sendmessagetoall(i);
						onlytext=true;
						break;					
					}
				}				
				if(onlytext==false){
					System.out.println(toreadString(packet.getData()));
					chatter.add(new Chatter(toreadString(packet.getData()),packet.getAddress()));
				}
				} catch (Exception e) {}
			}						
	}
	
	private void sendmessagetoall(int nr){		
		try {
			for(int i=0;i<chatter.size();++i){
				String tmp=toreadString(packet.getData());
				tmp=chatter.get(nr).getName()+":"+tmp;
				packet.setData(tmp.getBytes());				
				DatagramPacket sendpacket=new DatagramPacket(packet.getData(),packet.getData().length,chatter.get(i).getIp(),80);
				server.send(sendpacket);
			}
		} catch (Exception e) {
			System.out.println(e.getStackTrace());
		}
	}
	
	public String toreadString(byte[] tmp){
		String text="";
		for(int i=0;i<tmp.length;++i){
			if(tmp[i]!=0){
				char x=(char)tmp[i];
				text+=x;						
			}
		}
		return text;
	}
	
	public static void main(String[] args) {
		new Server();
	}
}

class Chatter{
	private String name;
	private InetAddress ip;
	public Chatter(String name, InetAddress ip) {
		this.name = name;
		this.ip = ip;
	}
	public String getName() {
		return name;
	}
	public InetAddress getIp() {
		return ip;
	}	
}
```

Client

```
package chatclient;

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

public class Client {
	DatagramSocket client;
	//DatagramPacket sendpacket;
	DatagramPacket empfpacket;
	byte daten[]=new byte[1024];
	byte daten2[]=new byte[1024];
	InetAddress address;
	private Chatfenster f;
	public Client(String name,String ip,int port,final Chatfenster f) {
		this.f=f;
		try {	
			client= new DatagramSocket(80);
			address=InetAddress.getByName(ip);
			//sendpacket=new DatagramPacket(daten,daten.length,address,port);
			empfpacket=new DatagramPacket(daten2,daten2.length,address,port);
			sendtoserver(name);
			Empfangen empfangen=new Empfangen();
			empfangen.start();
		}
		catch (Exception e) {}
	}
	
	class Empfangen extends Thread {
		@Override
		public void run() {
			while(true){
				try {
					empfpacket.setData(new byte[1024]);
					client.receive(empfpacket);					
					String text="";
					for(int i=0;i<empfpacket.getData().length;++i){
						if(empfpacket.getData()[i]!=0){
							char tmp=(char)empfpacket.getData()[i];
							text+=tmp;
							
						}
					}						
					f.annehmen(text);
				} catch (Exception e) {}
			}
		}
	}
	
	public void sendtoserver(String text){
		DatagramPacket sendpacket=new DatagramPacket(daten,daten.length,address,448);
		sendpacket.setData(text.getBytes());
		//sendpacket.setData(text.getBytes());
		try {
			client.send(sendpacket);			
		} catch (Exception e) {}
	}
}
```

Dankeschön


----------

