Android应用无法连接到外部Apache MySQL服务器。

huangapple 未分类评论43阅读模式
英文:

Android app can't connect to external apache mysql server

问题

以下是翻译好的部分:

logcat:

2020-04-04 21:44:17.407 28854-28854/com.example.blooddonorsystem W/System.err: com.android.volley.NoConnectionError: java.net.SocketException: socket failed: EPERM (Operation not permitted)
2020-04-04 21:44:17.407 28854-28854/com.example.blooddonorsystem W/System.err:     at com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:177)
...

这是连接到服务器的代码:

//出于明显的原因,已删除真实的URL
static String URL_REGIST = "http://192.xxx.xxx.xxx/android/register.php";

@Override
public void onClick(View view) {
    if(!validate()) return;
    Register();
}

private void Register() {
    //使按钮不可见,显示加载小部件
    loading.setVisibility(View.VISIBLE);
    registerButton.setVisibility(View.GONE);

    //获取输入并转换为字符串
    final String name = this.nameInput.getText().toString().trim();
    final String emailAddress = this.emailAddressInput.getText().toString().trim();
    final String password = this.passwordInput.getText().toString().trim();
    // 其他输入...
    final String bloodType = bloodTypeInput.getSelectedItem().toString().trim();

    //开始将数据发送到数据库
    StringRequest stringRequest = new StringRequest(Request.Method.POST, URL_REGIST,
        new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                try {
                    JSONObject jsonObject = new JSONObject(response);
                    String success = jsonObject.getString("success");
                    if(success.equals("1")) {
                        Toast.makeText(RegisterActivity.this, "Registration Successful", Toast.LENGTH_SHORT).show();
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                    Toast.makeText(RegisterActivity.this, "Registration Error! Error inserting values to db" + e.toString(), Toast.LENGTH_SHORT).show();
                    loading.setVisibility(View.GONE);
                    registerButton.setVisibility(View.VISIBLE);
                }
            }
        },
        new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Toast.makeText(RegisterActivity.this, "Registration Error! error connecting to db " + error.toString(), Toast.LENGTH_SHORT).show();
                error.printStackTrace();
                loading.setVisibility(View.GONE);
                registerButton.setVisibility(View.VISIBLE);
            }
        }) {
        @Override
        protected Map<String, String> getParams() throws AuthFailureError {
            Map<String, String> params = new HashMap<>();
            params.put("name", name);
            params.put("emailAddress", emailAddress);
            params.put("password", password);
            // 其他参数...
            params.put("bloodType", bloodType);

            return params;
        }
    };

我已经添加了<uses-permission android:name="android.permission.INTERNET" />到我的AndroidManifest文件中。

我正在使用Digital Ocean的Ubuntu droplet来托管服务器,除了允许防火墙访问外,还需要在服务器上更改任何设置吗?

英文:

So I have an app that has a registration function, when the user clicks register the program should connect to an Apache MySQL server and insert the data into the phpMyadmin database however I get the error stated below.

logcat:

2020-04-04 21:43:52.035 28854-28854/com.example.blooddonorsystem I/AssistStructure: Flattened final assist data: 3736 bytes, containing 1 windows, 16 views
2020-04-04 21:44:17.157 28854-28854/com.example.blooddonorsystem I/AssistStructure: Flattened final assist data: 3736 bytes, containing 1 windows, 16 views
2020-04-04 21:44:17.407 28854-28854/com.example.blooddonorsystem W/System.err: com.android.volley.NoConnectionError: java.net.SocketException: socket failed: EPERM (Operation not permitted)
2020-04-04 21:44:17.407 28854-28854/com.example.blooddonorsystem W/System.err:     at com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:177)
2020-04-04 21:44:17.407 28854-28854/com.example.blooddonorsystem W/System.err:     at com.android.volley.NetworkDispatcher.processRequest(NetworkDispatcher.java:120)
2020-04-04 21:44:17.407 28854-28854/com.example.blooddonorsystem W/System.err:     at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:87)
2020-04-04 21:44:17.407 28854-28854/com.example.blooddonorsystem W/System.err: Caused by: java.net.SocketException: socket failed: EPERM (Operation not permitted)
2020-04-04 21:44:17.407 28854-28854/com.example.blooddonorsystem W/System.err:     at java.net.Socket.createImpl(Socket.java:492)
2020-04-04 21:44:17.407 28854-28854/com.example.blooddonorsystem W/System.err:     at java.net.Socket.getImpl(Socket.java:552)
2020-04-04 21:44:17.407 28854-28854/com.example.blooddonorsystem W/System.err:     at java.net.Socket.setSoTimeout(Socket.java:1180)
2020-04-04 21:44:17.407 28854-28854/com.example.blooddonorsystem W/System.err:     at com.android.okhttp.internal.io.RealConnection.connectSocket(RealConnection.java:143)
2020-04-04 21:44:17.407 28854-28854/com.example.blooddonorsystem W/System.err:     at com.android.okhttp.internal.io.RealConnection.connect(RealConnection.java:116)
2020-04-04 21:44:17.407 28854-28854/com.example.blooddonorsystem W/System.err:     at com.android.okhttp.internal.http.StreamAllocation.findConnection(StreamAllocation.java:186)
2020-04-04 21:44:17.407 28854-28854/com.example.blooddonorsystem W/System.err:     at com.android.okhttp.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:128)
2020-04-04 21:44:17.407 28854-28854/com.example.blooddonorsystem W/System.err:     at com.android.okhttp.internal.http.StreamAllocation.newStream(StreamAllocation.java:97)
2020-04-04 21:44:17.407 28854-28854/com.example.blooddonorsystem W/System.err:     at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:289)
2020-04-04 21:44:17.407 28854-28854/com.example.blooddonorsystem W/System.err:     at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:232)
2020-04-04 21:44:17.407 28854-28854/com.example.blooddonorsystem W/System.err:     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:465)
2020-04-04 21:44:17.407 28854-28854/com.example.blooddonorsystem W/System.err:     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:131)
2020-04-04 21:44:17.407 28854-28854/com.example.blooddonorsystem W/System.err:     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:262)
2020-04-04 21:44:17.407 28854-28854/com.example.blooddonorsystem W/System.err:     at com.android.volley.toolbox.HurlStack.addBody(HurlStack.java:259)
2020-04-04 21:44:17.407 28854-28854/com.example.blooddonorsystem W/System.err:     at com.android.volley.toolbox.HurlStack.addBodyIfExists(HurlStack.java:247)
2020-04-04 21:44:17.407 28854-28854/com.example.blooddonorsystem W/System.err:     at com.android.volley.toolbox.HurlStack.setConnectionParametersForRequest(HurlStack.java:219)
2020-04-04 21:44:17.407 28854-28854/com.example.blooddonorsystem W/System.err:     at com.android.volley.toolbox.HurlStack.executeRequest(HurlStack.java:97)
2020-04-04 21:44:17.407 28854-28854/com.example.blooddonorsystem W/System.err:     at com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:131)
2020-04-04 21:44:17.407 28854-28854/com.example.blooddonorsystem W/System.err: 	... 2 more

Here's the code to connect to the server:

//taken out the real url for obvious reasons
static String URL_REGIST = &quot;http://192.xxx.xxx.xxx/android/register.php&quot;;



@Override
public void onClick(View view) {
    if(!validate()) return;
    Register();
}

private void Register()
{
    //make button invisible and make loading widget visible
    loading.setVisibility(View.VISIBLE);
    registerButton.setVisibility(View.GONE);

    //get inputs and convert to strings
    final String name = this.nameInput.getText().toString().trim();
    final String emailAddress = this.emailAddressInput.getText().toString().trim();
    final String password = this.passwordInput.getText().toString().trim();
   // final String confirmPassword = this.confirmPasswordInput.getText().toString().trim();
    final String postalAddress = this.addressInput.getText().toString().trim();
    final String phoneNumber = this.nameInput.getText().toString().trim();
   // final int phoneNumber = Integer.parseInt(this.nameInput.getText().toString().trim());
    final String bloodType = bloodTypeInput.getSelectedItem().toString().trim();

    //start sending data to the database
    StringRequest stringRequest = new StringRequest(Request.Method.POST, URL_REGIST,
            new Response.Listener&lt;String&gt;() {
                @Override
                public void onResponse(String response) {
                    try
                    {
                        JSONObject jsonObject = new JSONObject(response);
                        String success = jsonObject.getString(&quot;success&quot;);
                        if(success.equals(&quot;1&quot;))
                        {
                            Toast.makeText(RegisterActivity.this, &quot;Registration Successful&quot;, Toast.LENGTH_SHORT).show();
                        }
                    } catch (JSONException e) {
                        e.printStackTrace();
                        Toast.makeText(RegisterActivity.this, &quot;Registration Error! Error inserting values to db&quot; + e.toString(), Toast.LENGTH_SHORT).show();
                        loading.setVisibility(View.GONE);
                        registerButton.setVisibility(View.VISIBLE);
                    }
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Toast.makeText(RegisterActivity.this, &quot;Registration Error! error connecting to db &quot; + error.toString(), Toast.LENGTH_SHORT).show();
                    error.printStackTrace();
                    loading.setVisibility(View.GONE);
                    registerButton.setVisibility(View.VISIBLE);
                }
            })
    {
        @Override
        protected Map&lt;String, String&gt; getParams() throws AuthFailureError {
            Map&lt;String,String&gt; params = new HashMap&lt;&gt;();
            params.put(&quot;name&quot;,name);
            params.put(&quot;emailAddress&quot;,emailAddress);
            params.put(&quot;password&quot;,password);
            params.put(&quot;postalAddress&quot;,postalAddress);
            params.put(&quot;phoneNumber&quot;,phoneNumber);
            params.put(&quot;bloodType&quot;,bloodType);

            return params;
        }
    };

I've already added <uses-permission android:name="android.permission.INTERNET "/> to my AndroidManifest file.

I'm using a digital ocean ubuntu droplet to host the server, are there any settings I need to change on their other than allowing access through the firewall.

答案1

得分: 0

我希望您已在清单中添加了互联网权限。如果没有,请添加

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

如果您在模拟器中运行应用,请卸载并重新安装该应用。

请检查是否对您有效。

英文:

I hope you have added internet permissions in your manifest . if not please add

&lt;uses-permission android:name=&quot;android.permission.INTERNET&quot; /&gt;
&lt;uses-permission android:name=&quot;android.permission.ACCESS_NETWORK_STATE&quot; /&gt;

If you are running app in emulator please uninstall and reinstall the application.

Please check if this works for you.

huangapple
  • 本文由 发表于 2020年4月5日 04:57:35
  • 转载请务必保留本文链接:https://java.coder-hub.com/61034685.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定