Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/191.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java HttpUrlConnection未连接到服务器_Java_Android - Fatal编程技术网

Java HttpUrlConnection未连接到服务器

Java HttpUrlConnection未连接到服务器,java,android,Java,Android,我是Android开发的新手,通过在互联网上的一些咨询,我想出了以下代码来连接Url,发布字符串内容并读取其响应 private static java.lang.String getRequest(java.lang.String Url, java.lang.String PostContent) { java.lang.StringBuilder content = new java.lang.StringBuilder(); try { java.

我是Android开发的新手,通过在互联网上的一些咨询,我想出了以下代码来连接Url,发布字符串内容并读取其响应

private static java.lang.String getRequest(java.lang.String Url, java.lang.String PostContent)
{
    java.lang.StringBuilder content = new java.lang.StringBuilder();
    try
    {
        java.lang.String line;
        java.net.URL url = new java.net.URL(Url);
        if (cweb.companion.MainActivity.url.startsWith("https"))
        {
            javax.net.ssl.HttpsURLConnection httpsConnection = (javax.net.ssl.HttpsURLConnection)url.openConnection();
            httpsConnection.setSSLSocketFactory((javax.net.ssl.SSLSocketFactory)javax.net.ssl.SSLSocketFactory.getDefault());
            httpsConnection.setRequestMethod("POST");
            httpsConnection.setDoOutput(true);
            httpsConnection.setRequestProperty("Content-Type", "text/plain");
            httpsConnection.addRequestProperty("Content-Length", java.lang.String.valueOf(PostContent.length()));
            java.io.OutputStreamWriter wr = new java.io.OutputStreamWriter(httpsConnection.getOutputStream());
            wr.write(PostContent);
            wr.flush();
            wr.close();
            java.io.BufferedReader bufferedReader = new java.io.BufferedReader(new java.io.InputStreamReader(httpsConnection.getInputStream()));
            while ((line = bufferedReader.readLine()) != null) { content.append(line + "\n"); }
            bufferedReader.close();
        }
        else
        {
            java.net.HttpURLConnection httpConnection = (java.net.HttpURLConnection)url.openConnection();
            httpConnection.setRequestMethod("POST");
            httpConnection.setDoOutput(true);
            httpConnection.setRequestProperty("Content-Type", "text/plain");
            httpConnection.addRequestProperty("Content-Length", java.lang.String.valueOf(PostContent.length()));
            java.io.OutputStreamWriter wr = new java.io.OutputStreamWriter(httpConnection.getOutputStream());
            wr.write(PostContent);
            wr.flush();
            wr.close();
            java.io.BufferedReader bufferedReader = new java.io.BufferedReader(new java.io.InputStreamReader(httpConnection.getInputStream()));
            while ((line = bufferedReader.readLine()) != null) { content.append(line + "\n"); }
            bufferedReader.close();
        }
        return content.toString();
    } catch (java.lang.Exception e) { return "ERROR{" + e.getMessage() + "}"; }
}
我让它非常“重复”以帮助我调试(我知道它可以将一些代码推送到其他方法)

该代码位于MainActivity中,实现如下:

public class MainActivity extends androidx.appcompat.app.AppCompatActivity
{
    private static java.lang.String getRequest(java.lang.String Url, java.lang.String PostContent)
    {
        //my code (as posted earlier)
    }

    @Override protected void onCreate(android.os.Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        this.setContentView(R.layout.activity_main);
        //here i call the code to something like:
        java.lang.String retHTTP = getRequest("http://httpaddress.example.com", "hello world!");
        java.lang.String retHTTPS = getRequest("https://httpsaddress.example.com", "hello world!");
    }
}
如果我以HTTPS地址为目标,则函数抛出空异常并结束(异常的getMessage()方法为null/空字符串),如果它以HTTP地址为目标,则会给我一条“不允许本地主机的明文HTTP流量”消息

我的舱单和Gradle是这样的:

public class MainActivity extends androidx.appcompat.app.AppCompatActivity
{
    private static java.lang.String getRequest(java.lang.String Url, java.lang.String PostContent)
    {
        //my code (as posted earlier)
    }

    @Override protected void onCreate(android.os.Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        this.setContentView(R.layout.activity_main);
        //here i call the code to something like:
        java.lang.String retHTTP = getRequest("http://httpaddress.example.com", "hello world!");
        java.lang.String retHTTPS = getRequest("https://httpsaddress.example.com", "hello world!");
    }
}
清单

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:targetSandboxVersion="1" package="cweb.companion">
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <application
        android:usesCleartextTraffic="true"
        android:allowBackup="true"
        android:icon="@drawable/logo_standard"
        android:label="@string/app_name"
        android:roundIcon="@drawable/logo_standard"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

那么,为什么连接没有发生(我也有服务器端代码,在这两种情况下,甚至没有向它发送任何东西)?

对于HTTP请求,正如您所说,您已将安全配置添加到项目中,那么这里是工作HTTP调用

。。。
java.net.URL URL=新的java.net.URL(URL);
...
其他的
{
HttpURLConnection conn=(HttpURLConnection)url.openConnection();
连接设置连接超时(5000000);
conn.setRequestProperty(“内容类型”、“文本/普通;字符集=UTF-8”);
连接设置输出(真);
conn.setDoInput(真);
conn.setRequestMethod(“POST”);
OutputStream os=conn.getOutputStream();
写(PostContent.getBytes(“UTF-8”);
os.close();
//阅读回复
InputStream in=新的BufferedInputStream(conn.getInputStream());
字符串结果=IOUtils.toString(在“UTF-8”中);
连接断开();
返回结果;
}
}catch(java.lang.Exception e){return“ERROR{”+e.getMessage()+“}”;}
...

现在考虑在后台线程上进行网络操作,这样您可以按如下方式调用GETRebug方法。


创建时受保护的void(android.os.Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
this.setContentView(R.layout.activity_main);
//在这里,您可以调用类似于后台线程的代码:
新建异步任务(){
@凌驾
受保护的空位背景(空位…空位){
java.lang.String retHTTP=getRequest(“http://httpaddress.example.com“,“你好,世界!”);
返回null;
}
}.executeOnExecutor(异步任务.THREAD\u池\u EXECUTOR);
}
同样,您也可以使用SSL成功使用HTTPS


注意:对app.gradle文件中的IOUtils使用
implementation'org.apache.commons:commons io:1.3.2'

如果您使用或使用其他客户端库,将非常容易。很少几行代码可以满足您的需要。我不使用
HttpUrlConnection
,但是每个Http调用都不应该在主线程上完成。这就是行不通。但是是的,
改型
将是更好的选择,它甚至有内置的线程处理。@Afsaredrisy可能,但我对这个IDE和语言很熟悉,所以合并很复杂,但它不会工作吗?有什么问题吗?@SkypeDogg不知道,所以必须在另一个类中?只需在
AsyncTask
内部调用,即使在同一个活动中,所有内容都冻结在conn.getOutputStream()中,但仍在处理它-我将在用尽所有尝试后立即用代码更改更新我的问题!虽然没有添加实现标记,但是使用了xml解决方案,只添加了标记(没有域标记)-最终与您的文章不完全一样,但是从中获得了很多信息,同时也为“how to do asynctask”文章带来了很多信息。谢谢大家的帮助!