Android无法连接Node.js Socket.io

4
我是一位可靠的助手,可以为您翻译以下内容:

我有一个使用socket.io的Node.js服务器和一个安卓应用程序。我想让我的应用连接到服务器。(我在本地工作)

首先,我启动服务器: 命令提示符

这是它的代码:

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日志中看到“尝试连接”和“连接成功”。

有人能为我解决这个谜团吗?

更新

我的代码运行良好,但我遇到了一些Wi-Fi配置,它会阻止Web套接字(实际上是我的学校导致了我的问题)。

7个回答

25
在最新版本的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


2
谢谢。这应该是被接受的答案!! - miraquee
面对我的本地网络相同的问题。无法连接到套接字,清单已经拥有此android:usesCleartextTraffic="true"。需要帮助吗? - Muhammad Ali

13

针对API 23及以上版本,您需要在清单文件中添加android:usesCleartextTraffic="true"


7

如果有其他人在此搜索,这将帮助我获取有关问题的某些日志信息:

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是当前的解决方法。


对我来说,错误是“不允许明文HTTP流量”,如果没有你的片段,我就无法到达那里!非常感谢。 - Nikhil Baliga

2
将socket初始化代码放在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");

    }
}

仍然没有在服务器上看到它:/ - Melanie Journe
你尝试过从浏览器中尝试吗? - Prerak Sola
是的,使用 Google Chrome 浏览器。当我访问 http:localhost:1234 时,出现了同样的问题:服务器日志上没有任何事件。但页面显示“欢迎来到我的套接字”,如指示。 - Melanie Journe
尝试在connection中注释掉socket.on块。 - Prerak Sola
仍然缺少消息:/ - Melanie Journe
好的,我在学校用公共WiFi进行测试时可能出了问题,现在回到家里就可以正常工作了。很奇怪。 - Melanie Journe

2

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

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

enter image description here


我忘记了这个权限,结果浪费了好几个小时。谢谢 :) - Jithin Lukose

0

更新

我的代码运行良好,但我遇到了一些Wi-Fi配置问题,导致Web套接字被阻止(实际上是我的学校这样做的,这就是我的问题所在)。但我不知道他们是如何阻止它的。

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


-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接