Android 上的 Socket IO 连接失败

Posted

技术标签:

【中文标题】Android 上的 Socket IO 连接失败【英文标题】:Socket IO connection fails on Android 【发布时间】:2020-03-25 19:04:31 【问题描述】:

我正在尝试使用 Socket IO、android 和 Node 创建一个简单的聊天。 当我运行应用程序并尝试连接到服务器时,它总是失败并出现超时错误,我不知道为什么。

这是节点代码:

app = require('express')()
http = require('http').createServer(app)
io = require('socket.io')(http)

app.get('/', (req,res) => 

    res.send('Chat server is running on port 5000')
)

/**
 * Defines a listener to an event called connection and this event will be fired from the client side
 */
io.on('connection', (socket) => 

    console.log('user connected')
)

http.listen(5000, () => 

    console.log('Node app is running on port 5000')
)

这是 Android 代码(根据 Marcos Casagrande 回答编辑

import com.github.nkzawa.socketio.client.IO;
import com.github.nkzawa.socketio.client.Socket;
import com.github.nkzawa.engineio.client.transports.WebSocket;

protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_chat);

    Intent intent = getIntent();
    if(intent.hasExtra(NICKNAME))

        mNickname = intent.getStringExtra(NICKNAME);
        Log.d(TAG, "chatapp onCreate: " + mNickname);
    

    try 

        IO.Options opts = new IO.Options();
        opts.transports = new String[]WebSocket.NAME;
        mSocket = IO.socket("http://10.0.0.21:5000", opts);

        mSocket.on(Socket.EVENT_CONNECT, new Emitter.Listener() 
            @Override
            public void call(Object... args) 
                Log.d(TAG, "chatapp call: connected to server");
            
        );

        mSocket.on(Socket.EVENT_DISCONNECT, new Emitter.Listener() 
            @Override
            public void call(Object... args) 
                Log.d(TAG, " chatapp call: disconnected from the server");
            
        );

        mSocket.on(Socket.EVENT_CONNECT_ERROR, new Emitter.Listener() 
            @Override
            public void call(Object... args) 
                Log.d(TAG, "chatapp call: connection error");
            
        );

        mSocket.on(Socket.EVENT_CONNECT_TIMEOUT, new Emitter.Listener() 
            @Override
            public void call(Object... args) 
                Log.d(TAG, "chatapp call: connection timeout");
            
        );

        mSocket.connect();

     catch (Exception e) 
        Log.d(TAG, "onCreate: something unexpected happened");
        e.printStackTrace();
    

我尝试通过 Android Studio 在虚拟设备上运行应用程序,但不断收到连接超时错误。谁能告诉我,我做错了什么?

【问题讨论】:

【参考方案1】:

连接不会立即发生,它是异步的,attach the correct handlers 并检查那里的连接或错误。

mSocket = IO.socket("http://localhost:5000");

mSocket.on(Socket.EVENT_CONNECT, onConnect);
mSocket.on(Socket.EVENT_DISCONNECT, onDisconnect);
mSocket.on(Socket.EVENT_CONNECT_ERROR, onConnectError);
mSocket.on(Socket.EVENT_CONNECT_TIMEOUT, onConnectError);

mSocket.connect();
// ....

private Emitter.Listener onConnect = new Emitter.Listener() 
    @Override
    public void call(Object... args) 
        Log.d(TAG, "connected...");
        // This doesn't run in the UI thread, so use: 
        // .runOnUiThread if you want to do something in the UI

    
;

private Emitter.Listener onConnectError = new Emitter.Listener() 
    @Override
    public void call(Object... args) 
        Log.d(TAG, "Error connecting...");
    
;

我建议在android中使用WebSocket传输,以避免轮询错误,您可以在这里查看我的答案:

How to set transports for SocketIO in Android?

【讨论】:

谢谢,我根据你的建议修改了代码。但是,我仍然收到错误xhr poll error。不过我仍然会接受你的回答,因为它帮助我解决了我的问题。 你应该避免在android中使用长轮询,使用websocket传输。在这里查看我的其他答案:***.com/questions/44015305/… 你看到服务器中的连接了吗? 不,我在服务器上看不到任何日志。我只看到listen 消息 您使用的是私有IP,您确定您的手机可以访问该IP吗?转到您的手机浏览器并转到该 URL:"http://10.0.0.21:5000"【参考方案2】:

您必须使用 2 个 AVD 而不是物理设备来连接此 IP。如果现在尝试使用http://10.0.2.2:5000

【讨论】:

以上是关于Android 上的 Socket IO 连接失败的主要内容,如果未能解决你的问题,请参考以下文章

移动网络中 8080 或 80 端口上的 WebSocket 连接失败

如何在 Socket.IO 中模拟连接失败

Socket.io - 失败:连接在收到握手响应之前关闭

socket.io 连接在生产中失败,在 localhost 中工作

如果连接了 Socket.io,Alamofire 请求总是失败并显示“请求超时”

Android 上的 WebSockets 与 Android 中的 socket.io