【问题标题】:How to connect Node Js server with Android Studio app?如何将 Node Js 服务器与 Android Studio 应用程序连接?
【发布时间】:2020-04-13 18:33:13
【问题描述】:

我正在尝试在 android studionode js 服务器之间建立连接,但我有点卡住了。我很确定我做错了很多事情,但我可以开始寻找解决方案的一条错误消息是节点服务器端的 listen EADDRINUSE :::3000 错误。这是双方的所有代码,我真的希望有经验的人能指出问题并给我一个继续前进的方向。提前致谢!

节点 JS 代码:

var express = require('express');
var app = express();

app.on('listening',function(){
    console.log('ok, server is running');
});

app.post('/postdata', (req, res) => {
    var data = req.body.data; // your data
    // do something with that data (write to a DB, for instance)
    console.log(data)
    res.status(200).json({
        message: "Data received successfully"
    });
});
app.listen(3000);

Android Studio 代码(MainActivity.java)

package com.example.tbg_studio;

import androidx.appcompat.app.AppCompatActivity;

import android.app.DownloadManager;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

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.JsonObjectRequest;
import com.android.volley.toolbox.Volley;

import org.json.JSONException;
import org.json.JSONObject;

import java.util.HashMap;

public class MainActivity extends AppCompatActivity {
    Button RequestButton; // button which on clicking, sends the request
    TextView DisplayText; // a text field to display the request response
    EditText DataField; // a text field where the data to be sent is entered

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        RequestButton = (Button) findViewById(R.id.RequestButton);
        DataField = (EditText) findViewById(R.id.DataField);
        DisplayText = (TextView) findViewById(R.id.DisplayText);

        final RequestQueue queue = Volley.newRequestQueue(this);
        final String url = "http://serverdomainorip/postdata"; // your URL

        queue.start();
        RequestButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                HashMap<String, String> params = new HashMap<String,String>();
                params.put("data", DataField.getText().toString()); // the entered data as the body.

                JsonObjectRequest jsObjRequest = new
                        JsonObjectRequest(Request.Method.POST,
                        url,
                        new JSONObject(params),
                        new Response.Listener<JSONObject>() {
                            @Override
                            public void onResponse(JSONObject response) {
                                try {
                                    DisplayText.setText(response.getString("message"));
                                } catch (JSONException e) {
                                    e.printStackTrace();
                                }
                            }
                        }, new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        DisplayText.setText("That didn't work!");
                    }
                });
                queue.add(jsObjRequest);
            }
        });
    }

}

以及Node JS 错误信息:

错误:监听 EADDRINUSE :::3000
在 Object._errnoException (util.js:1022:11)
在 _exceptionWithHostPort (util.js:1044:20)
在 Server.setupListenHandle [as _listen2] (net.js:1367:14)
在listenInCluster (net.js:1408:12)
在 Server.listen (net.js:1492:7)
在 Function.listen (/home/leventecsoba/node_modules/express/lib/application.js:618:24)
在对象。 (/home/leventecsoba/Asztal/Node JS/tbg_studio.js:16:5)
在 Module._compile (module.js:652:30)
在 Object.Module._extensions..js (module.js:663:10)
在 Module.load (module.js:565:32)

【问题讨论】:

  • 如错误所说。您已经有一台服务器在端口 3000 上运行
  • 好的,请问如何解决? :)
  • 我杀死了正在运行的进程,摆脱了错误信息。但是服务器没有运行(没有好的,它的运行日志消息)。
  • kill $(lsof -i:3000 -t)

标签: javascript android node.js express android-volley


【解决方案1】:

看起来你已经在:3000 运行了一些东西(可能是另一个节点服务器实例),所以代码本身并不重要。如果杀死进程不适合您,只需重新启动计算机(我知道,这听起来很愚蠢,但它通常可以工作!)。重新开始,您将能够再次控制端口 3000 并在此处运行您想要的 Node 服务器。

或者,您可以在 Node 服务器中更改此行,使其侦听端口 3001 上的请求:

app.listen(3001)

您还必须更新 Android Studio 中的代码,才能让您的移动应用向端口 3001 发送请求。

【讨论】:

  • 好的,听起来不错:) 快速提问,android studio 代码中需要的更新应该在final String url = "http://serverdomainorip/postdata"; 行中,对吧?所以我想把它改成3001/postdata?只是为了确定:)
  • 不幸的是,我对 Android Studio 和 Java 的了解不够,无法自信地回答您的问题,但据我了解,您的 URL 看起来像这样:http://serverdomainorip:3001/postdata 或者如果您想尝试,请尝试确保它达到localhost:http://192.168.1.1:3001/postdata。如果这对您有用,请不要忘记将此答案选为对您的问题有效:)
  • 没用,但感谢您的努力,我很感激!
【解决方案2】:

在您的 url 上传递您要连接的端口。

  final String url = "http://serverdomainorip:3000/postdata";

【讨论】:

    猜你喜欢
    • 2017-04-18
    • 1970-01-01
    • 1970-01-01
    • 2020-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-07
    • 1970-01-01
    相关资源
    最近更新 更多