Zum Inhalt springen

Problem Datagram Socket in Applet


Empfohlene Beiträge

Geschrieben (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 von etreu
code formatierung
Geschrieben
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.

Geschrieben (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 von etreu
vergessen das code-tag zu schliessen
Geschrieben

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();

		}


	}

}

Geschrieben

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

Geschrieben
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.

Geschrieben

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

Geschrieben
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?

  • 1 Monat später...
Geschrieben

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.

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...