简体   繁体   English

HttpUrlConnection.connect 失败

[英]HttpUrlConnection.connect fails

I've been trying to create a small app that connects to url in editText and returns the status code.我一直在尝试创建一个连接到 editText 中的 url 并返回状态代码的小应用程序。

Here is the onCreate code:这是 onCreate 代码:

 override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    button.setOnClickListener {
        val url = editText.text.toString()
        var connection: HttpURLConnection? = null
        if (URLUtil.isValidUrl(url)) {
            connection = URL(url).openConnection() as HttpURLConnection
            var thr = Thread {
                connection.connect()
                val code = connection.responseCode
                runOnUiThread {
                    if (code != 404 && code != 500) {
                        textView.text = "Ok"
                    } else {
                        textView.text = "Failed"
                    }
                }

            }
            thr.start()
            thr.join()
        } else {
            textView.text = "Failed"
        }
    }

The problem is that whenever URL is valid, runtime error occurs in .connect() method.问题是只要 URL 有效,.connect() 方法就会发生运行时错误。 Internet permission is set up in android manifest.互联网权限在android清单中设置。 What causes that issue?是什么导致了这个问题?

E/AndroidRuntime: FATAL EXCEPTION: Thread-2
Process: com.example.company.myapplication, PID: 27183
java.net.SocketException: socket failed: EPERM (Operation not permitted)
    at java.net.Socket.createImpl(Socket.java:492)
    at java.net.Socket.getImpl(Socket.java:552)
    at java.net.Socket.setSoTimeout(Socket.java:1180)
    at com.android.okhttp.internal.io.RealConnection.connectSocket(RealConnection.java:143)
    at com.android.okhttp.internal.io.RealConnection.connect(RealConnection.java:116)
    at com.android.okhttp.internal.http.StreamAllocation.findConnection(StreamAllocation.java:186)
    at com.android.okhttp.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:128)
    at com.android.okhttp.internal.http.StreamAllocation.newStream(StreamAllocation.java:97)
    at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:289)
    at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:232)
    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:465)
    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:131)
    at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.connect(DelegatingHttpsURLConnection.java:90)
    at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:30)
    at com.example.company.myapplication.MainActivity$onCreate$1$thr$1.run(MainActivity.kt:25)
    at java.lang.Thread.run(Thread.java:919)

For those who didn't read chat:对于那些没有阅读聊天的人:

URLUtil.isValidUrl(url) doesn't check that the url in question actually can be resolved to a website/server. URLUtil.isValidUrl(url)不检查有问题的 url 是否实际上可以解析为网站/服务器。 This means that when connect is called on a website/server that doesn't exist, an exception is thrown, since there is nothing to connect to.这意味着当在一个不存在的网站/服务器上调用 connect 时,会抛出异常,因为没有任何东西可以连接。

Hi please check if you have provided the permission of internet in your manifest,嗨,请检查您是否在清单中提供了互联网许可,

<manifest >
 <uses-permission android:name="android.permission.INTERNET" />
 <application> 
  ...
 </application> 
</manifest>

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

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