无法在 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服务器之间连接

如何将数据从 Android 中的数据报套接字发送到 Node js 服务器?

带有 Node.js/Socket.IO 服务器和客户端的 Phonegap 应用程序中的 Android 的 WebSockets

如何使用护照在我的 node.js 服务器上验证 android 应用程序的 GPGS 令牌

Node.js 发送到客户端后无法设置标头

Socket.io 无法在 nginx + node.js + php 应用程序中连接