You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Socket.IO客户端无法连接Node.js服务器问题求助

问题:Android客户端无法连接Node.js Socket.IO服务端

我搭建了以Node.js为服务端、Android为客户端的Socket.IO通信环境,Node.js服务端及Node.js客户端代码均可正常运行,但Android Java客户端无法与服务端建立连接。

可正常运行的Node.js服务端代码

const express = require("express")
const { createServer } = require("node:http")
const { Server } = require("socket.io")

const app = express()
const server = createServer(app)
const io = new Server(server)

app.get("/",function(req,res) {
    res.send("<h1>Hello</h1>")
})

io.on("connection",function(socket) {
   console.log("connected")
   socket.on("disconnect",function(msg) {
      console.log("user disconnected",msg);
   });
})

server.listen(4000,"127.0.0.1",function() {
   console.log("listen 4000")
})

可正常运行的Node.js客户端代码

const { io } = require("socket.io-client");

const socket = io("http://127.0.0.1:4000")

socket.on("connect",function() {
   console.log(socket.connected)
  const engine = socket.io.engine;
  console.log(engine.transport.name);
})

无法连接服务端的Android Java客户端代码

package fr.albisys.testio;

import android.os.Bundle;

import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

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

import java.net.URISyntaxException;

import android.util.Log;
import android.widget.EditText;
import android.text.TextUtils;

import org.json.JSONException;
import org.json.JSONObject;


public class MainActivity extends AppCompatActivity {

    private EditText mview;

    private Socket iosocket;

    {
        Log.v("act","IO begin");
        try {
            iosocket = IO.socket("http://127.0.0.1:4000");
        } catch (URISyntaxException e) {
            Log.v("act","URI not good");
            e.printStackTrace();
        }
        Log.v("act","IO later");
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.v("activity","oncreate");
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_main);
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
            Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
            return insets;
        });
        Log.v("activity","onrecv");
        iosocket.on("message", recvMessage);
        Log.v("activity","connect");
        iosocket.connect();
        Log.v("activity","emit");
        iosocket.emit("message","message");
        Log.v("activity","emited");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.v("activity","deco");
        iosocket.disconnect();
        Log.v("activity","onfinish");
        iosocket.off("finish", recvMessage);
    }

    private void sendMessage() {
        String message = mview.getText().toString().trim();
        if (TextUtils.isEmpty(message)) {
            Log.v("sendMsg","empty");
            return;
        }
        mview.setText("");
        iosocket.emit("message", message);
    }
    private Emitter.Listener recvMessage = new Emitter.Listener() {
        @Override
        public void call(final Object... args) {
            MainActivity.this.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Log.v("activity","received");
                    JSONObject data = (JSONObject) args[0];
                    String message;
                    try {
                        message = data.getString("message");
                    } catch (JSONException e) {
                        e.printStackTrace();
                        return;
                    }
                    Log.v("activity",message);
                    mview.setText(message);
                }
            });
        }
    };
}

问题细节

Android端代码可正常执行到onCreate方法,但服务端始终未触发io.on("connection")回调。此前曾遇到IPv4与IPv6不匹配问题,已明确指定使用127.0.0.1。我的笔记本运行Node.js服务端,三星手机通过USB连接笔记本,未连接WiFi或4G网络。

解决方法

最终通过将手机与笔记本连接到同一WiFi网络解决了该问题,感谢@Morrison Chang的帮助。


内容的提问来源于stack exchange,提问作者Gilles

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 16:05:14