我正在关注此事: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()
答案 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协议,则必须自行处理缓冲和分隔以及所有这些事情。你不想做的事。