Android DatagramSocket Fehlermeldung: EADDRINUSE (Address already in use)
Ich versuche zu schreiben ein einfaches android-chat-app. Habe ich eine service-Klasse, die kümmert sich um alle Netzwerk-Kommunikation. Das DatagramSocket-Objekt-Bindung in einem separaten thread. Einmal, während ich immer diese Fehlermeldung und die app stürzt ab:
java.net.BindException: bind failed: EADDRINUSE (Address already in use)
at libcore.io.IoBridge.bind(IoBridge.java:89)
at java.net.PlainDatagramSocketImpl.bind(PlainDatagramSocketImpl.java:68)
at java.net.DatagramSocket.createSocket(DatagramSocket.java:133)
at java.net.DatagramSocket.<init>(DatagramSocket.java:78)
- und dies ist der code, die prodruces. Die Fehler treten auf der Linie mit new DatagramSocket Wie kann ich diesen Fehler vermeiden? Danke.
private class ComThread extends Thread {
private static final int BCAST_PORT = 8779;
DatagramSocket mSocket;
InetAddress myBcastIP, myLocalIP;
public ComThread() {
try {
myBcastIP = getBroadcastAddress();
if (D)
Log.d(TAG, "my bcast ip : " + myBcastIP);
myLocalIP = getLocalAddress();
if (D)
Log.d(TAG, "my local ip : " + myLocalIP);
if (mSocket == null) {
mSocket = new DatagramSocket(BCAST_PORT);
mSocket.setReuseAddress(true);
mSocket.setBroadcast(true);
}
} catch (IOException e) {
Log.e(TAG, "Could not make socket", e);
}
}
InformationsquelleAutor Sean Kilb | 2012-11-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie
SO_REUSEADDR
vor der Bindung. Nicht angeben-port in den Konstruktor zu erstellen ungebundenen-socket statt mitDatagramSocket(null)
, legen Sie dann Optionen, dannbind()
ausdrücklich.wenn (mSocket == null) { mSocket.setReuseAddress(true); mSocket = new DatagramSocket(); mSocket.connect(myLocalIP, BCAST_PORT); mSocket.setBroadcast(true); }
die Schritte, die ich beschrieben ziemlich einfach ("Optionen" meine ich
setReuseAddress
undsetBroadcast
nennt); und sorry, ich mache das nicht " Ihr Code für Sie.Der code oben ist der Absturz der app.
mSocket = new DatagramSocket(null); SocketAddress socketAddr=new InetSocketAddress(BCAST_PORT); mSocket.setReuseAddress(true); mSocket.setBroadcast(true); mSocket.bind(socketAddr);
InformationsquelleAutor Nikolai Fetissov
Seit Sean fragte nach dem code, den ich übersetzt habe, Nikola Antwort auf die folgende code, der ähnlich ist zu dem, was ich in meiner app, falls es hilfreich ist:
Ich bin mir nicht sicher, aber ich bezweifle, dass der port freigegeben werden kann.
InformationsquelleAutor Hong
Ein weiterer Grund, die ich konfrontiert,
In Fall, dass Sie Zugriff auf eine Methode, die mit Ihrem sockel aus einem externen thread, Sie haben zu stellen Sie sicher, dass der thread nicht den Zugriff auf die Methode mehr als einmal in der gleichen Zeit(oder in anderen Worten werden nicht schaffen die Buchse mehr als ein mal), und trotz das senden und empfangen von Methoden der DatagramSocket sind threadsicher, den Bau der
DatagramSocket
Objekt nicht, so müssen Sie nur das synchronisieren der Methode, ist in der Lage dieDatagramSocket
sockel:InformationsquelleAutor Muhammed Refaat