【问题标题】:Try to connect socket until server starts in AsyncTask尝试连接套接字,直到服务器在 AsyncTask 中启动
【发布时间】:2015-08-12 22:48:53
【问题描述】:

我希望在 AsyncTask 中我的应用程序尝试连接到服务器,直到连接完成。如果我启动应用程序时服务器正在运行,它可以工作,但如果我启动应用程序然后启动服务器,它会显示:java.io.IOException: fcntl failed: EBADF (Bad file number)

public class FetchData extends AsyncTask {
        BufferedReader in;
        InetSocketAddress socketAddress;
        @Override
        protected Object doInBackground(Object[] params) {
            socketAddress = new InetSocketAddress("192.168.1.158", 9999);

            while(!_socket.isConnected()) {
                try {

                    _socket.connect(socketAddress);
                    Log.d("socket_status", "Socket is connected!");
                    break;

                } catch (IOException e) {
                    Log.d("socket_status", e.toString());
                    e.printStackTrace();
                }
            }
            return null;
        }
} 

更新:_socket 是在 onCreate 方法 @Override 中创建的

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_widget);

    if(_socket == null)
        _socket = new Socket();
-----------------------
}

【问题讨论】:

  • 您是否在清单中添加了 Internet 权限?
  • 是的,我做到了。如果我只是与_socket.connect(socketAddress) 连接并且服务器正在运行,它工作正常。问题只是当我启动应用程序时,服务器没有运行,当我启动服务器时,什么也没有发生。它只是循环并抛出异常。
  • 您甚至没有显示创建套接字的位置和时间。解决方案是每次在 catch 块中创建一个新套接字。
  • 创建新套接字无效。

标签: android android-asynctask


【解决方案1】:

这解决了我的问题:Does socket become unusable after connect() fails?

我必须在 catch 或 finally 块中创建一个新套接字。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-14
    • 2020-09-11
    • 2011-03-21
    • 1970-01-01
    • 2016-03-01
    • 2017-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多