Sea*_*ilb 20 sockets networking android chat
我正在尝试编写一个简单的Android聊天应用程序.我创建了一个处理所有网络通信的服务类.DatagramSocket绑定在一个单独的线程中.一旦进入,我收到此错误并且应用程序崩溃:
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)
Run Code Online (Sandbox Code Playgroud)
这是推测它的代码.使用新DatagramSocket的行发生错误如何避免此错误?谢谢.
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);
}
}
Run Code Online (Sandbox Code Playgroud)
Hon*_*ong 30
由于肖恩要求代码,我已经将Nikola的答案翻译成以下代码,这与我在我的应用程序中使用的代码类似,以防它有用:
if (mSocket == null) {
mSocket = new DatagramSocket(null);
mSocket.setReuseAddress(true);
mSocket.setBroadcast(true);
mSocket.bind(new InetSocketAddress(BCAST_PORT));
}
Run Code Online (Sandbox Code Playgroud)
Nik*_*sov 17
你需要SO_REUSEADDR在绑定之前设置.不要在构造函数中指定port - 创建未绑定的套接字DatagramSocket(null),然后使用,然后设置选项,然后bind()显式.