我的应用程序,使用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'。问题在哪里?
答案 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>
。您想要连接到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"};