簡體   English   中英

Android Node.js Socket.io 未連接

[英]Android Node.js Socket.io not connecting

我有一個使用 socket.io 的 Node.js 服務器和一個 android 應用程序。 我希望我的應用程序連接到服務器。 (我在當地工作)

所以首先我啟動服務器:命令提示符

這是它的代碼:

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 日志上看到“嘗試連接”和“連接成功”。

有人可以為我解開這個謎嗎?

更新

我的代碼運行良好,但我遇到了一些阻止網絡套接字的 Wifi 配置(實際上我的學校做到了,這就是我的問題所在)

在最新版本的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 開發者 > 文檔 > Guías - 鏈接

對於 API 23 及更高版本,您必須在清單文件中添加android:usesCleartextTraffic="true"

對於在這里使用谷歌搜索的其他人,這幫助我獲得了有關該問題的一些日志信息:

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 是我目前的解決方法。

將您的套接字初始化代碼放在您的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"/>

在此處輸入圖片說明

更新

我的代碼運行良好,但我遇到了一些阻止 Web 套接字的 Wifi 配置(實際上我的學校做到了,這就是我的問題所在)。 但我真的不知道他們是如何阻止它的。

此外,稍后在我的項目中,當我部署到 OVH 服務器時,我在使用 1234 端口時遇到了問題。 確保使用您的提供商可用/解鎖的端口。

看看這個答案,用這一行對我有用:

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM