# anderer Rechner wird nicht gefunden



## Seppel (26. Apr 2012)

Sollte mein Problem schon irgend wo da sein versuche ich mich gern mit einem Link, ansonsten:

Habe mir hoffentlich alle nötigen Fertigkeiten angeignet um im netzwerk (lan) datenauszutauschen.
Habe im Netz ein sehr guten Beispiel gefunden um zwischen clients Nachrichten auszutauschen.
Nach dem ich auf meinem 1. rechner den Server gestartet habe, kann ich dort auch belibeige clients starten und diese können miteinander komunizieren. Mein zweiter Rechner steht daneben und alle Clients die ich von dort starte finden den erste Rechner nicht. Über die Konsole habe ich mal hin und her gepingt und der jeweilig andere Rechner wird auch angezeigt. Die Firewall meiner rechner sind down. 

Jetzt weis ich den Grund für das Problem nicht. 
Könnte es am Router liegen das es nicht funktioniert?
Ist mein code nicht geeigent?
...
Client

```
import java.net.*;
import java.io.*;
import java.net.DatagramPacket;
import java.net.InetAddress;

public class Client {
	static final String ANMELDUNG = "ANMELDUNG";
	static final String ENDE = "ENDE";
	static int port = 1234;
	static int length = 256; // Länge eines Pakets
	
	public static void main( String args[]) {
		String servername = "localhost";
		String text = null;
		DatagramPacket packet;
		byte[] ba = ANMELDUNG.getBytes();
		
		// Namen des Servers von Kommandozeile übernehmen
		if( args.length > 0 ) servername = args[0];
		
		
		try {
			DatagramSocket socket = new DatagramSocket();
			InetAddress ia = InetAddress.getByName( servername );
			System.out.println(ia);
			//ia =InetAddress.getByName("192.168.2.104");
			System.out.println(ia);
			packet = new DatagramPacket( ba, ba.length, ia, port);
			// sende Anmeldung
			socket.send( packet );
			
			// Lesen der empfangenen Pakete erfolgt in eigenem Thread
			LeseThread lt = new LeseThread( socket );
			
			// Eingaben von Tastatur an Server schicken
			BufferedReader br = new BufferedReader(new InputStreamReader( System.in ) );
			do {
				text = br.readLine();
				ba = text.getBytes();
				packet.setData( ba, 0, ba.length );
				socket.send( packet );
			} while( ! text.equals("ENDE") );
			
			// alles beenden
			System.exit(0);		
		}
		catch( IOException e ) {System.err.println("Ausnahmefehler: " + e );}
	}
}



class LeseThread implements Runnable {
	static int length = 256;
	DatagramSocket socket;

	LeseThread(DatagramSocket socket ) {
		this.socket = socket;
		Thread t = new Thread(this,"Lesen");
		t.start();
	}

	public void run() {
		DatagramPacket packet =
		new DatagramPacket( new byte[length], length);
		while( true ) {
			try {
				socket.receive( packet );
				InetSocketAddress add = (InetSocketAddress)packet.getSocketAddress();
				String text = new String(packet.getData(), 0, packet.getLength());
				System.out.println( add +">" + text);
				//System.out.println( ">" + text);
			}
			catch( IOException e ) {System.err.println("Ausnahmefehler: " + e );}
		}
	}
}
```

Server

```
import java.net.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import java.awt.*;
import javax.swing.JFrame;
import javax.swing.*;

//Programm
public class DatagrammServer extends JFrame {
	private static final long serialVersionUID = 1L;	
	//Variablen####################################################################################################################### 
	// Kennungen für An- und Abmeldung
	static final String ANMELDUNG ="ANMELDUNG";
	static final String ENDE ="ENDE";
	static int port = 1234;
	static int length = 256; // Länge eines Pakets
	static boolean ende = false;
	
	//fenster
	static DatagrammServer fenster;
	static CMeinePanel m_malfläche;  		
	
	//Main#######################################################################################################################
		//main Funktion ruft das Fenster auf und startet damit das spiel
	public static void main(String[] args) {
			 fenster = new DatagrammServer("Fenster");
			 fenster.pack();
			 fenster.setSize(100,100);	
			 fenster.setVisible(true);
			 

				DatagramPacket paket =new DatagramPacket( new byte[length], length);
				Vector clients = new Vector(); // Liste der Clients
				
				try {
					DatagramSocket socket = new DatagramSocket(port);		
					
					do {		
						// Warten auf nächstes Paket
						socket.receive( paket );
						InetSocketAddress add = (InetSocketAddress)paket.getSocketAddress();
						
						// Text aus Paket extrahieren
						String text = new String(paket.getData(), 0, paket.getLength());
						InetAddress address = paket.getAddress();
						int port = paket.getPort();
						int len = paket.getLength();

						System.out.println("Anfrage von " + address + " vom Port "	+ port + " Laenge " + len + "\n");						
						System.out.println( add +">" + text);
						
						// Paket auswerten
						if( text.equals( ANMELDUNG ) ) {
							clients.add( add );
							System.out.println( "Anzahl Clients: " + clients.size() );
						} else if( text.equals( ENDE ) ){
							clients.remove( add );
							System.out.println( "Anzahl Clients: " + clients.size() );
						} else {
							// Versenden von Kopien an alle anderen Clients
							for( int i=0; i<clients.size(); i++ ) {
								InetSocketAddress dest = (InetSocketAddress) clients.get(i);
								if( ! dest.equals( add ) ) {
									paket.setSocketAddress( dest );
									socket.send( paket );
									System.out.println( "Kopie an " + dest );
								}
							}
						}
					} while(ende==false );
					System.exit(0);
				}
				catch( IOException e ) {System.err.println( "Ausnahmefehler: " + e );}
				
		}
	//Funktionen und Klassen#######################################################################################################################
	DatagrammServer(String titel) {
		super(titel);
		class CMeinTastaturAdapter implements KeyListener {
			public void keyPressed(KeyEvent e){System.out.println(e.getKeyCode()+"'"+ KeyEvent.VK_CONTROL);if(e.getKeyCode() == KeyEvent.VK_CONTROL){ende=true;} 			}
			public void keyReleased(KeyEvent e){}
			public void keyTyped(KeyEvent arg0) {}			
		}
		addKeyListener(new CMeinTastaturAdapter());
		System.out.println("Start");
		setLayout(new BorderLayout());
		m_malfläche = new CMeinePanel();	
		add(m_malfläche);				
		setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
		setUndecorated(true);	
	}
	
	
	class CMeinePanel extends JPanel {
		public void paintComponent(Graphics g) { }   
		public Dimension getMinimumSize() {return new Dimension(300,300);}
		public Dimension getPreferredSize() {return getMinimumSize();}
	}  
}
```

Bin mir nicht sicher ob ich die richtige Methode nutze, die Geister spalten sich ja zum teil ziemlich was man alles machen kann und was nicht.


----------



## Volvagia (29. Apr 2012)

```
String servername = "localhost";
```

Falls das nicht das Problem ist, UDP ist im Vergleich zu TCP unzuverlässig (Keine Verbindung, keine integrierte Empfangsbestätigung für Pakete, keine Sequenznummer usw.) Soll nichts gegen UDP sein, das Fehlen gleicht sich durch Geschwindigkeit aus.

Warum versuchst du es nicht testweiße mit einer TCP-Verbindung? (ServerSocket und Socket)
Wenn du da keine Verbindung aufbauen kannst blockiert sie irgendwas. Musst ja nicht deine Programme umschreiben, zwei kleine, geschätzt 5 Zeilen lange Programmstücke (mit throws über die Main) um miteinander zu verbinden sollte reichen.


----------



## irgendjemand (29. Apr 2012)

man könnte es auch wie folgt machen

1) UDP-MultiCast
dabei sendet der client ein multicast-packet und laufende server antworten darauf ... wie man nun entscheidet zu welchem server man sich verbindet wenn man mehr als einen findet ist dir überlassen

2) lobby
du richtest einen festen "lobby-server" ein dessen adresse sich nicht ändert ...
wenn nun ein "server" gestartet wird meldet dieser sich beim lobby-server ...
ein client fragt nun erst beim lobby-server nach laufenden servern und kann dann nach erhalt der liste entscheiden ..


ich weis ... das klingt jetzt viel nach "zocker-suchti" ... aber das sind zwei einfache möglichkeiten wie ein client auf einem rechner einen server auf einem anderen rechner finden kann ...
man muss das rad ja nich immer neu erfinden


----------



## Seppel (1. Mai 2012)

danke für eure Antworten. 
Ein Kumpel der ein Java Chatprogramm geschrieben hat, hat sich mal an meinem probiert und den Fehler gesucht. Er meite auch ich soll mal TCP probieren, konnte aber den Fehler noch nicht finden.

Werde mich mal dort versuchen.
Meld mich wenn ich soweit bin

mfg


----------



## Seppel (3. Mai 2012)

Also, habe versucht das ganze umzuschreiben, aber irgend wo war dann doch ein Fehler den ich nicht finden konnte. Habe deshalb (find ig selber schwach) damit es schnell geht copy und paste angewendet und den Server und den client von dieser Siete genommen:
Java Standard: Socket ServerSocket (java.net) UDP und TCP IP ? Wikibooks, Sammlung freier Lehr-, Sach- und Fachbücher

Ich habe beim Client die IP von dem 1. rechner eingegeben und beim zweiten gestartet, nach dem der server auf dem ersten bereits lief. Und wieder Timeout beim verbinden.

Auf einem und dem selben Rechner ging es. Also an was könnte es liegen?
Virenschutzprogramm auf beiden rechner waren down.

Wo könnte jetzt das Problem liegen?


----------



## irgendjemand (3. Mai 2012)

hmm ... kann ich mir erlich gesagt eher weniger erklären ... hatte noch nie probleme damit eigene server/client programme sogar übers internet zum laufen zu bekommen *hab sogar schon erfolgreich UDP Hole Punching implementiert* ...
würde sagen das es noch andere netz-spezifische probleme gibt ..

btw : ein "AntiVirus" hat NICHTS mit netzwerktraffic zu tun ... dafür ist eine sog. "FireWall" zuständig ... ggf diese mal runterfahren ...


----------



## Volvagia (3. Mai 2012)

Bin der selben Meinung, Windows-Firewall nicht vergessen. Die blockt gerne, vor allem bei unterschiedlichen Windows-Versionen. Falls er allgemein nicht durchkommt, z. B. falsche IP oder Server offline fliegt dir eine "Connection refused: Connect"-SocketException und kein Timeout. (Java 6)

btw. Client: new Socket(host, port), Server: ss = new ServerSocket(port);, Schleife, ss.accept(), Ausgabe über Clientenverbindung. Da musst du keinen Kilometerlangen Source kopieren. ^^


----------



## Seppel (3. Mai 2012)

antiviren programm ist die Firewall zugleich...
windows firewall könnte bei dem einen rechner wirklich noch on sein muss ich mal morgen noch mal testen

timeout weil er ja automatisch nach einer weile aufhört wenn er keine Verbindung zustande bekommt


----------



## irgendjemand (4. Mai 2012)

gut ... dann nennt man sowas in der regel "security suite" oder ähnlich ... aber wenn du hier nur das wort "AntiVirus" in den raum wirfst woher sollen wir dann wissen das du damit ein komplexes produkt mit FireWall meinst ?

das ist so ein bisschen wie "ich werf mal ne bock wust in ne halle" ... dann weis auch keiner ob die wurst schon im brot liegt oder noch nich ...

back to topic

win-firewall wird in der regel von solchen produkten beim setup stillgelegt ... ein deaktivieren der software-firewall hat in der regel nicht zur folge das dadurch die win-firewall wieder anspringen würde ... das wird meist erst bei der deinstallation wieder "gerade gebogen" ...

auch gibt es unterschiede zwischen "er kann nicht verbinden und hört irgendwann auf es zu versuchen" und einem "timeout"

genauer stacktrace wäre mal hilfreich ...


----------



## Seppel (4. Mai 2012)

> gut ... dann nennt man sowas in der regel "security suite" oder ähnlich ... aber wenn du hier nur das wort "AntiVirus" in den raum wirfst woher sollen wir dann wissen das du damit ein komplexes produkt mit FireWall meinst ?
> 
> das ist so ein bisschen wie "ich werf mal ne bock wust in ne halle" ... dann weis auch keiner ob die wurst schon im brot liegt oder noch nich ...



pardon darüber hatt ich ne nachgedacht



> win-firewall wird in der regel von solchen produkten beim setup stillgelegt ... ein deaktivieren der software-firewall hat in der regel nicht zur folge das dadurch die win-firewall wieder anspringen würde ... das wird meist erst bei der deinstallation wieder "gerade gebogen" ...



habe noch mal nachgeschaut bei meinem zweiten Rechner ist diese auch win-firewall down. In der Regel hast du recht, wollte mal auf nummer sicher gehen


```
java.net.ConnectException: Connection timed out: connect
	at java.net.DualStackPlainSocketImpl.connect0(Native Method)
	at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
	at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
	at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
	at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
	at java.net.PlainSocketImpl.connect(Unknown Source)
	at java.net.SocksSocketImpl.connect(Unknown Source)
	at java.net.Socket.connect(Unknown Source)
	at java.net.Socket.connect(Unknown Source)
	at java.net.Socket.<init>(Unknown Source)
	at java.net.Socket.<init>(Unknown Source)
	at Client.test(Client.java:16)
	at Client.main(Client.java:8)
```


----------



## irgendjemand (5. Mai 2012)

hmm ... dem stack nach zu urteilen würde ich sogar behaupten das es nicht daran liegt das du auf deinem ziel-rechner nicht "reinkommst" ... sondern von deinem quell-rechner aus gar nicht "rauskommst" ... also das java scheinbar nicht die rechte hat überhaupt eine verbindung nach außen aufzubauen ...

denn wenn du beim ziel-rechner nicht "reinkommen" würdest ... müsste eigentlich ein "Connection refused" fliegen ... da aber "timed out" kommt liegt es nahe das der stream überhaupt nicht bis zur *deaktivierten* firewall des hosts durchkommt ...

da wird es dir auch nicht helfen wenn ich dir jetzt ein einfaches sample poste ... da es halt das selbe problem wäre ...


btw : habe den verlinkten code mal gecheckt ... bei mir funktioniert es ... und das sogar über 3 router mit hardware-firewall *entsprechenden port halt geöffnet* und auf beiden systemen mit aktiver software-firewall ... biede mit Java7update4 ...
am code liegts also nich ...


ist halt immer schwer bei sowas "remote" zu helfen wenn man den genauen aufbau des netzes und der systeme nich kennt ... da kann man nur raten und hoffentlich helfende posts abgeben ... aber wenns nicht funktioniert dann gehts halt nich ... da können wir noch so "tipps geben" ... wenn sich dein netz weigert können wir da ja leider auch nichts machen


----------



## Seppel (5. Mai 2012)

du schriebst java hat keien Rechte, gibt es ne möglichkeit diese zu geben?

ich denke mal es liegt am Router, mit dieser Easyox von Vodafon haben wir schon genug ärger.
Oder kann es auch am Client-PC liegen?

Wie kann es sein das Netzwerkspiele funktioniern, aber soetwas geblockt wird?


----------



## steffomio (11. Mai 2012)

UDP sollte man nur nehmen, wenn es egal ist, ob die Daten fehlerhaft oder gar nicht ankommen. Wie z.B. bei Musik und Video Streams. Vorrausgesetzt, dass der Empfänger mit Datenmüll entsprechend umgehen kann.

Also UDP ist pur auf Quantität ausgelegt. Qualität ist da egal.


----------



## steffomio (11. Mai 2012)

Firewall abgestellt oder Port frei geschaltet?

Ansonsten Profi-Werkzeug benutzen:
Apache MINA - Welcome to Apache MINA Project!


----------



## irgendjemand (11. Mai 2012)

@steffomio
1) es gibt einen EDIT-button ... und dieser funktioniert auch noch 7 minuten nach dem posten ...

2) hör bitte auf die threads hier mit "apache mina" zu spammen ... es mag sein das es gewisse anwendungsfälle dafür gibt ... es ist aber kein all-heil-mittel

3) das man UDP nur verwenden sollte wenn es egal ist ob die daten ankommen und wenn ja in welcher reihenfolge hatte wurde bereits genannt ...


----------



## Seppel (12. Mai 2012)

Also ich werde noch mal das Programm in einem anderen Netzwerk testen, da unser Gatway bzw Router ne schwere Macke hat.
Zu meinem letzten Post, jemand ne Idee?


----------



## steffomio (12. Mai 2012)

Connection timed out heißt eigentlich, dass der Rechner nicht gefunden wurde. Sei es dass der Hostname nicht stimmt oder der Port blockiert wird.

Kannst du den Rechner denn anpingen oder sonstwie erreichen über das Windows Netzwerk?

Ich hatte auch mal einen alten Router vor der Nase, der die Rechnernamen nur nach Lust und Laune aufgelöst hat. Im Zweifelsfall hat dann nur noch die IP des Rechners funktioniert. Sowas wie \\der-recher ging bei "Schlechtwetter" oft nicht.


----------



## Seppel (15. Mai 2012)

also irgend wi eist mein letzte post weg...

anpingen geht und ich habe die ip genutzt

string ip="......";
java.net.Socket socket=new java.net.Socket(ip,port);

(Nur abgetippt)

Ich habe es mal im Uni Netz getestet und es geht, werde mal mir einen neuen WLan Stick kaufen, da der scheinbar störungen hat, aber an dem wirds woll ne liegen. Jetzt kann es eigentlich nur noch and der Firewall des router liegen, oder gibt e noch andere Ideen?


----------



## steffomio (15. Mai 2012)

Beim Router, der direkt am WWW sitzt würde ich die Firewall anlassen. Beim inneren Router aus machen. Überhaupt, wenn nur die Family dran sitzt, alle lan Firewalls off. Stört nur.
Zum testen kann man ja mal was zuschalten, wenn das gemecker der anderen nicht zu groß ist.


----------



## Seppel (15. Mai 2012)

habe nur einen Router
und selber zwei rechner, so das die anderen ne stören...


----------



## Seppel (12. Jul 2012)

Problem konnte zwar nicht behoben aber umgangen werden.

Die Ip über ein VLan funktioniert.


----------

