繁体   English   中英

TCP套接字IOExceptionbind失败:EADDRINUSE(地址已在使用中)

[英]TCP Socket IOExceptionbind failed: EADDRINUSE (Address already in use)

在看到有关此错误的几篇文章后,我真的不明白为什么有时我会收到此异常

我在这里看到了几条建议对绑定套接字进行循环的文章,但我认为它应该执行一次,而在其他地方存在问题。

这是我的代码:

 public ServerNetworkThread()
    {
        setName("ServerNetworkThread");
        _port = Logics.getInstance().getSharedPrefsManager().getInt(SharedPreferencesManager.SERVER_PORT_KEY, Consts.SERVER_PORT);
    }

    public void setHandler(Handler h)
    {
        _handler = h;
    }

    @Override
    public void run()
    {    
        _isWorking = true;
        try
        {
            _serverSocket = new ServerSocket();
            _serverSocket.setReuseAddress(true);
            _serverSocket.bind(new InetSocketAddress(_port));

            while (_isWorking)
            {
                _socket = _serverSocket.accept();
                _socket.setSoTimeout(Consts.CLIENT_SOCKET_TIMEOUT);
                readDataTest();
            }    
        }
        catch (SocketTimeoutException e)
        {
            e.printStackTrace();
            Logger.d("anton", e.getMessage());
        }
        catch (IOException e)
        {
            e.printStackTrace();
            Logger.d("anton", "server thread IOException" + e.getMessage());
        }

    }

    private void readDataTest() throws IOException
    {
        //          BufferedReader inFromClient = new BufferedReader(new InputStreamReader(_socket.getInputStream(),Charset.forName("UTF-16LE")));
         //          BufferedReader inFromClient = new BufferedReader(new InputStreamReader(_socket.getInputStream(),Charset.forName("UTF-16LE")));
        InputStream iStream = _socket.getInputStream();
        InputStreamReader in = new InputStreamReader(iStream, Charset.forName("UTF-16LE"));
        DataOutputStream outToClient = new DataOutputStream(_socket.getOutputStream());
        char[] buf = new char[1024];
        int lettersCount = in.read(buf, 0, buf.length);
        String request = new String(buf,0,lettersCount);
//      request = request.split(Consts.EOF)[0];
        Log.d("test","server got request="+request);

        String responseStr = parseResponse(request);
        byte[] response = responseStr.getBytes("UTF-16LE");
        outToClient.write(response);
        outToClient.flush();
        outToClient.close();
        in.close();
        _socket.close();
    }

这是我的例外:

W/System.err( 1433): java.net.BindException: bind failed: EADDRINUSE (Address already in use)
W/System.err( 1433):    at libcore.io.IoBridge.bind(IoBridge.java:89)
W/System.err( 1433):    at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:150)
W/System.err( 1433):    at java.net.ServerSocket.bind(ServerSocket.java:319)
W/System.err( 1433):    at java.net.ServerSocket.bind(ServerSocket.java:282)
W/System.err( 1433):    at com.example.visionixpanel.logics.network.ServerNetworkThread.run(ServerNetworkThread.java:61)
W/System.err( 1433): Caused by: libcore.io.ErrnoException: bind failed: EADDRINUSE (Address already in use)
W/System.err( 1433):    at libcore.io.Posix.bind(Native Method)
W/System.err( 1433):    at libcore.io.ForwardingOs.bind(ForwardingOs.java:40)
W/System.err( 1433):    at libcore.io.IoBridge.bind(IoBridge.java:87)
W/System.err( 1433):    ... 4 more

它由以下行抛出:

 _serverSocket.bind(new InetSocketAddress(_port));

更新:

我也有这段代码:

public void stopThread()
{
    _isWorking = false;
    try
    {
        if (_serverSocket != null)
        {
            _serverSocket.close();
        }
        if (_socket != null)
        {
            _socket.close();
        }
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
}

也许与清理线程套接字资源有关?

我不太明白为什么有时候我会收到这个例外

您要绑定的端口已被使用。

我在这里看到了几条建议对绑定套接字进行循环的文章,但我认为它应该执行一次,而在其他地方存在问题。

我同意。 问题是其他进程已经在使用该端口。 例如,可能是您的应用程序的事先调用。 确保它已经退出。 如果不是那样,您将必须找到它是什么进程并采取适当的补救措施,或者使用其他端口号。

我看到您已经在使用setReuseAddress(true)来解决此问题的最常见情况。

也许与清理线程套接字资源有关?

没有。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM