我正在寻找一种更好的方法来调用tcpclient中带或不带参数的函数。似乎没有固定的方式。
我现在在做什么。
从客户端我发送一个字符串,如:
server#broadcast#helloworld
并从服务器:
commands = []
data = self.request.recv(BUFF)
commands = data.split('#')
if commands[0] == 'server':
if commands[1] == 'stop':
serverStop()
if commands[1] == 'broadcast':
sendtoall(commands[2])
if commands[0] == 'application':
if commands[1] == 'doStuff':
doStuff(commands[2], commands[3])
从客户端a发送一个带有命令#sub-command#parm#parm的字符串,然后在服务器端将其拆分并调用该函数。 这种方式有效,但调用函数和错误检查将变得非常快。
我想在服务器端继续进行错误检查。它应该使用带或不带参数的函数,以及任何数量的参数。
如果您有更好的方式从客户端呼叫功能,请分享。 谢谢你的阅读。
答案 0 :(得分:1)
您应该根据您想要完成的任务以及您的网络协议的外观来不同地构建您的程序。我假设你在这个例子中使用自定义无状态协议。
commands = []
data = self.request.recv(BUFF)
commands = data.split('#')
process_commands(commands)
def process_commands(commands):
"""
Determines if this is a server or application command.
"""
if commands[0] == 'server':
process_server_command(commands[1:])
if commands[0] == 'application':
process_application_command(commands[1:])
def process_server_command(commands):
"""
because I truncated the last list and removed it's 0 element we're
starting at the 0 position again in this function.
"""
if commands[0] == 'stop':
serverStop()
if commands[0] == 'broadcast':
sendtoall(commands[1])
def process_application_command(commands)
if commands[0] == 'doStuff':
doStuff(commands[1], commands[2])
此结构删除嵌套的if语句,并使您更容易查看代码的控制路径。它还可以更轻松地添加try
except
块(如果您使用直插槽,则需要使用它)。
答案 1 :(得分:0)
为什么不使用RPC协议?在这种情况下,您不需要解析字符串。
这是服务器
from SimpleXMLRPCServer import SimpleXMLRPCServer
def add(a, b):
return a+b
server = SimpleXMLRPCServer(("localhost", 1234))
print "Listening on port 1234..."
server.register_function(add, "add")
server.serve_forever()
和客户
import xmlrpclib
print 'start'
proxy = xmlrpclib.ServerProxy("http://localhost:1234/")
print "3 + 4 is: %s" % str(proxy.add(3, 4))