首页 > 解决方案 > 与连接到同一个公共热点的所有用户聊天的 Android 聊天应用程序

问题描述

我想制作一个 android 应用程序,它在打开时会显示所有附近热点的列表,并且用户可以连接到其中的任何一个。之后,用户可以与通过该应用程序连接到同一公共热点的所有其他用户聊天。用户可以进行私人聊天或群聊。首先,我尝试使用 Nodejs 和 SocketIO 制作我的服务器,但我不知道如何获取所有已连接用户的列表并进行私人聊天。有没有其他更有效的方法来制作一个完全在热点上运行并且不需要互联网就可以运行并且高效的 android 应用程序?

标签: android

解决方案


如果您使用的是 Node.js+socket.io,则需要在连接到 Hotspot 时保存用户。应用程序在热点连接后首先与服务器通信,因为第一个知道如何访问它(例如使用 ip 或域名)。

之后,服务器需要将用户的当前连接(在您的情况下打开的 websocket)保存到具有其他有用数据的结构中,可能是用户 ID。

在一个用户注册后,服务器向客户端发送客户端应用程序可以开始通信的已连接对等点列表(之前保存的用户 ID)

当客户端应用程序选择某人时,服务器会为聊天创建另一个结构并开始将所有消息从应用程序客户端 1 转发到应用程序客户端 2。

为了进行群聊,您需要在服务器级别处理这种情况,您必须将所有涉及的客户端注册到专用结构中。

因此,重新假设,socket.io 处理通信,服务器以适当的方式保存客户端的当前状态和聊天(私人或群组)存储客户端的连接。

如果您只需要使用热点,您有两种方法:

1 - 在您的手机上拥有一项服务,每次它连接到热点时都会向网络发送广播消息。连接到同一个热点的每个其他客户端都会收到该消息,如果它运行相同的服务,它将用另一个数据包应答。之后,起始客户端保存地址并可以与其他客户端通信。(同样的事情可以用相反的方式完成,因为第一个客户端可以向热点发送一个活跃的广播消息,向所有其他客户端发出信号表明它是活跃的并且存在于网络上,但最好不要发送垃圾广播消息,因为它们可以网络拥塞)

2 - 对热点的每个地址进行网络扫描

这两种方式存在一些安全问题(例如,并非所有热点都转发广播数据包,没有人知道连接是否安全,...)。请记住,这两种方法仅适用于本地网络。对于互联网通信,您需要遵循其他方法和方法,并且创建分布式系统的复杂性会上升。

有很多例子,例如

https://dev.to/medaymentn/creating-a-realtime-chat-app-with-android--nodejs-and-socketio-4o55

您可以按照它为您的应用程序创建基础。

您必须添加一些修改才能存储连接到您的服务器的所有用户。在顶部创建具有唯一 id 的对象列表并存储加入客户端的套接字。还创建另一个代表您的私人聊天的对象列表。它们将包含两个用户的 ID。

在您的服务器中,您需要创建一个向您返回客户端 ID 的方法。像这样的东西

socket.on('list-connected-peer',(params)=>{

//get all the ids from the list

socket.emit('response-list-connected-peer',listOfClientsIdJSON);

}

您必须从客户端调用此方法并解析 json 响应以获取您需要的所有 id。

您还需要创建一种将新的私人聊天添加到私人聊天列表的方法。使用与以前相同的策略:

socket.emit('create-private-chat',(params)=>{
//take the other id from the params
//create the chat object
//if you need notify the client that a private chat is created using emit
});

最后你可以做这样的事情

socket.on('private-message',(params)=>{

//get the two ids of the peers from the params,or the name of the chat item you create previously


otherSocket.emit('private-message',JSONmsg);
}

请记住管理用户何时与服务器断开连接。

您还可以看到一些 WebRtc 信令服务器示例,因为它正在执行与您的方法类似的操作,并且网络上的许多实现都使用您正在使用的相同技术(Node.js + Socket.io)。另一个不错的选择是使用 Firebase Cloud Messaging。

希望这对您有所帮助或给您一些提示。

干杯。


推荐阅读