设置:我有一台服务器,应该能够发送和接收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(作为字符串)并且客户端想要将其发送到服务器,我会在消息的开头插入密钥,例如送$
最后,我的问题:这是一个很好的方法,或者你会推荐一些不同的东西吗?
答案 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):
...