java 无法从Android应用程序连接到Express服务器

hsgswve4  于 2023-04-19  发布在  Java
关注(0)|答案(1)|浏览(97)

我有一个用express写的后端和一个用java写的android应用程序。

背景:

我想在应用程序和服务器之间创建套接字通信,但无法从应用程序连接到服务器。
后端已经完全测试过了,我可以从postman发送请求,也可以接收数据。这是服务器内部处理socket的代码:

import { Server } from "socket.io";
import { SOCKET_EVENTS } from "../../constants/socket.js";
import { getBlockchainBlock } from "../crypto/crypto.js";

const io = new Server(4000, {
  cors: {
    origin: "*",
  },
});

export const openSocket = () => {
  io.on(SOCKET_EVENTS.CONNECTION, async (socket) => {
    console.log("user connected! socket id:", socket.id);

    io.emit(SOCKET_EVENTS.NEW_TASK, {
      data: await getBlockchainBlock(),
    });

    socket.on(SOCKET_EVENTS.TASK_FINISHED, (data) => {
      console.log("User task is done with data:", data);
    });

    socket.on(SOCKET_EVENTS.DISCONNECT, () => {
      console.log("user disconnected! socket id:", socket.id);
    });
  });
};

Android端

我将socket.io-client库添加到Android应用程序中:

implementation ('io.socket:socket.io-client:2.0.0') {
        exclude group: 'org.json', module: 'json'
    }

我尝试添加套接字库以便与服务器通信:

public class MainActivity extends AppCompatActivity {

    Socket mSocket;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView textView = findViewById(R.id.test);
        textView.setText("Some test");

        Emitter.Listener onNewTask = new Emitter.Listener() {
            @Override
            public void call(final Object... args) {
            }
        };
        Emitter.Listener taskFinished = new Emitter.Listener() {
            @Override
            public void call(final Object... args) {
                mSocket.emit("taskFinished", "Task is finished");
            }
        };

        try {
            mSocket = IO.socket("http://ipAddress:4000");
            mSocket.on("newTask", onNewTask);
            mSocket.on("connection", new Emitter.Listener() {
                @Override
                public void call(Object... args) {
                    System.out.println("Connected to server!");
                }
            });
            mSocket.on("taskFinished", taskFinished);
            mSocket.connect();
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }

    }
}

问题:

我不能看到Connected to server!打印,当我使用调试器调试应用程序的mSocket.connect();行被调用,但从来没有一个连接.此外-我可以看到在后端打印新的连接时,尝试通过 Postman ,但什么都没有显示时,运行Android代码(似乎没有连接)

获取IP地址

服务器位于http://localhost:4000上,根据this thread,我需要将localhost替换为IP地址。
为此,我打开cmd并运行ipconfig命令,将localhost替换为IPv4 Address

额外信息

这些是我在服务器内部使用的常量名称:

export const SOCKET_EVENTS = {
  CONNECTION: "connection",
  NEW_TASK: "newTask",
  TASK_FINISHED: "taskFinished",
  DISCONNECT: "disconnect",
};
e0bqpujr

e0bqpujr1#

你能尝试捕获所有的异常,这样任何异常都会被捕获,并显示堆栈跟踪和错误消息吗?在我看来,你正在尝试建立TCP套接字,所以URL应该是tcp://

相关问题