我想制作一个Android应用程序,该应用程序在打开时显示附近所有热点的列表,并且用户可以连接到其中任何一个。之后,该用户可以与通过该应用程序连接到同一公共热点的所有其他用户聊天。用户可以进行私人聊天或群聊。 首先,我尝试使用Nodejs和SocketIO来创建服务器,但是我不知道如何获取所有已连接用户的列表并进行私人聊天。 有没有其他更有效的方法来使android应用程序完全在热点上运行,并且不需要互联网就可以正常工作并且效率很高?
答案 0 :(得分:0)
如果使用的是Node.js + socket.io,则需要在用户连接到Hotspot时保存该用户。 该应用程序首先在热点连接后与服务器通信,因为第一个知道如何访问服务器(例如,使用IP或域名)。
此后,服务器需要将用户的当前连接(在您的情况下为打开的websocket)保存到具有其他有用数据(可能是用户ID)的结构中。
注册一个用户后,服务器将客户端应用程序可以在其上开始通信的已连接对等方列表(以前保存的用户ID)发送给客户端
当客户端应用选择某人时,服务器将为聊天创建另一个结构,并开始将所有消息从应用客户端1转发到应用客户端2。
要进行群聊,您需要在服务器级别处理这种情况,在这种情况下,必须将所有涉及的客户端注册到专用结构中。
因此,为了重新假定,socket.io处理通信,服务器保存客户机的当前状态,并以适当的方式存储客户机的连接的聊天记录(私有或组)。
如果您只需要使用Hotspot,则有两种方法可以实现:
1-手机上有一项服务,每次将其连接到热点时,都会向网络发送广播消息。 连接到同一热点的每个其他客户端都会收到该消息,并且如果它将运行相同的服务,它将使用另一个数据包进行应答。 之后,启动客户端将保存地址并可以与其他客户端通信。 (可以用相反的方式完成同一件事,因为第一个客户端可以向热点发送实时广播消息,向所有其他客户端发送信号,通知该客户端仍然存在并且存在于网络中,但是最好不要发送垃圾邮件,因为它们可以阻塞网络)
2-对热点的每个地址进行网络扫描
这两种方式都存在一些安全问题(例如,并非所有热点都转发广播数据包,没人知道连接是否安全...)。请记住,这两种方法仅适用于本地网络。对于Internet通信,您还需要遵循其他方法和方法,并且创建分布式系统的复杂性也会增加。
有很多例子,例如
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。
希望这会有所帮助或给您一些提示。
干杯。