Veröffentlicht 30. Juli 200916 j 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 200916 j von etreu code formatierung
30. Juli 200916 j Binde bitte mal an ein passendes Interface. Klappt es dann bzw was sagt dann das Log Phil
30. Juli 200916 j Autor 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.
30. Juli 200916 j Kannst Du ggf mal die kompletten Klassen posten, dann schau ich mir die mal an und teste die bei mir Phil
30. Juli 200916 j 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
31. Juli 200916 j Autor 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 200916 j von etreu vergessen das code-tag zu schliessen
31. Juli 200916 j 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
2. August 200916 j 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
4. August 200916 j Autor 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(); } } }
4. August 200916 j 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
5. August 200916 j Autor 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.
5. August 200916 j 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
6. August 200916 j Autor 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?
6. August 200916 j Als Applet oder Anwendung? Als Anwendung und testweise sogar mit root-Rechten Phil
24. September 200915 j Autor 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.
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.