UDP服务器在python中解析JSON对象的数据结构

亚历山大

我有一台UDP服务器,侦听线程中的传入流量。消息来自JSON格式的外部设备,例如{“ _id”:“ 0x00”,“ status”:“ on”}。此信息需要由UDP处理程序进行解析,并存储在对象的字典中(如果存在_id,则更新)。目前,我可以接收和解析JSON,但不能完全确定如何存储此数据或正确处理它。我想在UDP处理程序中使用一个队列,并在一个单独的Msg处理程序中使用该队列来处理该队列,但不确定这样做是否正确。

请注意:我重写了代码,省略了一些语法等。

# I create a node server thread in the main of my program with IP/PORT

class NodeServer(threading.Thread):
    def __init__():
        self.server = UDPServer((address, port), UDPHandler)

    def run():
        self.server.serve_forever()

class UDPServer(socketserver.ThreadingUDPServer):
    allow_reuse_address = True

class UDPHandler(socketserver.BaseRequestHandler):
    data_q = queue.Queue()

    handler = NodeHandler(data_q)
    handler.start()

    def handle():
        try:
            # receive the message from client
            data = self.request[0].decode("UTF-8")

            # check if it's in json format

            # HANDLE THE MESSAGE
            self.data_q.put(data)

            # stop the thread
            self.handler.join()
            # send an "ACK" msg back to the client
      except: Exception as e:
            #handle

class NodeHandler(threading.Thread):
    table = NodeTable()

    def __init(data_q):
        self.data_q = data_q

    def handle():
      # get the string message from the queue (filled by the UDPHandler)
      msg = self.data_q.get()

      # check if the "_id" field exists in the current node table

      # if it exists in the table, find it, update the fields from json

      # otherwise, if it's a new "_id": create a new node
      json_msg = json.parse(msg)
      node = Node(json_msg["_id"])
      # set other node parameters from the json object, status etc

      # update the node table with the new information from the message
      table.put(nd)
      #
    def join():
        # join thread

class NodeTable():
  # the table is a dictionary with ID and a Node object, ie {0x01: Node}
  table = {}
  def put(_id, node):
      self.table[_id] = node

  def get(_id):
      return self.table[_id]

class Node():
    id = 0
    def __init__(id):
        self.id = id
        # new node
    # other node functions
  • 应该在UDP处理程序中将NodeHandler作为单独的线程还是仅作为处理程序对象创建?
  • 节点表是否需要是全局的(如果不是),如何在服务器外部进行访问?也许只是将其作为对象传递。
  • NodeTable是用于保存唯一节点对象的良好数据结构,还是有更好的方法?

谢谢!

埃里克

1)您可以实现UDP服务器,该服务器使用以下代码行更简单地处理无限循环中的传入消息:

 import socket

 def udp_server(udp_ip, udp_port, ...):
   sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
   sock.bind((upd_ip, upd_port))
   while True:
     data, addr = sock.recvfrom(1024) # buffer size is 1024 bytes
     ...process data...

有关更多详细信息和讨论,请参见https://wiki.python.org/moin/UdpCommunication

参数udp_server是udp IP和端口,以及服务器需要与之交互的任何其他数据结构。

将其启动到自己的线程中很容易完成:

 import threading

 t = threading.Thread(target = udp_server, args = (...))
 t.start()

2)NodeTable类只是python字典的包装,但是似乎您想让多个线程同时访问它。在这种情况下,您应该阅读以下SO答案:(link)

根据服务器线程以外的其他线程可以对节点字典执行的操作,您可能需要锁定,也可能不需要锁定。

总而言之,我在哪里编写代码:

 def main():
   nodes = {}     # use a simple dict for storing the nodes
   lock = RLock() # if you need this
   # pass nodes and lock to server thread and start it
   t = threading.Thread(target = udp_server, args = (udp_ip, udp_port, nodes, lock))
   t.start() 
   ...

此时,udp服务器正在运行,主线程可以通过变量访问节点表nodes

将新节点添加到节点表后,是否需要通知主线程?然后,也许队列就是您想要的。您将1)在其中创建它,main()然后2)将其传递给udp_server

 def main()
   nodes = {}     # use a simple dict for storing the nodes
   lock = RLock() # if you need this
   q = Queue()    # create a Queue and pass it to the udp server
   # pass nodes and lock to server thread and start it
   t = threading.Thread(target = udp_server, args = (udp_ip, udp_port, nodes, lock, q))
   t.start() 
   # process entries from the Queue
   while True:
     item = q.get()
     ... process item...

并在udp服务器函数...process data...中将某些内容放入队列:

   while True:
     data, addr = sock.recvfrom(1024) # buffer size is 1024 bytes
     ...json decode, etc. ...
     q.put(...) 

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

无法解析服务器中的JSON数据

来自分类Dev

无法解析服务器中的JSON数据

来自分类Dev

从远程服务器解析JSON数据

来自分类Dev

如何在客户端和服务器上与Polymer共享数据结构

来自分类Dev

select2从服务器期望什么数据结构,应该如何处理?

来自分类Dev

避免多线程UDP服务器中的数据丢失

来自分类Dev

启动节点服务器时解析json对象

来自分类Dev

当我尝试测试对希望使用带有字符串索引的数组的基于PHP的服务器的请求时,应该使用Java或Python中的哪种数据结构?

来自分类Dev

使用地图数据从服务器解析 JSON

来自分类Dev

如何将多个json对象的数据发送到android中的服务器?

来自分类Dev

如何将多个json对象的数据发送到android中的服务器?

来自分类Dev

使用C中的UDP套接字将结构从客户端传递到服务器

来自分类Dev

使用$ resourse解析服务器中的数据

来自分类Dev

在Python中删除树(数据结构)

来自分类Dev

Python中的高维数据结构

来自分类Dev

在python中构建FIFO数据结构

来自分类Dev

Python中递归数据结构的好处?

来自分类Dev

python中的事件列表数据结构

来自分类Dev

在Python中搜索复杂的数据结构

来自分类Dev

在Python中传递大型数据结构

来自分类Dev

设计数据结构以返回最近1分钟与Web服务器的连接数

来自分类Dev

重用UDP服务器中的流

来自分类Dev

Java中的UDP服务器

来自分类Dev

将JSON数组解析为数据结构

来自分类Dev

如何解析嵌套的JSON数据结构

来自分类Dev

如何解析嵌套的JSON数据结构

来自分类Dev

无法从 Swift 中的 Realm 对象服务器获取数据

来自分类Dev

解析服务器:无法查询对象

来自分类Dev

如何在Laravel 5.2中的数据表服务器端处理中访问json对象/数据?

Related 相关文章

  1. 1

    无法解析服务器中的JSON数据

  2. 2

    无法解析服务器中的JSON数据

  3. 3

    从远程服务器解析JSON数据

  4. 4

    如何在客户端和服务器上与Polymer共享数据结构

  5. 5

    select2从服务器期望什么数据结构,应该如何处理?

  6. 6

    避免多线程UDP服务器中的数据丢失

  7. 7

    启动节点服务器时解析json对象

  8. 8

    当我尝试测试对希望使用带有字符串索引的数组的基于PHP的服务器的请求时,应该使用Java或Python中的哪种数据结构?

  9. 9

    使用地图数据从服务器解析 JSON

  10. 10

    如何将多个json对象的数据发送到android中的服务器?

  11. 11

    如何将多个json对象的数据发送到android中的服务器?

  12. 12

    使用C中的UDP套接字将结构从客户端传递到服务器

  13. 13

    使用$ resourse解析服务器中的数据

  14. 14

    在Python中删除树(数据结构)

  15. 15

    Python中的高维数据结构

  16. 16

    在python中构建FIFO数据结构

  17. 17

    Python中递归数据结构的好处?

  18. 18

    python中的事件列表数据结构

  19. 19

    在Python中搜索复杂的数据结构

  20. 20

    在Python中传递大型数据结构

  21. 21

    设计数据结构以返回最近1分钟与Web服务器的连接数

  22. 22

    重用UDP服务器中的流

  23. 23

    Java中的UDP服务器

  24. 24

    将JSON数组解析为数据结构

  25. 25

    如何解析嵌套的JSON数据结构

  26. 26

    如何解析嵌套的JSON数据结构

  27. 27

    无法从 Swift 中的 Realm 对象服务器获取数据

  28. 28

    解析服务器:无法查询对象

  29. 29

    如何在Laravel 5.2中的数据表服务器端处理中访问json对象/数据?

热门标签

归档