首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Android DatagramSocket错误信息: EADDRINUSE (地址已被占用)

Android DatagramSocket错误信息: EADDRINUSE (地址已被占用)
EN

Stack Overflow用户
提问于 2012-11-26 23:36:00
回答 3查看 23K关注 0票数 21

我正在尝试写一个简单的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)

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

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-11-27 00:16:44

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

票数 18
EN

Stack Overflow用户

发布于 2013-02-22 22:44:41

自从Sean索要代码后,我已经将Nikola的答案翻译成了以下代码,这与我在应用程序中使用的代码类似,以防有用:

if (mSocket == null) {
    mSocket = new DatagramSocket(null);
    mSocket.setReuseAddress(true);
    mSocket.setBroadcast(true);
    mSocket.bind(new InetSocketAddress(BCAST_PORT));
}
票数 31
EN

Stack Overflow用户

发布于 2016-03-06 19:57:00

我面对的另一个原因,

如果您从外部线程访问使用套接字的方法,则必须确保该线程不会在同一时间多次访问该方法(换句话说,不会多次创建套接字),并且尽管使用the send and receive methods of the DatagramSocket are threadsafeDatagramSocket对象的构造却不会,因此您只需同步能够创建DatagramSocket套接字的方法:

synchronized public void my_datagram_socket() throws Exception{

  // create the socket
  // operations through the socket
  // whatever you want

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13568066

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档