我正在关注: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/