我想编写一个简单的机器人聊天应用程序。我创建了负责处理所有的网络通信服务类。 DatagramSocket的结合是在一个单独的线程。一旦当我得到这个错误和应用程序崩溃:
java.BindException:绑定失败:EADDRINUSE(地址已在使用) 在libcore.io.IoBridge.bind(IoBridge.java:89) 在java.PlainDatagramSocketImpl.bind(PlainDatagramSocketImpl.java:68) 在java.DatagramSocket.createSocket(DatagramSocket.java:133) 在java.DatagramSocket中的< INIT>(DatagramSocket.java:78)
这是code这prodruces它。在与该行发生错误的新的DatagramSocket 我怎样才能避免这个错误?谢谢你。
私有类ComThread继承Thread { 私有静态最终诠释BCAST_PORT = 8779; DatagramSocket的mSocket; InetAddress类myBcastIP,myLocalIP; 公共ComThread(){ 尝试 { myBcastIP = getBroadcastAddress(); 如果(D)的 Log.d(TAG,我的BCAST IP:+ myBcastIP); myLocalIP = getLocalAddress(); 如果(D)的 Log.d(TAG,我的本地IP:+ myLocalIP); 如果(mSocket == NULL){ mSocket =新的DatagramSocket(BCAST_PORT); mSocket.setReuseAddress(真正的); mSocket.setBroadcast(真正的); } }赶上(IOException异常E){ Log.e(TAG,无法建立套接字,E); } }解决方案
您需要设置 SO_REUSEADDR 才具有约束力。不要指定在构造函数中港 - 创建未绑定的套接字,而不是用DatagramSocket(null),然后设置选项,然后bind()明确。
I am trying to write a simple android chat app. I have created a service class which handles all the networking communication. The DatagramSocket binding is in a separate thread. Once in while I am getting this error and the app crashes:
java.BindException: bind failed: EADDRINUSE (Address already in use) at libcore.io.IoBridge.bind(IoBridge.java:89) at java.PlainDatagramSocketImpl.bind(PlainDatagramSocketImpl.java:68) at java.DatagramSocket.createSocket(DatagramSocket.java:133) at java.DatagramSocket.<init>(DatagramSocket.java:78)and this is the code which prodruces it. The error occur on the line with new DatagramSocket How can I avoid this error? Thank you.
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); } }解决方案
You need to set SO_REUSEADDR before binding. Don't specify port in the constructor - create unbound socket instead with DatagramSocket(null), then set options, then bind() explicitly.
更多推荐
Android的DatagramSocket的错误消息:EADDRINUSE(地址已在使用)
发布评论