从iOS切换一个python布尔值

时间:2013-04-02 19:45:28

标签: python ios objective-c

我正在关注此事:http://www.raywenderlich.com/3932/how-to-create-a-socket-based-iphone-app-and-server教程。

我觉得这个东西运行得很好,并且在这个问题上我是一个完全的noob,我不能为我的生活找到如何在教程中提到的'chatserver.py'文档中添加一个Python布尔值,粘贴在下面。

我不仅要添加一个,而且还要通过按钮从iPhone应用程序切换它,然后请求从服务器返回它。

像,  一个切换布尔值的按钮(如何发送切换消息)以及如何询问服务器布尔值的状态是什么

对这个非常开放的问题道歉。

这是当前的服务器:( Uber-complex,wohoo!)

from twisted.internet.protocol import Protocol, Factory
from twisted.internet import reactor


class IphoneChat(Protocol):
def connectionMade(self):
    #self.transport.write("""connected""")
    self.factory.clients.append(self)
    print "clients are ", self.factory.clients

def connectionLost(self, reason):
    self.factory.clients.remove(self)

def dataReceived(self, data):
    #print "data is ", data
    a = data.split(':')
    if len(a) > 1:
        command = a[0]
        content = a[1]

        msg = ""
        if command == "iam":
            self.name = content
            msg = self.name + " has joined"

        elif command == "msg":
            msg = self.name + ": " + content

        print msg

        for c in self.factory.clients:
            c.message(msg)

def message(self, message):
    self.transport.write(message + '\n')


factory = Factory()
factory.protocol = IphoneChat
factory.clients = []

reactor.listenTCP(80, factory)
print "Iphone Chat server started"
reactor.run()

1 个答案:

答案 0 :(得分:1)

首先,你必须决定你是在谈论每个连接的单独布尔值,还是每个人的共享值,或者介于两者之间的东西(例如,每个用户都有一个单独的布尔值) ,一旦用iam登录就可用。

我将按连接进行,我将把它作为Protocol实例属性存储。您可以通过将其存储为模块全局或Protocol类属性等来使其全局共享。如果您想要更加花哨的东西,您将需要全局/类/等。某种映射。

def connectionMade(self):
    #self.transport.write("""connected""")
    self.factory.clients.append(self)
    print "clients are ", self.factory.clients
    self.boolean_flag = False

def dataReceived(self, data):
    ...
    if command == "iam":
        self.name = content
        msg = self.name + " has joined"
    elif command = "set":
        self.boolean_flag = True
        msg = self.name + " has set his flag"
    elif command = "clear":
        self.boolean_flag = False
        msg = self.name + " has cleared his flag"
    elif command = "get":
        self.message("Your flag is {}\n".format(self.boolean_flag))
        msg = self.name + " has checked his flag"
    ...

这就是它的全部内容。


但是,值得注意的是,您的代码首先根本不起作用。

您已创建通用internet.protocol。这意味着只要有一些字节进入就会调用dataReceived。这些字节可能是消息的一半,也可能是消息的一半。所以,我可能会向您发送"iam:abarnert"然后"msg:hello",但您会看到"ia",然后是"m:abarnertmsg:h",然后是{{1} }。

最糟糕的是,当你在一台计算机或某些类型的局域网上测试这一切时,它实际上似乎工作 - 一方的每个发送都是在另一边收到。但是一旦你把它放在互联网上,它就会彻底失败。

这就是为什么Twisted带有一堆稍高级别的协议,例如换行符分隔,或者是netstrings,或者你想要的任何其他协议。但是,如果您只使用最低级别的原始Internet协议,则必须自行处理缓冲和分隔以及所有这些事情。你不想做的事。