【问题标题】:android app socket.io not connecting to node.js server but android browser makes connectionandroid app socket.io 未连接到 node.js 服务器但 android 浏览器建立连接
【发布时间】:2016-11-06 21:48:03
【问题描述】:

我已经设置 node.js 服务器在端口 3000 上运行。从我的笔记本电脑浏览器连接成功,我可以在控制台日志中看到结果。

在我的android客户端中,我使用了nkzawa's Socket.io库,但它没有与服务器建立连接,当我尝试在我的android浏览器中打开http://i.p.addr:PORT时,连接成功。

可以肯定的是,我使用ngrok 为我的 localhost:PORT 创建了一个公共 DNS。当我使用 ngrok 的公共 DNS 进行 Socket 连接时,android 会抛出一个错误,提示 Internet 权限被拒绝并且无法解析主机名。 (是因为重定向吗?)但该地址在笔记本电脑和移动浏览器上运行良好。

我完全被困在这里。 Android Socket.io 未连接到服务器。我正在关注这个tutorial。我错过了什么?

服务器:

 var express = require('express');
 var app = express();
 var server = require('http').createServer(app);
 var io = require('socket.io').listen(server);  


 connections =[];

 server.listen(3000);
 console.log("server running ...");

 app.get('/', function(req, res){
    res.sendFile(__dirname + '/index.html');
 });

 io.sockets.on('connection', function(socket) {
    connections.push(socket);
    console.log("new connection");
    console.log('connected: %s sockets', connections.length);

    // Disconeect
    socket.on('disconnect', function(data){
        connections.splice(connections.indexOf(socket),1);
        console.log('Disconnection');
        console.log('connected: %s sockets', connections.length);
    }); 

  });

Android 客户端:

import io.socket.client.IO;
import io.socket.client.Socket;


public class MainActivity extends AppCompatActivity {
    private  static  final String TAG = "MainActivity" ;
    private Socket mSocket;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        try{
            Log.i(TAG, "Attempting socket connection");
            mSocket = IO.socket("http://10.10.11.44:3000/");
        }
        catch (URISyntaxException e){
            Toast.makeText(getApplicationContext(),"Not connected",Toast.LENGTH_LONG).show();
            Log.i(TAG, "ERROR : Socket connection failed");
            throw new RuntimeException();
        }

        mSocket.connect();
        if(mSocket.connected()){
            Log.i(TAG, "Socket connection successful");
        }
        else{
            Log.i(TAG, "Socket connection failed");
        }

    }
  .
  .
  .

Android 客户端清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.batmanlost.chatapp" >

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

【问题讨论】:

    标签: android node.js sockets socket.io


    【解决方案1】:

    回复可能为时已晚,但您能否在 Android 应用中将这个“http://10.10.11.44:3000/”替换为“http://i.p.addr:3000”。

    【讨论】:

      【解决方案2】:

      如果您使用模拟器进行测试,请使用 localhost 地址作为“http://10.0.2.2:3000” 如果您使用移动设备进行测试,那么您需要将您的手机连接到您的电脑/笔记本电脑所连接的同一网络,然后使用上面给出的相同地址进行连接。

      【讨论】:

        猜你喜欢
        • 2016-03-20
        • 1970-01-01
        • 2011-06-11
        • 2017-01-07
        • 1970-01-01
        • 2014-10-03
        • 1970-01-01
        • 2014-07-20
        • 2021-04-02
        相关资源
        最近更新 更多