【问题标题】:python socket communication for XML-messagesXML消息的python套接字通信
【发布时间】:2013-12-06 19:19:37
【问题描述】:

设置:我有一个服务器,应该能够发送和接收 XML 数据。客户端连接到套接字并首先从服务器接收 XML。然后客户端应该能够修改 XML 并将其发送回服务器。

XML 文件(在本例中)保存为简单字符串(因此无论是字符串还是 XML)。

到目前为止我有什么:

def startServer(port,xml_data):
    print "Starting server, listing to port %d" % port
    s = socket(AF_INET, SOCK_STREAM)
    s.bind(("", port))
    s.listen(5)

    while True:
        client, address = s.accept()
        print "Accepted connection from remote client at " + str(address)

        client.send(xml_data)

        client.close()

    s.close()

所以当客户端连接到服务器时,xml_data 被发送到客户端,然后连接被关闭。但这不是我想要的:我想在客户端修改 XML(或字符串),然后将其发回或从服务器再次检索。我认为一个解决方案是在发送方法之前放置一个“data = client.recv(1024)”并将所有内容放在一个循环中。然后我会确定一些关键字(例如send$、get$),这些关键字将在客户端消息中发送并在服务器上用于决定要做什么。

应该是这样的(不确定语法是否有效):

def startServer(port,xml_data):
    print "Starting server, listing to port %d" % port
    s = socket(AF_INET, SOCK_STREAM)
    s.bind(("", port))
    s.listen(5)

    while True:
        client, address = s.accept()
        print "Accepted connection from remote client at " + str(address)

        client.send(xml_data) #first time, XML gets sent

        while True:

            data = client.recv(1024)

            keyword = data.split("$",1)[0] #split only first "$"
            if keyword == "get": #client wants to get data
                client.send(xml_data)
            elif keyword == "send" #client wants to send data
                received_data =  data.split("$",1)[1]
                #received_data can be used for further processing
            else:
                break

        client.close()

    s.close()

因此,如果我有一个 XML(作为字符串)并且客户端想要将其发送到服务器,我将在消息的开头插入密钥,例如发送$

最后,我的问题是:这是一个好的方法,还是你会推荐一些不同的方法?

【问题讨论】:

  • 为了对我们需要大局的方法发表意见,谁是这个的用户(客户)?他们将如何编辑 XML 并将其发回?
  • 好的!带有服务器的系统是一个嵌入式系统。我尝试使用 XML 远程编辑配置。作为第一步,客户端只能在一个窗口中显示加载的 XML,并且用户可以编辑这个窗口内容(还不是用户友好的)。但问题是,XML 内容是作为一个简单的字符串处理的。连接不需要处理多个连接,只需一个Client即可连接。

标签: python sockets communication


【解决方案1】:

您的拆分可能是分区...

此外,TCP 套接字保留将您的发送和接收拆分或聚合为更多或更少发送和接收的权利(它们很少这样做,但它们可以!)。这可能是在高负载或长网络路径下的网络上难以发现的错误的来源。为了解决这个问题,重要的是循环发送和接收,或者使用类似http://stromberg.dnsalias.org/~strombrg/bufsock.html

除此之外,我还没有运行你的代码,你的方法看起来不错。

【讨论】:

    【解决方案2】:

    如果可能的话,而不是这个低级套接字尝试使用basic http server,这将为您提供更好的请求支持,例如标准 http get 和 http post 请求(您称为 get 和 send)以及对请求标头的访问等.

    使用 http get/post 还将消除当前破坏 xml 结构的连接。

    然后你会得到类似的东西:

    class MyHttpHandler(BaseHTTPRequestHandler):
        def do_GET(self):
            ...
    
        def do_POST(self):
            ...
    

    【讨论】:

    • 因为它是一个带有固有网络服务器的嵌入式系统(我不能使用或停用它)我认为当我使用另一个网络服务器时会出现问题?!
    • 如果是这种情况,我猜你可以将它添加到当前的 http 服务器或在另一个端口上运行它...
    • 好的,我尝试使用基本的 http 服务器(使用本教程:pymotw.com/2/BaseHTTPServer)但我没有找到任何方法将 do_GET 方法中的静态消息更改为动态变量使用全局变量。你知道如何在这里访问变量吗?
    • 动态变量从何而来?在您的代码中,我看到您返回了一个预定义的 xml 字符串,如果是这种情况,您可以从如下文件中读取 xml:self.wfile.write(f.read())
    猜你喜欢
    • 2016-10-13
    • 2011-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多