【问题标题】:Android socket.io application can't connect to node.js serverAndroid socket.io 应用程序无法连接到 node.js 服务器
【发布时间】:2014-08-31 13:28:36
【问题描述】:

我的应用程序,使用 socket.io,无法连接到 node.js 服务器。

服务器节点.js

var app = require('http').createServer()
var io = require('socket.io')(app);

app.listen(1000);

io.on('connection', function (client) { 

  client.name = client.remoteAddress + ':' + client.remotePort;
  console.log(client.name + ' connected!'); 

    client.on('sensorChanged', function (data) {
        console.log("HERE");
        console.log(data);
    });

});

安卓应用:

    SocketIO socket = new SocketIO();
    try {
        socket.connect("http://localhost:1000/", this);
        txtView.setText("connected");
    } catch (MalformedURLException e) {
        e.printStackTrace();
    }

    socket.emit("sensorChanged", "argument1");

当我连接到服务器时,服务器不会说“socket.name connected”,也不会发出事件“sensorChanged”。问题出在哪里?

【问题讨论】:

    标签: android node.js socket.io


    【解决方案1】:

    在将带有 Socket.IO 的 Android 应用程序与我在同一个 WiFi 上的服务器连接时,我也遇到了连接问题(尽管当我尝试在浏览器中连接到同一个 URL 时连接正常)。

    我在这里找到了解决方案:https://stackoverflow.com/a/50834600/9560885

    简而言之,尝试将此行添加到您的 AndroidManifest.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest ...>
        <uses-permission android:name="android.permission.INTERNET" />
        <application
            ...
            android:usesCleartextTraffic="true"
            ...>
            ...
        </application>
    </manifest>
    

    【讨论】:

    • 谢谢!!!! 2 天用这个杀死我,终于!!我只需要添加使用 cleartexttraffic
    【解决方案2】:

    使用 IP 地址:10.0.2.2 用于 AVD,10.0.2.3 用于 genymotion。

    如果您在同一网络上使用外部设备,请使用您的服务器机器的本地 IP 地址。

    【讨论】:

    • 而不是本地主机,这些是用于访问主机本地主机的 ip 模拟器
    【解决方案3】:

    建立从 Android 设备到本地节点服务器的 Socket.IO 连接


    A. 确保您已通过 gradle 安装 socket.io-client-java


    B.确保您已为您的设备启用互联网访问。

    <!-- AndroidManifest.xml -->
    
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="...">
    
        <uses-permission android:name="android.permission.INTERNET" />
    
        <application ...>
            ...
        </application>
    </manifest>
    

    C.确保您运行服务器的端口已打开。


    D. 使用您的计算机网络 IP 地址连接到您的本地服务器。

    • 打开一个终端。
    • 输入命令ipconfig
    • 查找您的 IPv4 地址。

    你想连接到http://&lt;IPv4 Address&gt;:&lt;port&gt;

    通过http://localhost:3000 连接到本地主机将不起作用,因为“本地主机”指的是设备本身。


    E. 在您的设备上测试连接。

    • 在您的服务器 GET /status 上设置一个简单的路由,它只返回 200。
    • 在您的设备上导航至http://&lt;IPv4 Address&gt;:&lt;port&gt;/status
    • 如果您收到成功响应,您应该可以继续使用了。

    F.您现在应该能够将您的 android 套接字客户端连接到您的节点套接字服务器。

    // Node.js App
    
    let SocketIO = require('socket.io');
    
    let ioServer = SocketIO(server);
    console.log('Socket Server waiting for connections');
    
    ioServer.on('connection', function (socket) {
        console.log(`Socket Client connected with id=${socket.id}`);
    });
    

    -

    // Android App
    
    import io.socket.client.Socket;
    import io.socket.client.IO;
    import io.socket.emitter.Emitter;
    import android.util.Log;
    
    public class SocketIO implements Runnable {
        @Override
        public void run() {
    
            final Socket socket;
    
            try {
                socket = IO.socket("http://<IPv4 Address>:<port>");
    
                socket.on(Socket.EVENT_CONNECT, new Emitter.Listener() {
    
                    @Override
                    public void call(Object... args) {
                        Log.d("TAG", "Socket Connected!");
                        socket.disconnect();
                    }
    
                });
    
            } catch(Exception e){
                Log.e("Error", e.toString());
            }
    
        }
    }
    

    【讨论】:

    • 我也做了同样的事情,但是套接字没有连接。 IO.socket("http://:").connected() 返回 false,我不知道为什么...
    【解决方案4】:

    抱歉,回答迟了,我刚刚发现了同样的情况,这让我很困惑我应该怎么做才能解决这个奇怪的情况

    我为解决这个问题所做的只是在你的 package.json 上更改节点服务器的 socket.io 版本

    来自

    "dependencies": {
      "express": "^4.17.1",
      "socket.io": "^3.1.1"
    }
    

    "dependencies": {
      "express": "^4.17.1",
      "socket.io": "^1.7.2"
    }
    

    然后删除node_modules并执行npm install, 或者您可以采取任何方式将 socket.io 降低到 ^1.7.2 版本

    【讨论】:

      【解决方案5】:

      检查一下,用下面的代码为我工作:

      opts.transports = new String[]{"websocket"};

      https://stackoverflow.com/a/67978895/6909832

      【讨论】:

        【解决方案6】:

        您正在从 android 定位本地计算机上的 Node 服务器。由于节点不能在 Android 上运行(据我所知),我猜你想在你的电脑上定位服务器。而不是 localhost(在此 Android 代码中将指代手机/平板电脑本身),您应该使用本地网络中 PC 的网络地址。

        【讨论】:

          猜你喜欢
          • 2014-10-03
          • 1970-01-01
          • 2021-08-19
          • 2021-04-22
          • 2021-04-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多