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
相关产品推荐
相关产品推荐

