与连接到同一个公共热点的所有用户聊天的 Android 聊天应用程序
Posted
技术标签:
【中文标题】与连接到同一个公共热点的所有用户聊天的 Android 聊天应用程序【英文标题】:Android Chat App that chat with all the users that are connected to the same public hotspot 【发布时间】:2019-08-21 05:06:01 【问题描述】:我想制作一个 android 应用程序,它在打开时会显示所有附近热点的列表,并且用户可以连接到其中的任何一个。之后,用户可以与通过该应用程序连接到同一公共热点的所有其他用户聊天。用户可以进行私人聊天或群聊。 首先,我尝试使用 Nodejs 和 SocketIO 制作我的服务器,但我不知道如何获取所有已连接用户的列表并进行私人聊天。 有没有其他更有效的方法来制作完全在热点上运行且不需要互联网即可运行且高效的 Android 应用程序?
【问题讨论】:
【参考方案1】:如果您使用的是 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 云消息传递。
希望这对您有所帮助或给您一些提示。
干杯。
【讨论】:
我实际上遵循了相同的教程。但是我无法实现与其他用户进行一对一聊天的相同功能。您能帮忙吗? 我已经用一些 sn-ps 代码更新了我的答案。在您最初的问题中也向其他用户提供更多关于您的问题的详细信息。以上是关于与连接到同一个公共热点的所有用户聊天的 Android 聊天应用程序的主要内容,如果未能解决你的问题,请参考以下文章
QThread 线程间通信:连接到 &QThread::quit 与连接到 lambda [&thread] thread->quit(); 的奇怪行为
FirebaseInstanceId.getInstanceId()与连接到iPhone WearOS设备上SERVICE_NOT_AVAILABLE失败