diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml
index e33e3e5..ba6eba2 100644
--- a/.idea/dataSources.xml
+++ b/.idea/dataSources.xml
@@ -8,5 +8,17 @@
jdbc:sqlite:$PROJECT_DIR$/../网络仿真/NetworkAnalog/network.db
$ProjectFileDir$
+
+ sqlite.xerial
+ true
+ org.sqlite.JDBC
+ jdbc:sqlite:D:\头哥\NetworkAnalog\datas\network.db
+ $ProjectFileDir$
+
+
+ file://$APPLICATION_CONFIG_DIR$/jdbc-drivers/Xerial SQLiteJDBC/3.40.1/org/xerial/sqlite-jdbc/3.40.1.0/sqlite-jdbc-3.40.1.0.jar
+
+
+
\ No newline at end of file
diff --git a/NetworkAnalog/NetworkAnalog.py b/NetworkAnalog/NetworkAnalog.py
index 33674dc..7622f79 100644
--- a/NetworkAnalog/NetworkAnalog.py
+++ b/NetworkAnalog/NetworkAnalog.py
@@ -467,6 +467,15 @@ class NetWorkAnalog(Canvas):
conn_obj.ConfigCorrect = key[1]
self.tag_bind_event()
+ def show_obj(self, AllSimObj, conns):
+ self.AllSimObjs = AllSimObj
+ self.conns = conns
+ for key, sim_obj in self.AllSimObjs.items():
+ print(key)
+ sim_obj.create_img()
+ for conn in self.conns:
+ conn.draw_line()
+
def delete_obj(self):
# todo: 删除对象
"""
@@ -919,32 +928,7 @@ class NetWorkAnalog(Canvas):
self.AllSimObjs.clear()
self.conns.clear()
- def create_widget(self):
- # todo: 创建页面
- """
- 创建整体页面布局
- :return:
- """
- self.create_rectangle(0, 0, self.width * 0.8, self.height * 0.85, outline="#7f6000", width=3) # 矩形框,左上角坐标,右下角坐标
- round_rectangle(self, self.width * 0.82, 30, self.width * 0.98, self.height * 0.85 / 2 - 30, outline="#ffff00", width=3, fill="#f4b88e") # 矩形框,左上角坐标,右下角坐标
- self.create_text(self.width * 0.82 + 120, 30 + 15, text="网络配置信息", anchor="n", font=('微软雅黑', 18, 'bold'))
- round_rectangle(self, self.width * 0.82, self.height * 0.85 / 2, self.width * 0.98, self.height * 0.85 - 30, outline="#ffff00", width=2, fill="#f4b88e") # 矩形框,左上角坐标,右下角坐标
- self.create_text(self.width * 0.82 + 120, self.height * 0.85 / 2 + 15, text="路由/交换表信息", anchor="n", font=('微软雅黑', 18, 'bold'))
- # 显示左边的固定图片
- img_height, text_height, split_width = self.height - 120, self.height - 60, 120
- self.create_text(split_width, text_height, text="路由器", anchor="nw", font=('微软雅黑', 18, 'bold')) # 显示文字
- router = self.create_image(split_width, img_height, image=self.router_img, anchor="nw")
- self.create_text(split_width * 2, text_height, text="交换机", anchor="nw", font=('微软雅黑', 18, 'bold')) # 显示文字
- switch = self.create_image(split_width * 2, img_height, image=self.switch_img, anchor="nw")
- self.create_text(split_width * 3, text_height, text="集线器", anchor="nw", font=('微软雅黑', 18, 'bold')) # 显示文字
- hub = self.create_image(split_width * 3, img_height, image=self.hub_img, anchor="nw")
- self.create_text(split_width * 4, text_height, text="主机", anchor="nw", font=('微软雅黑', 18, 'bold')) # 显示文字
- host = self.create_image(split_width * 4, img_height, image=self.host_img, anchor="nw")
- self.bind_event(router, "路由器")
- self.bind_event(switch, "交换机")
- self.bind_event(hub, "集线器")
- self.bind_event(host, "主机")
-
+ def create_config_button(self):
# 创建一个菜单栏,这里我们可以把他理解成一个容器,在窗口的上方
menubar = tk.Menu(root)
# 定义一个空菜单单元
@@ -975,7 +959,32 @@ class NetWorkAnalog(Canvas):
menubar.add_command(label='清除屏幕', command=self.clear_canvas)
root.config(menu=menubar)
- self.reload_data()
+
+ def create_widget(self):
+ # todo: 创建页面
+ """
+ 创建整体页面布局
+ :return:
+ """
+ self.create_rectangle(0, 0, self.width * 0.8, self.height * 0.85, outline="#7f6000", width=3) # 矩形框,左上角坐标,右下角坐标
+ round_rectangle(self, self.width * 0.82, 30, self.width * 0.98, self.height * 0.85 / 2 - 30, outline="#ffff00", width=3, fill="#f4b88e") # 矩形框,左上角坐标,右下角坐标
+ self.create_text(self.width * 0.82 + 120, 30 + 15, text="网络配置信息", anchor="n", font=('微软雅黑', 18, 'bold'))
+ round_rectangle(self, self.width * 0.82, self.height * 0.85 / 2, self.width * 0.98, self.height * 0.85 - 30, outline="#ffff00", width=2, fill="#f4b88e") # 矩形框,左上角坐标,右下角坐标
+ self.create_text(self.width * 0.82 + 120, self.height * 0.85 / 2 + 15, text="路由/交换表信息", anchor="n", font=('微软雅黑', 18, 'bold'))
+ # 显示左边的固定图片
+ img_height, text_height, split_width = self.height - 120, self.height - 60, 120
+ self.create_text(split_width, text_height, text="路由器", anchor="nw", font=('微软雅黑', 18, 'bold')) # 显示文字
+ router = self.create_image(split_width, img_height, image=self.router_img, anchor="nw")
+ self.create_text(split_width * 2, text_height, text="交换机", anchor="nw", font=('微软雅黑', 18, 'bold')) # 显示文字
+ switch = self.create_image(split_width * 2, img_height, image=self.switch_img, anchor="nw")
+ self.create_text(split_width * 3, text_height, text="集线器", anchor="nw", font=('微软雅黑', 18, 'bold')) # 显示文字
+ hub = self.create_image(split_width * 3, img_height, image=self.hub_img, anchor="nw")
+ self.create_text(split_width * 4, text_height, text="主机", anchor="nw", font=('微软雅黑', 18, 'bold')) # 显示文字
+ host = self.create_image(split_width * 4, img_height, image=self.host_img, anchor="nw")
+ self.bind_event(router, "路由器")
+ self.bind_event(switch, "交换机")
+ self.bind_event(hub, "集线器")
+ self.bind_event(host, "主机")
if __name__ == '__main__':
@@ -991,5 +1000,7 @@ if __name__ == '__main__':
(screen_height - root_attr['height']) / 2 - 30)
canvas = NetWorkAnalog(root, width=root_attr['width'], heigh=root_attr['height'], bg="white")
canvas.place(x=0, y=0, anchor='nw')
+ canvas.create_config_button()
+ canvas.reload_data()
root.geometry(size)
root.mainloop()
diff --git a/NetworkAnalog/SimObjs.py b/NetworkAnalog/SimObjs.py
index 6c27b31..82e5c41 100644
--- a/NetworkAnalog/SimObjs.py
+++ b/NetworkAnalog/SimObjs.py
@@ -26,6 +26,22 @@ class SimBase():
self.ObjX = x
self.ObjY = y
self.canvas = canvas
+ self.host_img = ImageTk.PhotoImage(
+ Image.open(sys.path[0] + "/../datas/images/主机.png").resize((60, 60)))
+ self.host_img_tm = ImageTk.PhotoImage(
+ Image.open(sys.path[0] + "/../datas/images/主机_tm.png").resize((60, 60)))
+ self.router_img = ImageTk.PhotoImage(
+ Image.open(sys.path[0] + "/../datas/images/路由器.png").resize((60, 60)))
+ self.router_img_tm = ImageTk.PhotoImage(
+ Image.open(sys.path[0] + "/../datas/images/路由器_tm.png").resize((60, 60)))
+ self.switch_img = ImageTk.PhotoImage(
+ Image.open(sys.path[0] + "/../datas/images/交换机.png").resize((60, 60)))
+ self.switch_img_tm = ImageTk.PhotoImage(
+ Image.open(sys.path[0] + "/../datas/images/交换机_tm.png").resize((60, 60)))
+ self.hub_img = ImageTk.PhotoImage(
+ Image.open(sys.path[0] + "/../datas/images/集线器.png").resize((60, 60)))
+ self.hub_img_tm = ImageTk.PhotoImage(
+ Image.open(sys.path[0] + "/../datas/images/集线器_tm.png").resize((60, 60)))
self.img = None
self.img_tm = None
self.interface = [{}, {}, {}, {}]
@@ -94,6 +110,18 @@ class SimBase():
创建图片
:return:
"""
+ if self.ObjType == 1:
+ self.img = self.host_img
+ self.img_tm = self.host_img_tm
+ elif self.ObjType == 2:
+ self.img = self.router_img
+ self.img_tm = self.router_img_tm
+ elif self.ObjType == 3:
+ self.img = self.switch_img
+ self.img_tm = self.switch_img_tm
+ else:
+ self.img = self.hub_img
+ self.img_tm = self.hub_img_tm
self.canvas.delete("L")
id = self.canvas.create_image(self.ObjX - 30, self.ObjY - 30,
image=self.img if self.ConfigCorrect == 1 else self.img_tm, anchor="nw",
@@ -455,10 +483,7 @@ class SimHost(SimBase):
self.interface = [{}]
self.connections = [None]
self.set_default_config()
- self.img = ImageTk.PhotoImage(
- Image.open(sys.path[0] + "/../datas/images/主机.png").resize((60, 60)))
- self.img_tm = ImageTk.PhotoImage(
- Image.open(sys.path[0] + "/../datas/images/主机_tm.png").resize((60, 60)))
+
def create_packet(self, ip, mac, message):
"""
@@ -519,10 +544,6 @@ class SimRouter(SimBase):
self.ObjLabel = label if label is not None else self.set_default_name()
self.router_table = {}
self.set_default_router_table()
- self.img = ImageTk.PhotoImage(
- Image.open(sys.path[0] + "/../datas/images/路由器.png").resize((60, 60)))
- self.img_tm = ImageTk.PhotoImage(
- Image.open(sys.path[0] + "/../datas/images/路由器_tm.png").resize((60, 60)))
def set_default_router_table(self):
"""
@@ -565,7 +586,9 @@ class SimRouter(SimBase):
if conn == packet.up_jump:
continue
ifs = self.connections.index(conn) + 1
- for network in self.router_table[ifs]:
+ if self.router_table.get(ifs) is None:
+ continue
+ for network in self.router_table.get(ifs):
if self.check_destination_ip(packet.destination_ip, network):
flag = True
next_hop_ifs = ifs
@@ -628,10 +651,6 @@ class SimSwitch(SimBase):
self.ObjLabel = label if label is not None else self.set_default_name()
self.mac_table = {}
self.set_default_mac_table()
- self.img = ImageTk.PhotoImage(
- Image.open(sys.path[0] + "/../datas/images/交换机.png").resize((60, 60)))
- self.img_tm = ImageTk.PhotoImage(
- Image.open(sys.path[0] + "/../datas/images/交换机_tm.png").resize((60, 60)))
def set_default_mac_table(self):
"""
@@ -721,10 +740,6 @@ class SimHub(SimBase):
super().__init__(canvas, x, y, self.ObjID, config, label)
self.ObjType = 4
self.ObjLabel = label if label is not None else self.set_default_name()
- self.img = ImageTk.PhotoImage(
- Image.open(sys.path[0] + "/../datas/images/集线器.png").resize((60, 60)))
- self.img_tm = ImageTk.PhotoImage(
- Image.open(sys.path[0] + "/../datas/images/集线器_tm.png").resize((60, 60)))
def transmit(self, packet: SimPacket):
"""
diff --git a/NetworkAnalog/network.db b/NetworkAnalog/network.db
index e8b53b7..68a2411 100644
Binary files a/NetworkAnalog/network.db and b/NetworkAnalog/network.db differ
diff --git a/NetworkAnalog/x1/SimObjs.py b/NetworkAnalog/x1/SimObjs.py
deleted file mode 100644
index 8a5cbc2..0000000
--- a/NetworkAnalog/x1/SimObjs.py
+++ /dev/null
@@ -1,63 +0,0 @@
-class AllSimConnect():
- # todo: 连接类
- def __init__(self, nodex, nodex_ifs, nodey, nodey_ifs, config=None):
- """
- 连接对象
- :param nodex: 节点
- :param nodex_ifs: 节点接口
- :param nodey: 节点
- :param nodey_ifs: 节点接口
- """
- self.ConfigCorrect = 0 if config is None else config
- self.NobjS = nodex
- self.NobjE = nodey
- self.IfsS = nodex_ifs
- self.IfsE = nodey_ifs
-
-class SimHost():
- """
- 主机类
- """
- def __init__(self, x=0, y=0, id=None, config=None, label=None):
- self.ObjID = id
- self.ObjType = 1
- self.ObjLabel = label
- self.interface = []
- self.connections = []
-
-class SimRouter():
- """
- 路由类
- """
- def __init__(self, x=0, y=0, id=None, config=None, label=None, *args):
- self.ObjID = id
- self.ObjType = 2
- self.ObjLabel = label
- self.router_table = {}
-
-class SimSwitch():
- """
- 交换机类
- """
- def __init__(self, x=0, y=0, id=None, config=None, label=None, *args):
- self.ObjID = id
- self.ObjType = 3
- self.ObjLabel = label
- self.mac_table = {}
-
-class SimHub():
- """
- 集线器类
- """
- def __init__(self, x=0, y=0, id=None, config=None, label=None, *args):
- self.ObjID = str() if id is None else id
- self.ObjType = 4
- self.ObjLabel = label
-
-if __name__ == '__main__':
- AllSimObj = []
- host1 = SimHost()
- AllSimObj.append(host1)
- router = SimRouter()
- AllSimObj.append(router)
- connect = AllSimConnect(host1, 1, router, 1)
diff --git a/NetworkAnalog/x2_test.py b/NetworkAnalog/x2_test.py
new file mode 100644
index 0000000..978c0c5
--- /dev/null
+++ b/NetworkAnalog/x2_test.py
@@ -0,0 +1,33 @@
+from NetworkAnalog import NetWorkAnalog
+from SimObjs import *
+
+
+
+if __name__ == '__main__':
+ AllSimObj = {}
+ root = Window()
+ root.title('网络拓扑图')
+ root_attr = {
+ "width": root.winfo_screenwidth() * 0.83,
+ "height": root.winfo_screenheight() * 0.85,
+ }
+ size = '%dx%d+%d+%d' % (root_attr['width'], root_attr['height'], (root.winfo_screenwidth() - root_attr['width']) / 2,
+ (root.winfo_screenheight() - root_attr['height']) / 2 - 30)
+ canvas = NetWorkAnalog(root, width=root_attr['width'], heigh=root_attr['height'], bg="white")
+ canvas.place(x=0, y=0, anchor='nw')
+ root.geometry(size)
+ host1 = SimHost(canvas, 406, 268)
+ AllSimObj[host1.ObjID] = host1
+ host2 = SimHost(canvas, 323, 285)
+ AllSimObj[host2.ObjID] = host2
+ router = SimRouter(canvas, 216, 263)
+ AllSimObj[router.ObjID] = router
+ host1_router_connect = AllSimConnect(canvas, host1, 1, router, 1)
+ host2_router_connect = AllSimConnect(canvas, host2, 1, router, 2)
+ host1.connections[0] = host1_router_connect
+ router.connections[0] = host1_router_connect
+ host2.connections[0] = host2_router_connect
+ router.connections[1] = host2_router_connect
+ conns = [host1_router_connect, host2_router_connect]
+ canvas.show_obj(AllSimObj, conns)
+ root.mainloop()
\ No newline at end of file
diff --git a/datas/network.db b/datas/network.db
new file mode 100644
index 0000000..f4128ed
Binary files /dev/null and b/datas/network.db differ