python - 从 iOS 切换 python bool 值

标签 python ios objective-c

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

我让这些东西工作得很好,作为一个完全的菜鸟,我无法在我的生活中弄清楚如何将 Python bool 值添加到教程中提到的“chatserver.py”文档,粘贴在下面。

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

喜欢, 切换 bool 值的按钮(如何发送切换消息)以及如何询问服务器 bool 值的状态是什么

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

这是当前服务器:( super 复杂,哇哦!)

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()

最佳答案

首先,您必须决定您是在谈论每个连接的单独 bool 值,还是每个人的共享值,或介于两者之间的值(例如,每个用户都有一个单独的值,一旦他们使用 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",然后是 "ello"

最糟糕的是,当您在一台计算机上或在某些类型的 LAN 上测试这一切时,它实际上似乎有效——一侧的每个发送都被接收为一个在另一边接收。但是一旦你把它放到网上,它就会彻底失败。

这就是为什么 Twisted 带有一堆稍微高级的协议(protocol)来做,例如,换行符分隔,或 netstrings,或任何你想要的。但是如果你只是使用最低级别的原始互联网协议(protocol),你必须自己处理缓冲和定界以及所有这些事情。你不想做的。

关于python - 从 iOS 切换 python bool 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15773013/

相关文章:

python - 为什么在 python 中使用 sorted 函数进行多级排序会得到错误的答案?

iphone - MPMoviePlayerViewController 在后台运行并使用远程控制

ios - 为什么我的 MKCoordinateRegion 为零?

python - 按字母顺序查找最长的子串。我的代码有什么问题

python - wordnet中如何判断多词A是B?

ios - 从 NSString 获取一个子串直到到达一个特定的词

php - NSString 将表情符号转换为 HTML 实体

ios - 工具栏应该位于 View 上方

python - ndimage 的 center_of_mass 用于计算高斯峰的位置

iphone - 在调用 respondsToSelector 之前检查委托(delegate)是否仍然存在