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
Server
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.
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
Java:
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
Java:
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.