我正在尝试编写一个简单的android聊天应用程序。我创建了一个处理所有网络通信的服务类。 DatagramSocket绑定(bind)在单独的线程中。一次,当我收到此错误,应用程序崩溃时:

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)

这就是产生它的代码。该错误发生在与一起的新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);
            }
        }

最佳答案

绑定(bind)之前需要设置SO_REUSEADDR。不要在构造函数中指定端口-而是使用 DatagramSocket(null) 创建未绑定(bind)的套接字,然后设置选项,然后显式创建 bind()

10-08 03:14