Java实现SDN拓扑获取

Java实现SDN拓扑获取

思路

  • 由于Java调用北向接口过程复杂,故此处编写Python脚本获取拓扑
  • 使用Jython包完成Pyhon脚本的调用
  • 考虑到PythonJava的数据结构难以直接转换,这里选择将脚本获取的拓扑用无向图的形式保存本地文件topo.txt
  • 通过Java读取本地文件,并进行处理分析,发送到前端

实现

Python脚本编写

  • 引入相关包

    import sdn_net as sn import networkx as nx import json

    此处利用了networkxGraph图结构;json用于将数据转化为字典集;sdn_net是之前写的流表下发和拓扑抽象的脚本,此处引用其中的函数其实就是懒

  • 调用北向接口获取链路信息

    G = nx.Graph() status,resp = sn.get_links(ip) resp = json.loads(resp) for i in resp["links"]: G.add_edge(i["src"]["device"],i["dst"]["device"])

    这里使用了Graph做无向图,解决了链路双向的处理问题

  • 写入本地文件

    # 清空文件 f = open('topo.txt', 'w') f.write('') f.close() # 写入文件 f = open('topo.txt', 'a') for i in G.edges(): f.write(i[0]+' '+i[1]+'\n')

    因为每次获取链路的状态应更新原来的状态,所以需要每次清空文件再进行写入

    此处如果不写明topo.txt的绝对路径,在之后的Java调用中会默认保存到Java项目目录下

  • 文件形式改为Json

    和前端兄弟商定后,要达到如下效果

    故改装代码

    filename = "{YOUR PATH}/topo.json" topo = [] for i in G.edges(): topo.append({"a":i[0],"b":i[1]}) with open(filename, 'w') as file_obj: json.dump(topo, file_obj)

    Json对于前端操作更加方便,此处改用Json存储

Java调用Python脚本

  • 导入Jython

    (虽然没用上,万一以后有用呢)

    1. Jython官网下载,得到安装包,使用口令进行安装

      java -jar jython_installer-{VERSION}.jar
    2. 到安装位置找到jython.jar复制放入src->lib

    3. 右键lib,选择add as library即可完成载入

  • Java调用get_topo.py

    • 启用Runtime.getRuntime().exec()函数,由于是在Linux系统下进行,需要修改参数

      String cmd = "python3 {YOUR PATH}/get_topo.py"; Runtime.getRuntime().exec(new String[]{"/bin/sh", "-c", cmd});

      这里的命令行如果含有空格或|需要组合成String形式导入,否则命令不运行


__EOF__

本文作者ch3uhx9
本文链接https://www.cnblogs.com/cheuhxg/p/14352930.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   CH3UHX9  阅读(378)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示