2014-09-10 1 views
2

나는 한동안 twisted 프레임 워크를 사용하여 서버에서 클라이언트로 파일을 전송하는 방법을 찾고 있었지만 유용한 것은 없습니다.트위스트 프레임 워크를 사용하여 클라이언트에게 파일을 보냅니다.

난 그냥 사용자에 대한 이미지를 보내려면 내 경우

, 그것은 채팅 응용 프로그램 있고 난 이미지 [내가 서버가 어디에]

다음

무엇을이다 또는 내가 노력하고 있어요] 로컬에 저장하고 나는했다 :

from twisted.internet import reactor 
from twisted.internet.protocol import Factory , Protocol 
class IphoneChat(Protocol): 
     def connectionMade(self): 
      self.factory.clients.append(self) 
     def connectionLost(self , reason): 
      self.factory.clients.remove(self) 
     def dataReceived(self,data): 
      a = data.split(':') 
      contor = 0 
      command = a[0] 
      content = a[1] 
      if command == "saveimage": 
       personName = a[1] 
       contentData = a[2] 
       escape = a[3] 
       location = "person-images/"+str(personName)+".jpg" 
       try: 
        f = open (location,'w+') 
        f.write(contentData) 
       except : 
        self.transport.write("error when opening the file") 
      elif command == "getimage" : 
       picture = a[1] 
       extra = a[2] 
       location = "person-images/"+picture+".png" 
       try: 
        self.transport.write("image:") 
        for bytes in read_bytes_from_file(location) : 
         self.transport.write(bytes) 
        self.transport.write('\r\n') 
       except : 
        self.transport.write('no such file\r\n') 

factory = Factory() 
factory.protocol=IphoneChat 
factory.clients = [] 
reactor.listenTCP(8023,factory) 
print "IPhone Chat server started" 
reactor.run() 

그러나 클라이언트 [iOS 응용 프로그램]에서 이상한 동작이 나타나고 동작이 작동하지 않는다는 것입니다. iosApp에서

뭔가 :

      var binaryData: NSData 
          let string : NSString = output.componentsSeparatedByString(":")[0] as NSString 
          binaryData = string.dataUsingEncoding(NSUTF8StringEncoding)! 

          var data = UIImage(data: binaryData) 
          self.personImage.image = data 
          self.personImage.hidden = true 

는 서버 측 또는 클라이언트의 문제인가?

+1

* 또한 작동하지 않습니다 *를 정의하고 이미지를 검색/표시하기 위해 iOS 앱에 사용 된 코드를 포함하십시오. –

+0

좋아. 잠깐. 첫 코멘트에 무슨 말을했는지 보여 줄 수 있니? – tudoricc

+0

신경 쓰지 마라, 나는 당신이 HTTP 서버를 구현하고 있다고 생각했지만, 당신이 자신의 프로토콜을 사용하고있는 것처럼 보였으므로 나의 첫 코멘트는 부적절하다. –

답변

4
한 심각한 오류를 즉시 발견 할 수

, 그러나 나는 그게 "작동하지"만드는 유일한 방법인지 말할 수 없다 : 코드는 한쪽 끝이 transport.write(x)을 수행 할 때 다음 다른 쪽 끝은 dataReceived(self, x)x이되는 호출했다고 것으로 예상이 똑같다. 이것은 일반적으로 TCP의 경우는 아닙니다. TCP는 바이트 스트림을 제공하며 스트림 분할 방식을 제어 할 수 없습니다. Twisted FAQ을 참조하십시오. 예를 들어, 한쪽 끝이 transport.write('foobar') 인 경우 다른 쪽 끝은 두 번째 호출 즉, dataReceived('foob')dataReceived('ar') 바로 뒤에있을 수 있습니다.

당신이해야 할 일은 TCP 스트림을 통해 메시지를 전달하기위한 적절한 프로토콜을 구현하는 것입니다. 그러나, 자신 만의 롤링을하지 말고, Twisted에 포함 된 몇 가지를 선택하거나, 웹 소켓과 같이 명확하게 다른 프로토콜을 선택하는 것이 좋습니다.

메시지를 바이트 스트림으로 구분하는 전략 인 '\r\n'으로 끝나는 것처럼 보이지만 완전한 메시지를 수집하려면 수신자에서 버퍼링을 수행해야합니다. 이것이 Twisted에 포함 된 LineReceiver 프로토콜입니다. 그러나 read_bytes_from_file() 함수가 이름에서 알 수 있듯이 바이트를 반환하면 이미지 데이터에 바이트가 포함 된 경우 프로토콜이 깨집니다. '\r\n'

일반적인 개발 조언 : 트위스트 서버 및 iPhone 클라이언트와 함께 전체 구현을 함께 사용하지 마십시오. 시작하고 나서 작동하지 않는다는 것을 알게됩니다. 아마도 클라이언트와 서버 모두에 몇 가지 더 많은 오류가있을 수 있지만 예상대로입니다. 동일한 컴퓨터에서 쉽게 테스트 할 수있는 코드를 작성하십시오. 따라서 간단한 테스트 클라이언트를 작성하여 서버에서 실행하십시오. 디버그 인쇄 또는 로깅을 추가하여 무슨 일이 일어나고 있는지 확인하십시오. 예를 들어 dataReceived(x)이 호출되면 인쇄하십시오.

관련 문제