Android Node.js Socket.io 未连接
Android Node.js Socket.io not connecting
我有一个 Node.js 服务器使用 socket.io 和一个 android 应用程序。我希望我的应用程序连接到服务器。 (我在当地工作)
首先我启动服务器:
command prompt
这是它的代码:
var express = require('express'); // call express
var app = express();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var port = process.env.PORT || 1234;
app.get('/',function(req,res){
res.send("Welcome to my socket");
});
io.on('connection', function (socket) {
console.log('one user connected : '+socket.id);
// when the client emits 'new message', this listens and executes
socket.on('new message', function (data) {
// we tell the client to execute 'new message'
console.log('this is message :',data);
});
});
http.listen(port, function () {
console.log('Server listening at port %d', port);
});
然后我尝试从我的 activity 连接:
public class AvisActivity extends AppCompatActivity {
private Socket mSocket;
{
try {
mSocket = IO.socket("http://172.21.191.234:1234");
} catch (URISyntaxException e) { Log.v("AvisActivity", "error connecting to socket");}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_avis);
Log.v("AvisActivity", "try to connect");
mSocket.connect();
Log.v("AvisActivity", "connection sucessful");
}
}
我的问题是我从未在服务器上看到日志 "one user connected",但我总是在 android 日志上看到 "try to connect" 和“连接成功”。
有人能帮我解开这个谜吗?
更新
我的代码运行良好,但我遇到了一些阻止网络套接字的 Wifi 配置(实际上我的学校确实如此,这就是我的问题所在)
将套接字初始化代码放入 onCreate
方法中,如下所示:
public class AvisActivity extends AppCompatActivity {
private Socket mSocket;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_avis);
try {
mSocket = IO.socket("http://172.21.191.234:1234");
}
catch (URISyntaxException e) {
Log.v("AvisActivity", "error connecting to socket");
}
Log.v("AvisActivity", "try to connect");
mSocket.connect();
Log.v("AvisActivity", "connection sucessful");
}
}
你的代码没问题,它工作正常,你只需要确认你连接的 IP 地址是正确的,并且在 manifest.xml
中添加了 INTERNET 权限
<uses-permission android:name="android.permission.INTERNET"/>
更新
我的代码运行良好,但我遇到了一些阻止网络套接字的 Wifi 配置(实际上我的学校确实如此,这就是我的问题所在)。但是我真的不知道他们是怎么屏蔽的。
此外,稍后在我的项目中部署到 OVH 服务器时,使用 1234 端口时出现问题。确保使用您的提供商提供的端口 available/unlocked。
对于在这里谷歌搜索的其他人,这帮助我获得了有关该问题的一些日志信息:
Log.v("AvisActivity", "try to connect");
mSocket.connect();
mSocket.io().on(Manager.EVENT_TRANSPORT, new Emitter.Listener() {
@Override
public void call(Object... args) {
Transport transport = (Transport) args[0];
transport.on(Transport.EVENT_ERROR, new Emitter.Listener() {
@Override
public void call(Object... args) {
Exception e = (Exception) args[0];
Log.e(TAG, "Transport error " + e);
e.printStackTrace();
e.getCause().printStackTrace();
}
});
}
});
对我来说,问题是客户端不会使用 TLSv1.1 或 1.2。在撰写本文时,我还没有弄明白。让我的服务器支持 TLSv1.0 是我目前的解决方法。
在Android的最新版本中,您需要添加AndroidManifest.xml "android: usesCleartextTraffic = true"以允许与纯文本的连接。
示例:
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme"
android:usesCleartextTraffic="true">
对于 API 23 及更高版本,您必须在清单文件中添加 android:usesCleartextTraffic="true"
。
用这一行为我工作:
opts.transports = new String[]{"websocket"};
我有一个 Node.js 服务器使用 socket.io 和一个 android 应用程序。我希望我的应用程序连接到服务器。 (我在当地工作)
首先我启动服务器: command prompt
这是它的代码:
var express = require('express'); // call express
var app = express();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var port = process.env.PORT || 1234;
app.get('/',function(req,res){
res.send("Welcome to my socket");
});
io.on('connection', function (socket) {
console.log('one user connected : '+socket.id);
// when the client emits 'new message', this listens and executes
socket.on('new message', function (data) {
// we tell the client to execute 'new message'
console.log('this is message :',data);
});
});
http.listen(port, function () {
console.log('Server listening at port %d', port);
});
然后我尝试从我的 activity 连接:
public class AvisActivity extends AppCompatActivity {
private Socket mSocket;
{
try {
mSocket = IO.socket("http://172.21.191.234:1234");
} catch (URISyntaxException e) { Log.v("AvisActivity", "error connecting to socket");}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_avis);
Log.v("AvisActivity", "try to connect");
mSocket.connect();
Log.v("AvisActivity", "connection sucessful");
}
}
我的问题是我从未在服务器上看到日志 "one user connected",但我总是在 android 日志上看到 "try to connect" 和“连接成功”。
有人能帮我解开这个谜吗?
更新
我的代码运行良好,但我遇到了一些阻止网络套接字的 Wifi 配置(实际上我的学校确实如此,这就是我的问题所在)
将套接字初始化代码放入 onCreate
方法中,如下所示:
public class AvisActivity extends AppCompatActivity {
private Socket mSocket;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_avis);
try {
mSocket = IO.socket("http://172.21.191.234:1234");
}
catch (URISyntaxException e) {
Log.v("AvisActivity", "error connecting to socket");
}
Log.v("AvisActivity", "try to connect");
mSocket.connect();
Log.v("AvisActivity", "connection sucessful");
}
}
你的代码没问题,它工作正常,你只需要确认你连接的 IP 地址是正确的,并且在 manifest.xml
中添加了 INTERNET 权限<uses-permission android:name="android.permission.INTERNET"/>
更新
我的代码运行良好,但我遇到了一些阻止网络套接字的 Wifi 配置(实际上我的学校确实如此,这就是我的问题所在)。但是我真的不知道他们是怎么屏蔽的。
此外,稍后在我的项目中部署到 OVH 服务器时,使用 1234 端口时出现问题。确保使用您的提供商提供的端口 available/unlocked。
对于在这里谷歌搜索的其他人,这帮助我获得了有关该问题的一些日志信息:
Log.v("AvisActivity", "try to connect");
mSocket.connect();
mSocket.io().on(Manager.EVENT_TRANSPORT, new Emitter.Listener() {
@Override
public void call(Object... args) {
Transport transport = (Transport) args[0];
transport.on(Transport.EVENT_ERROR, new Emitter.Listener() {
@Override
public void call(Object... args) {
Exception e = (Exception) args[0];
Log.e(TAG, "Transport error " + e);
e.printStackTrace();
e.getCause().printStackTrace();
}
});
}
});
对我来说,问题是客户端不会使用 TLSv1.1 或 1.2。在撰写本文时,我还没有弄明白。让我的服务器支持 TLSv1.0 是我目前的解决方法。
在Android的最新版本中,您需要添加AndroidManifest.xml "android: usesCleartextTraffic = true"以允许与纯文本的连接。
示例:
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme"
android:usesCleartextTraffic="true">
对于 API 23 及更高版本,您必须在清单文件中添加 android:usesCleartextTraffic="true"
。
用这一行为我工作:
opts.transports = new String[]{"websocket"};