Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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

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

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

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

		}


	}

}

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

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

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

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

  • 1 Monat später...
  • 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.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.