java.io.Exception com.android.okhttp 上的流意外结束

标签 java amazon-web-services android-studio amazon-ec2 okhttp

我目前正在开发 Android Studio。只是尝试制作一个应用程序来注册帐户并使用 LAMP 堆栈将数据保存在数据库中。

我使用的代码适用于本地主机(我使用的是 XAMPP),它将数据发布到数据库。

但是,当我更改 AWS 上的 EC2 计算机的 URL 时,应用程序显示“java.io.Exception Unexpected End Of Stream on com.android.okhttp”并且没有将数据发布到数据库。我测试并验证了 URL 是否正确。

对于这个问题我还应该尝试什么?任何帮助将非常感激!

这是应用程序用户界面: Click to see image

代码如下:

<小时/>
package com.example.androidphp;
import androidx.appcompat.app.AppCompatActivity;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.android.volley.AuthFailureError;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.HashMap;
import java.util.Map;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private EditText editTextUserName, editTextEmail, editTextPassword;
    private Button buttonRegister;
    private ProgressDialog progressDialog;
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        editTextEmail = (EditText) findViewById(R.id.editTextEmail);
        editTextUserName = (EditText) findViewById(R.id.editTextUserName);
        editTextPassword = (EditText) findViewById(R.id.editTextPassword);
        buttonRegister = (Button) findViewById(R.id.buttonRegister);

        progressDialog = new ProgressDialog(this);
        buttonRegister.setOnClickListener(this);
    }
    private void registerUser(){
        final String email = editTextEmail.getText().toString().trim();
        final String username = editTextUserName.getText().toString().trim();
        final String password = editTextPassword.getText().toString().trim();

        progressDialog.setMessage("Registering User....");
        progressDialog.show();

        // class from volley
        StringRequest stringRequest = new StringRequest(Request.Method.POST,
                Constants.URL_REGISTER,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        progressDialog.dismiss();
                        try {
                            JSONObject jsonObject = new JSONObject(response);
                            Toast.makeText(getApplicationContext(), jsonObject.getString("message"),
                                    Toast.LENGTH_LONG).show();
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        progressDialog.hide();
                        Toast.makeText(getApplicationContext(), error.getMessage(), Toast.LENGTH_LONG).show();
                    }
                }){
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                Map<String,String> params = new HashMap<>();
                params.put("username", username);
                params.put("email", email);
                params.put("password", password);
                return params;
            }
        };
        RequestQueue requestQueue = Volley.newRequestQueue(this);
        requestQueue.add(stringRequest);
    }

    @Override
    public void onClick(View v) {
        if(v == buttonRegister)
            registerUser();
    }
}

最佳答案

我的 Android 10 设备也有同样的问题,如果您的协议(protocol) URL 是 http,则必须在 list 中添加 android:usesCleartextTraffic="true"

<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:usesCleartextTraffic="true"
        android:theme="@style/AppTheme">

</Application>

在 android 9 pi [API Level 28] 及更高版本中,您必须在 Manifest 应用程序标记中设置 networkSecurityConfig,如下所示:

 <application android:networkSecurityConfig="@xml/network_security_config">

然后在您的 xml 文件夹中创建您的 xml 文件,并且应如下所示以启用所有不加密的请求:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="false">
        <domain includeSubdomains="true">secure.example.com</domain>
    </domain-config>
</network-security-config>

请查看此链接以获取更多信息:Read 1 -- Read 2

关于java.io.Exception com.android.okhttp 上的流意外结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58859334/

相关文章:

java - 了解 Spring MVC 应用程序上下文

python - 如何修复 "Syntax error in module lambda_function"

java - onClick 方法不存在

java - 有意调用电话后让手机进入休眠状态

android - 使 Android Studio 中的 "git branch area"变大

java - 如何使用构造函数注入(inject)来限定bean

java - 将 List<Map<String, List<String>>> 转换为 String[][]

python - 你能从 boto 得到 AWS 账户名吗?

json - 如何解析这个 JSON 对象/字符串?

java - 将 double int[][] 图像减小到更小的尺寸