2013-04-02 3 views
1

다음 내용을 따르고 있습니다 : http://www.raywenderlich.com/3932/how-to-create-a-socket-based-iphone-app-and-server 튜토리얼.iOS에서 python boolean을 토글하십시오.

나는이 물건을 멋지게 먹었고, 이것에서 총 멍청한 놈이되었다. 나는 내 인생에서, 아래에 붙여 넣은 튜토리얼에서 언급 한 'chatserver.py'문서에 파이썬 부울을 추가하는 방법을 알 수 없다. .

버튼을 추가하여 iPhone 앱에서 토글하고 서버에서 다시 알리려고 요청할뿐만 아니라 iPhone을 추가하고 싶습니다.

처럼, 버튼이 (어떻게 토글 메시지를 보내려면) 어떻게 부울의 상태가 바로이 의문에 대한

사과 무엇 서버를 요청하는 부울을 전환합니다. 여기

현재 서버입니다 (! 동네 짱 - 복잡, 여행 애호가)

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

각 연결마다 별도의 부울 값을 찾고 있습니까 (예 : 'iam' 명령의'name'과 같이 더 큰 방법으로 정의 된)? 또는 모든 사용자가 공유하는 각 클라이언트에 대해 하나씩 부울 값을 찾고 있습니까? – abarnert

+3

또한이 질문의 어떤 부분은 채팅 프로토콜의 이름이 'IphoneChat'인 것을 제외하고는 IOS 또는 ObjC와 관련이 있습니까? – abarnert

+0

@abarnert 내가하고있는 튜토리얼은 iPhone 용이라고 –

답변

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", 그리고 "ello"으로 볼 수 있습니다.

최악의 경우 하나의 컴퓨터 또는 특정 유형의 LAN에서이 모든 것을 테스트 할 때 실제로는 인 것처럼 보입니다. 한 쪽에서 보내는 각각의 수신은 정확히 하나의 수신으로 수신됩니다. 측면. 그러나 인터넷에 연결하자마자 완전히 실패 할 것입니다.

Twisted에는 줄 바꿈 구분 또는 넷 스트링 또는 기타 원하는 것보다 약간 높은 수준의 프로토콜이 있습니다. 그러나 가장 낮은 수준의 원시 인터넷 프로토콜 만 사용한다면 버퍼링과 구분을 처리하고 모든 것을 직접 처리해야합니다. 당신은하고 싶지 않습니다.

+0

죄송합니다. 유형을 지정해야한다는 것을 알고 있습니다. 자습서의 일하는 부울 그냥 무작위로, 토글. 그래서 그것은 채팅으로 토글 될 수있는 한 팬케이크 (pancake)라는 것이 진실하거나 틀린 것일 수도 있습니다. 위의 코드는 여전히 그 작업을 수행합니까? –

+0

그리고 그 꼬인 물건에 대해서, 나는이 물건을 배우고 놀고있는 중이다. 그래서 그것은 LAN 외부로 빠져 나가지 않을 것이다. 당신이 말하는 것은 무엇이든간에 매우 복잡해 보입니다. –

+0

부울을 호출하는 것이 중요하지 않음은 분명합니다. 'boolean_flag' 대신에'pancake'를 호출하고 싶다면 모든 곳에서 이름을 바꾸면됩니다. 'toggle' 명령을 추가하고 싶다면, 단지'self.boolean_flag = not self.boolean_flag' 명령을 내리면됩니다. 무작위 값으로 시작하려면'False' 대신'self.boolean_flag = random.choice ((False, True))'를 사용하십시오. 등등. 그것은 단지 일반적인 변수 일뿐입니다. – abarnert

관련 문제