Android Node.js Socket.io没有连接

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android Node.js Socket.io没有连接相关的知识,希望对你有一定的参考价值。

我有一个使用socket.io和android应用程序的Node.js服务器。我希望我的应用程序连接到服务器。 (我在当地工作)

所以首先我启动服务器: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);
});

然后我尝试从我的活动连接到这里:

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");

    }
}

我的问题是我从未在服务器上看到“一个用户连接”的日志,但我总是在android日志中看到“尝试连接”和“连接成功”。

有人可以为我解开这个谜团吗?

UPDATE

我的代码工作正常,但我遇到了一些阻止Web套接字的Wifi配置(实际上我的学校做了,这就是我的问题来自哪里)

答案

您的代码很好,它工作正常,您只需要确认您正在连接的IP地址是正确的,还需要在manifest.xml中添加INTERNET权限

<uses-permission android:name="android.permission.INTERNET"/>

enter image description here

另一答案

对于其他在Google上搜索的人,这有助于我获得有关该问题的一些日志信息:

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">

Android Developers > Docs > Guías - Link

另一答案

将您的套接字初始化代码放在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");

    }
}
另一答案

UPDATE

我的代码工作正常,但我遇到了一些阻止Web套接字的Wifi配置(实际上我的学校做了,这就是我的问题来自哪里)。但我真的不知道他们是怎么阻止它的。

此外,在我的项目后期部署到OVH服务器时,我使用1234端口遇到了问题。确保使用提供商提供/解锁的端口。

以上是关于Android Node.js Socket.io没有连接的主要内容,如果未能解决你的问题,请参考以下文章

Android 客户端未从 node.js 服务器接收到 socket.io 消息

带有 Node.js/Socket.IO 服务器和客户端的 Phonegap 应用程序中的 Android 的 WebSockets

无法在 Android 客户端和 Node.js socket.io 服务器之间进行通信

在 android 上解析 socket.io 数据。 (Gottox Socket.IO)

未找到 Socket.io.js(node.js + express + socket.io)

Android socket.io 编码