Android socket.io应用程序无法连接到node.js服务器

时间:2014-08-31 13:28:37

标签: android node.js socket.io

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

server node.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);
    });

});

android应用程序:

    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'。问题在哪里?

6 个答案:

答案 0 :(得分:4)

在同一WiFi上通过服务器将Android应用程序与Socket.IO连接到我的服务器时,我也遇到了连接问题(尽管当我尝试连接到浏览器中的同一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>

答案 1 :(得分:1)

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

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

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

brew unlink imagemagick
brew install imagemagick@6 && brew link imagemagick@6 --force

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

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

  • 打开终端。
  • 输入命令<!-- 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>
  • 查找您的IPv4地址。

您想要连接到ipconfig

通过http://<IPv4 Address>:<port>连接到localhost将无法正常工作,因为'localhost'指的是设备本身。

E。测试设备上的连接。

  • 在服务器http://localhost:3000上设置一条只返回200的简单路线。
  • 导航至您设备上的GET /status
  • 如果你得到成功回应,你应该好好去。

F。您现在应该可以将Android套接字客户端连接到节点套接字服务器。

http://<IPv4 Address>:<port>/status

-

// 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}`);
});

答案 2 :(得分:1)

使用IP地址:10.0.2.2用于AVD&amp; 10.0.2.3 for genymotion。

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

答案 3 :(得分:1)

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

为了解决这个问题,我所做的只是在你的 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 版本

答案 4 :(得分:0)

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

答案 5 :(得分:0)

看看这个,用下面的行为我工作:

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

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