1

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

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

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

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

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

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

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

1 回答 1

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"then "msg:hello",但你会看到,比如说,"ia", then "m:abarnertmsg:h",然后"ello"

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

这就是为什么 Twisted 提供了一堆稍高级别的协议来做,例如,换行符,或网络字符串,或任何你想要的。但是,如果您只使用最低级别的原始互联网协议,您必须自己处理缓冲和定界以及所有这些事情。你不想这样做。

于 2013-04-02T19:55:35.510 回答