【问题标题】:Android Node.js Socket.io not connectingAndroid Node.js Socket.io 未连接
【发布时间】:2016-03-20 04:10:48
【问题描述】:

我有一个使用 socket.io 的 Node.js 服务器和一个 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);
});

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

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

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

更新

我的代码运行良好,但我遇到了一些阻止 web 套接字的 Wifi 配置(实际上我的学校就是这样做的,这就是我的问题所在)

【问题讨论】:

    标签: android node.js sockets socket.io connection


    【解决方案1】:

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

    【讨论】:

    • 谢谢。这应该是公认的答案!
    • 我的本地网络面临同样的问题。因为无法连接到套接字。 manifest 已经有这个 android:usesCleartextTraffic="true"。有什么帮助吗?
    【解决方案2】:

    对于 API 23 及更高版本,您必须在清单文件中添加 android:usesCleartextTraffic="true"

    【讨论】:

      【解决方案3】:

      对于在此处使用谷歌搜索的其他人,这有助于我获取有关该问题的一些日志信息:

      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 流量” - 如果没有您的 sn-p,我无法到达那里!非常感谢。
      【解决方案4】:

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

      【讨论】:

      • 在服务器上仍然看不到它:/
      • 您是否从浏览器尝试过?
      • 是的,来自谷歌浏览器。当我去 http:localhost:1234 时,有同样的问题:服务器日志上没有事件。但页面显示“欢迎使用我的套接字”作为指示。
      • 尝试在connection 中评论socket.on 块。
      • 仍然缺少消息:/
      【解决方案5】:

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

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

      【讨论】:

      • 我忘记了这个权限,我失去了我的时间。谢谢:)
      【解决方案6】:

      更新

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

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

      【讨论】:

        【解决方案7】:

        用这条线为我工作:

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

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

        【讨论】:

          猜你喜欢
          • 2021-03-13
          • 1970-01-01
          • 2018-05-14
          • 2016-11-06
          • 1970-01-01
          • 2017-06-10
          • 2021-04-03
          • 2021-06-05
          • 1970-01-01
          相关资源
          最近更新 更多