无法在 Android 客户端和 Node.js socket.io 服务器之间进行通信
Posted
技术标签:
【中文标题】无法在 Android 客户端和 Node.js socket.io 服务器之间进行通信【英文标题】:Unable to communicate between Android client and Node.js socket.io server 【发布时间】:2021-09-29 16:39:53 【问题描述】:我看过很多关于这方面的教程,但它们似乎都不起作用,所以不知道是服务器、客户端还是我的网络上的潜在东西阻止了它,我不知道,所以我来这里寻求帮助。
仅供参考,这是主要依据的教程:https://socket.io/blog/native-socket-io-and-android/
所以这是我的服务器。目前它应该做的就是检测用户何时连接,然后检测用户发送消息并将其发送回所有客户端。
index.js
const express = require("express");
const app = express();
const path = require("path");
const server = require("http").createServer(app);
const io = require("socket.io")(server);
server.listen(3000, () =>
console.log("Server listening at 3000");
);
app.use(express.static(path.join(__dirname, "public")));
io.on("connection", (socket) =>
console.log("User connected");
socket.on("new message", (data) =>
console.log("New message" + data)
socket.emit("new message",
message: data
);
)
);
我的 Android 客户端由 3 个类组成。但为了尽量缩短这个时间,我只包括其中的 2 个,好像问题可以在这些中找到,它可以在第 3 个中修复。
这是在开始时启动的内容,只需按下按钮即可将您带到主要的“聊天”部分,但在单击按钮时,服务器应该记录连接,但控制台中不会出现任何内容。所以我只能假设套接字连接由于某种原因不起作用。你也可以忽略昵称,我还没有实现,一直在尝试让主要部分先工作。
MainActivity.java
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Button;
import android.widget.EditText;
import io.socket.client.Socket;
public class MainActivity extends AppCompatActivity
private EditText nickname;
private Button enterChat;
private Socket mSocket;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
nickname = findViewById(R.id.nickname);
enterChat = findViewById(R.id.enterChat);
ChatApplication app = (ChatApplication) getApplication();
mSocket = app.getSocket();
mSocket.connect();
enterChat.setOnClickListener(v ->
mSocket.emit("connection");
Intent i = new Intent(MainActivity.this, ChatActivity.class);
i.putExtra("name", nickname.getText().toString());
startActivity(i);
);
这只是为了能够从任何其他活动中获取 Socket。
ChatApplication.java
import android.app.Application;
import java.net.URISyntaxException;
import io.socket.client.IO;
import io.socket.client.Socket;
public class ChatApplication extends Application
private Socket mSocket;
try
//My IPv4 address here
mSocket = IO.socket("http://xxx.xxx.x.xxx:3000");
catch (URISyntaxException e)
throw new RuntimeException(e);
public Socket getSocket()
return mSocket;
任何帮助表示赞赏:)
【问题讨论】:
【参考方案1】:发现问题,我需要将这个添加到AndroidManifest.xml中
<application
...
android:usesCleartextTraffic="true"
...
</application>
【讨论】:
以上是关于无法在 Android 客户端和 Node.js socket.io 服务器之间进行通信的主要内容,如果未能解决你的问题,请参考以下文章
如何将数据从 Android 中的数据报套接字发送到 Node js 服务器?
带有 Node.js/Socket.IO 服务器和客户端的 Phonegap 应用程序中的 Android 的 WebSockets