EADDRINUSE(地址已在使用中)问题的可能解决方案

时间:2016-07-28 07:51:09

标签: android sockets serversocket wifi-direct wifip2p

我已经设置了wifi直接用于两个Android设备中两个应用程序之间的通信。当两个应用程序中只有一个活动时,此工作正常。当我尝试从任何应用程序的第二个活动建立连接时,我收到Socket EADDRINUSE(地址已在使用中)错误。当我关闭应用程序并再次启动它时,也会发生此错误。但是当我在杀死之前打开的应用程序后启动应用程序时它会起作用。

我尝试过socket.setReuseAddress(true),但仍然出现错误。

业主方:

ServerSocket socket = null;
    private final int THREAD_COUNT = 10;
    private Handler handler;

    private final ThreadPoolExecutor pool = new ThreadPoolExecutor(
            THREAD_COUNT, THREAD_COUNT, 10, TimeUnit.SECONDS,
            new LinkedBlockingQueue<Runnable>());

    public OwnerSocketHandler(Handler handler) throws IOException {
        try {
            socket = new ServerSocket();
            socket.setReuseAddress(true);
            socket.bind(new InetSocketAddress(Settings.SERVER_PORT));
            this.handler = handler;
        } catch (IOException e) {
            e.printStackTrace();
            pool.shutdownNow();
            throw e;
        }
    }

    @Override
    public void run() {
        while (true) {
            try {
                pool.execute(new SocketStream(socket.accept(), handler));
            } catch (IOException e) {
                try {
                    Log.i(TAG, "socket close");
                    if (socket != null && !socket.isClosed())
                        socket.close();
                } catch (IOException ioe) {
                }
                e.printStackTrace();
                pool.shutdownNow();
                break;
            }
        }
    }

会员方:

   @Override
    public void run() {
        Socket socket = new Socket();
        try {
            socket.bind(null);
            socket.connect(new InetSocketAddress(address.getHostAddress(), Settings.SERVER_PORT), Settings.TIME_OUT);
            socketCreator = new SocketCreator(socket, handler);
            new Thread(socketCreator).start();
        } catch (IOException e) {
            e.printStackTrace();
            try {
                socket.close();
            } catch (IOException e1) {
                e1.printStackTrace();
            }
            return;
        }
    }

在SocketStream类中,我使用输出和输入流写入/读取数据。

在上述情况下,我该怎么做才能克服这个错误?是否有任何演示,其中多个活动直接使用wifi进行通信?

0 个答案:

没有答案