我正在为我的大学建立一个出勤申请,我希望通过网络标记学生的出勤率。每个教室都有单独的路由器,我想基本检查学生是否坐在路由器的范围内,并相应地标记他们的出勤率。如何检查路由器的范围是否存在,是否可以通过Web套接字进行检查?或者我如何通过网络套接字ping或做某事来检查特定的IP是否存活?
我正在使用kotlin来开发我的应用程序。请帮忙。
我如何通过网络套接字ping或做某事来检查特定的IP是否存活?
你不能强迫客户端只允许你使用他们的IP地址ping他们。最好的方法是将用户连接到中央服务器(通过示例中的websocket)并检查websocket上的心跳。
为此,当然您必须首先授权您的学生,并确保每个人都在他们的websocket上有一个令牌,以便您可以跟踪他们在您的系统中的存在。那你需要某种心跳系统。我见过的大多数websocket实现已经实现了ping
和pong
。它可以双向工作:
有一点,检查是否连接了其他点应发送ping
请求,另一点如果连接则自动发回pong
消息。
在我们写的应用程序中,我们有间隔向客户发送ping,我们坚持他们的pong时间戳。如果最后一个乒乓时间戳太旧,那么我们就知道连接失败或客户端在网络上不可用。
虽然,如果websocket关闭或面临错误,会调用一个方法(如onError()
和onClose()
),然后通知您。但实现心跳服务可以帮助您确保您的连接确实存在,并且必须在基于websocket的系统中使用。
如何检查路由器的范围是否存在,是否可以通过Web套接字进行检查?
如果我没错,你负责设计应用程序的两面(客户端和服务器)。因此,您可以让用户一次又一次地尝试连接到您的LOCAL IP地址,直到连接成功。您只需确保通过其他路由器可以访问您的服务器IP地址。
注意:在本地网络上,如果学生不能使用其他教室路由器连接,那么您可以检查他们的websocket IP地址。在此之前,应该有一个表将每个用户映射到他们可以发送消息的IP地址。
实现此目的的另一种方法如果您的服务器不在本地网络中,则为这些路由提供相同的公共IP地址(或静态IP地址),并将您的流量通过Internet路由到您的服务器公共IP地址。然后,为了确保用户只能从这些路由器(在这些路由器的范围内)进行连接,您必须在服务器防火墙中允许这些路由器的IP地址(或者您可以在服务器应用程序端执行此操作)并阻止您的任何其他连接。 websocket端口。
再次注意2,如果您的服务器不在本地网络中,但您仍想确保每个用户都在其有效的教室中,则需要一个代理服务器。像这样工作:
客户端连接到其教室路由器>路由器连接到本地代理服务器>代理服务器将路由器IP地址添加到websocket消息并将其发送到公共服务器>公共服务器可以处理消息并具有用户本地IP地址
你可以ping IP。但是,似乎每个学生都应该获得每个班级的永久本地知识产权。这是如何ping到IP的示例:
fun ping(ip: String): String {
var str = ""
try {
val process = Runtime.getRuntime().exec(
"/system/bin/ping -c 8 " + ip)
val reader = BufferedReader(InputStreamReader(
process.inputStream))
var i: Int
val buffer = CharArray(4096)
val output = StringBuffer()
i = reader.read(buffer)
while (i > 0) {
output.append(buffer, 0, i)
i = reader.read(buffer)
}
reader.close()
str = output.toString()
} catch (e: IOException) {
e.printStackTrace()
}
return str
}
只有在他/她处于特定的坐标或GPS位置时,为什么不能让用户登录应用程序,而不是通过IP地址进行检查。这样,即使您的IP地址将来发生变化,也无需更新应用。
在您的服务器中,保留每个班级的位置列表。只有当学生在该位置范围内时,才允许他/她登录该应用程序。
有关详细信息,请参阅Check if a latitude and longitude is within a circle。
您可以找到的唯一位置是路由器的ARP表。终端不能保证返回它没有要求的任何内容,而路由器需要这些信息才能正确地将流量回流到终点。