etreu Geschrieben 30. Juli 2009 Geschrieben 30. Juli 2009 (bearbeitet) Hallo, bei der Nutzung eines DatagramSockets im Applet, wird die bind() Methode nicht erfolgreich ausgeführt. Bei Verwendung im Appletviewer gibt es keine Probleme. Die Klasse befindet sich in einem signiertem .jar File und zusätzlich sind der .policy Datei die Permission zum Testen auf 'grant all' gesetzt. SocketAddress sa = new InetSocketAddress(this.getPort()); logger.debug(String.format("use isa %s", sa)); tcpChannel = ServerSocketChannel.open(); logger.debug("tcp channel opened"); udpChannel = DatagramChannel.open(); logger.debug("udp channel opened"); // make sure the channels use the same port if (port == 0) { sa = udpChannel.socket().getLocalSocketAddress(); } tcpChannel.socket().bind(sa); logger.debug("tcp channel bound to " + tcpChannel.socket().getLocalSocketAddress()); Die Ausgabe (des Logs) sieht in etwa so aus: [Thread-4] DEBUG - use isa 0.0.0.0/0.0.0.0:0 [Thread-4]DEBUG - tcp channel opened [Thread-4]DEBUG - udp channel opened [Thread-4]DEBUG - udp channel bound to (true)0.0.0.0/0.0.0.0:0 [Thread-4]DEBUG - tcp channel bound to /0:0:0:0:0:0:0:0:33898 [Thread-4]INFO - startListen [Thread-4][TCPServer] INFO - Listen at port 33898 [Thread-4][UDPServer] INFO - Listen at port 0 Hat jemand von euch schon mal ähnliche Probleme gehabt, oder ne idee, wie ich dieses beheben kann? Bearbeitet 30. Juli 2009 von etreu code formatierung Zitieren
flashpixx Geschrieben 30. Juli 2009 Geschrieben 30. Juli 2009 Binde bitte mal an ein passendes Interface. Klappt es dann bzw was sagt dann das Log Phil Zitieren
etreu Geschrieben 30. Juli 2009 Autor Geschrieben 30. Juli 2009 Binde bitte mal an ein passendes Interface. Das führt zu keinen Änderungen ich habe als InetAddress jetzt die IP des Devices genommen, über dass das Internet angesprochen wird. Ergebnis: keine Änderungen in der Ausgabe, außer dass beim TCP-Server jetzt die gegebene IP steht. Zitieren
flashpixx Geschrieben 30. Juli 2009 Geschrieben 30. Juli 2009 Kannst Du ggf mal die kompletten Klassen posten, dann schau ich mir die mal an und teste die bei mir Phil Zitieren
etreu Geschrieben 30. Juli 2009 Autor Geschrieben 30. Juli 2009 Welche Klassen willst/ brauchst du? Nur die Serverkomponenten oder alles? Zitieren
flashpixx Geschrieben 30. Juli 2009 Geschrieben 30. Juli 2009 Welche Klassen willst/ brauchst du? Nur die Serverkomponenten oder alles? Im Grunde nur den Teil, wo Du die Sockets erzeugst. Ne "Testklasse" schreib ich mir dann fix selbst Phil Zitieren
etreu Geschrieben 31. Juli 2009 Autor Geschrieben 31. Juli 2009 (bearbeitet) Wenn das so ist, dann reicht der Code, den ich oben bereits gepostet habe. Dieser wird im Konstruktor aufgerufen. Als Parameter wird der Port übergeben - und fertig. Die restliche Logik arbeitet dann mit den Sockets bzw. Channels weiter. class Server { Logger logger = Logger.getLogger(Server.class); ServerSocketChannel tcpChannel; DatagramChannel udpChannel; public Server(int port) { SocketAddress sa = new InetSocketAddress(port); logger.debug(String.format("use isa %s", sa)); tcpChannel = ServerSocketChannel.open(); logger.debug("tcp channel opened"); udpChannel = DatagramChannel.open(); logger.debug("udp channel opened"); // make sure the channels use the same port if (port == 0) { sa = udpChannel.socket().getLocalSocketAddress(); } tcpChannel.socket().bind(sa); logger.debug("tcp channel bound to " + tcpChannel.socket ().getLocalSocketAddress()); } } Falls es dich interessiert, verwende ich die Klasse Server nicht direkt, sondern eine Abgeleitete. Bearbeitet 31. Juli 2009 von etreu vergessen das code-tag zu schliessen Zitieren
flashpixx Geschrieben 31. Juli 2009 Geschrieben 31. Juli 2009 Falls es dich interessiert, verwende ich die Klasse Server nicht direkt, sondern eine Abgeleitete. Ich schaue es mir an, kann aber bis morgen dauern Phil Zitieren
flashpixx Geschrieben 2. August 2009 Geschrieben 2. August 2009 Deine Klasse lässt sich nicht so kompilieren. Es fehlen sämtliche import Anweisungen. Selbst wenn ich diese einfügen, dann stimmen die Aufrufe nicht. Bitte poste eine kompilierbare Klasse Phil Zitieren
etreu Geschrieben 4. August 2009 Autor Geschrieben 4. August 2009 Ich hatte mir den try-Block gespart. Kommt nicht wieder vor ;-) import java.io.IOException; import java.net.InetSocketAddress; import java.net.SocketAddress; import java.nio.channels.DatagramChannel; import java.nio.channels.ServerSocketChannel; import org.apache.log4j.Logger; class Server { Logger logger = Logger.getLogger(Server.class); ServerSocketChannel tcpChannel; DatagramChannel udpChannel; public Server(final int port) { SocketAddress sa = new InetSocketAddress(port); logger.debug(String.format("use isa %s", sa)); try { tcpChannel = ServerSocketChannel.open(); logger.debug("tcp channel opened"); udpChannel = DatagramChannel.open(); logger.debug("udp channel opened"); // make sure the channels use the // same port if (port == 0) { sa = udpChannel.socket().getLocalSocketAddress(); } tcpChannel.socket().bind(sa); logger.debug("tcp channel bound to " + tcpChannel.socket().getLocalSocketAddress()); } catch (final IOException e) { e.printStackTrace(); } } } Zitieren
flashpixx Geschrieben 4. August 2009 Geschrieben 4. August 2009 bei der Nutzung eines DatagramSockets im Applet, wird die bind() Methode nicht erfolgreich ausgeführt. Bei Verwendung im Appletviewer gibt es keine Probleme. Nein, Du benutzt Channels und keine Sockets: ServerSocketChannel tcpChannel; DatagramChannel udpChannel; [...] tcpChannel = ServerSocketChannel.open(); udpChannel = DatagramChannel.open(); siehe dazu: A selectable channel for stream-oriented listening sockets. Server-socket channels are not a complete abstraction of listening network sockets. Binding and the manipulation of socket options must be done through an associated ServerSocket object obtained by invoking the socket method ServerSocketChannel (Java 2 Platform SE v1.4.2) Was willst Du letztendlich machen mit Channels arbeiten oder mit einem TCP / UDP Socket (siehe DatagramSocket (Java 2 Platform SE v1.4.2) bzw ServerSocket (Java 2 Platform SE v1.4.2) / Socket (Java 2 Platform SE v1.4.2)) ? Phil Zitieren
etreu Geschrieben 5. August 2009 Autor Geschrieben 5. August 2009 Nein, Du benutzt Channels und keine Sockets: ServerSocketChannel tcpChannel; DatagramChannel udpChannel; [...] tcpChannel = ServerSocketChannel.open(); udpChannel = DatagramChannel.open(); Die bind()-Methode muss aber auf dem Socket ausgeführt werden. Was willst Du letztendlich machen mit Channels arbeiten oder mit einem TCP / UDP Socket [...] ? Ich muss lokal den bzw. einen Port binden. Danach verwende ich ausschliesslich die Channel-API. A server-socket channel is created by invoking the open method of this class. A newly-created server-socket channel is open but not yet bound. An attempt to invoke the accept method of an unbound server-socket channel will cause a NotYetBoundException to be thrown. A server-socket channel can be bound by invoking one of the bind methods of an associated server socket. Mein Problem ist dass es als Anwendung und im Appletviewer funktioniert und eben als Applet in der HTML-Seite nicht mehr. Zitieren
flashpixx Geschrieben 5. August 2009 Geschrieben 5. August 2009 Mein Problem ist dass es als Anwendung und im Appletviewer funktioniert und eben als Applet in der HTML-Seite nicht mehr. Ich habe Deine Klasse mal getestet, bei mir wird der Socket nicht gebunden: tcp channel opened udp channel opened tcp channel bound to /0.0.0.0:1233 erscheint, aber weder ein "netstat -a" noch ein "lsof" zeigen eine verwendeten Socket Phil Zitieren
etreu Geschrieben 6. August 2009 Autor Geschrieben 6. August 2009 Ich habe Deine Klasse mal getestet, bei mir wird der Socket nicht gebunden: tcp channel opened udp channel opened tcp channel bound to /0.0.0.0:1233 erscheint, aber weder ein "netstat -a" noch ein "lsof" zeigen eine verwendeten Socket Phil Als Applet oder Anwendung? Zitieren
flashpixx Geschrieben 6. August 2009 Geschrieben 6. August 2009 Als Applet oder Anwendung? Als Anwendung und testweise sogar mit root-Rechten Phil Zitieren
etreu Geschrieben 24. September 2009 Autor Geschrieben 24. September 2009 Es hat sich in der Zwischenzeit rausgestellt, dass es sich um einen Seiteneffekt gehandelt hat. Es gab eine Exception die dazu geführt hat, dass das Problem auftrat. Ich kann leider aktuell nicht mehr sagen, welche Exception Schuld daran war. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.