用于XML消息的python套接字通信

时间:2013-12-06 19:19:38

标签: python sockets communication

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

XML文件(在本例中)保存为一个简单的字符串(因此无论它是String还是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(或String)并将其发回或从服务器再次检索它。我认为解决方案是在send-method之前放置一个“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(作为字符串)并且客户端想要将其发送到服务器,我会在消息的开头插入密钥,例如送$

最后,我的问题:这是一个很好的方法,或者你会推荐一些不同的东西吗?

2 个答案:

答案 0 :(得分:1)

你的分裂可能是分区......

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

这样的东西

除此之外,我还没有运行你的代码,你的方法看似合理。

答案 1 :(得分:1)

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

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

然后你会有一些事情:

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

    def do_POST(self):
        ...