我有一个用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",
};
1条答案
按热度按时间e0bqpujr1#
你能尝试捕获所有的异常,这样任何异常都会被捕获,并显示堆栈跟踪和错误消息吗?在我看来,你正在尝试建立TCP套接字,所以URL应该是
tcp://