Android的DatagramSocket的错误消息:EADDRINUSE(地址已在使用) [英] Android DatagramSocket error message: EADDRINUSE (Address already in use)

查看:533
本文介绍了Android的DatagramSocket的错误消息:EADDRINUSE(地址已在使用)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想编写一个简单的机器人聊天应用程序。我创建了负责处理所有的网络通信服务类。 DatagramSocket的结合是在一个单独的线程。一旦当我得到这个错误和应用程序崩溃:

  java.net.BindException:绑定失败:EADDRINUSE(地址已在使用)
在libcore.io.IoBridge.bind(IoBridge.java:89)
在java.net.PlainDatagramSocketImpl.bind(PlainDatagramSocketImpl.java:68)
在java.net.DatagramSocket.createSocket(DatagramSocket.java:133)
在java.net.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 才具有约束力。不要指定在构造函数中港 - 创建未绑定的套接字,而不是用<一个href="http://docs.oracle.com/javase/1.4.2/docs/api/java/net/DatagramSocket.html#DatagramSocket%28java.net.SocketAddress%29"><$c$c>DatagramSocket(null),然后设置选项,然后<一个href="http://docs.oracle.com/javase/1.4.2/docs/api/java/net/DatagramSocket.html#bind%28java.net.SocketAddress%29"><$c$c>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.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)

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(地址已在使用)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆